第16章 リソース

目次

ファイルテンプレートリソース
$template_dir からテンプレートを取得する
特定の $template_dir からテンプレートを取得する
任意の場所からテンプレートを取得する
Windows のファイルパスについて
String Template Resources
Stream Template Resources
テンプレートリソースの継承
カスタムテンプレートリソース

テンプレートは、いろいろなソースから成り立っています。 テンプレートを display() したり fetch() したりするとき、 あるいは別のテンプレートをインクルードしたりするときには、 まずリソースの型を指定してからパスやテンプレート名を続けます。 リソースの型を明示しない場合は、 $default_resource_type の値 (default: "file") であるとみなします。

ファイルテンプレートリソース

Smarty はファイルシステム用のテンプレートリソースを組み込みで備えています。 file: リソースがSmartyのデフォルトのリソースです。 $default_resource_type が変更された場合、file: リソースキーを明示的につけなければなりません。

要求したテンプレートをファイルリソースが見つけられない場合、$default_template_handler_func が呼び出されます。

注意

Smarty 3.1 では、 $use_include_path を有効にしない限り、include_path を走査しなくなりました。

$template_dir からテンプレートを取得する

ファイルリソースは $template_dir で設定したディレクトリからテンプレートのソースファイルを取得します。 ディレクトリのリストは配列に現れた順に走査され、見つかった最初のテンプレートが処理されます。

例 16.1. $template_dir からテンプレートを取得する例


<?php
$smarty->display('index.tpl');
$smarty->display('file:index.tpl'); // 上に同じ
?>

   

テンプレートの中でテンプレートファイルを取得する例


{include file='index.tpl'}
{include file='file:index.tpl'} {* 上に同じ *}

   

特定の $template_dir からテンプレートを取得する

Smarty 3.1 から、 $template_dir で指定した要素をブラケットで指定できる機能が追加されました。 これによって、複数のテンプレートセットを持つWebサイトが、どのテンプレートにアクセスするかをよりうまく制御できるようになります。

file: リソースタイプを指定する場所ではどこでも、このブラケット指定は使えます。

例 16.2. $template_dir の特定の要素を指定する例


<?php

// テンプレートディレクトリをセットアップ
$smarty->setTemplateDir(array(
    './templates',            // element: 0, index: 0
    './templates_2',          // element: 1, index: 1
    '10' => 'templates_10',   // element: 2, index: '10'
    'foo' => 'templates_foo', // element: 3, index: 'foo'
));

/*
  テンプレートの構造は以下とする
  ./templates/foo.tpl
  ./templates_2/foo.tpl
  ./templates_2/bar.tpl
  ./templates_10/foo.tpl
  ./templates_10/bar.tpl
  ./templates_foo/foo.tpl
*/

// 通常のアクセス方法
$smarty->display('file:foo.tpl'); 
// ./templates/foo.tpl が読み込まれます。

// 数値インデックスを使う方法
$smarty->display('file:[1]foo.tpl'); 
// ./templates_2/foo.tpl が読み込まれます。

// 数値のインデックスを指定する方法
$smarty->display('file:[10]foo.tpl'); 
// ./templates_10/foo.tpl が読み込まれます。

// 文字列でインデックスを指定する方法
$smarty->display('file:[foo]foo.tpl'); 
// ./templates_foo/foo.tpl が読み込まれます。

// "未定義の" 数値でインデックスを指定した場合(要素の場所を指定)
$smarty->display('file:[2]foo.tpl'); 
// ./templates_10/foo.tpl が読み込まれます。

?>

   

テンプレートの中でブラケット指定を使う


{include file="file:foo.tpl"}
{* ./templates/foo.tpl が読み込まれます *}

{include file="file:[1]foo.tpl"}
{* ./templates_2/foo.tpl が読み込まれます *}

{include file="file:[foo]foo.tpl"}
{* ./templates_foo/foo.tpl が読み込まれます *}

   

任意の場所からテンプレートを取得する

$template_dir で指定されたディレクトリ以外からテンプレートを取得する場合、file: リソースタイプが必須です。 file: の後で、テンプレートへの絶対パス(最初にスラッシュを付ける) を指定します。

注意

セキュリティ 機能を有効にした場合、 $template_dir で指定したディレクトリ以外のファイルは、$secure_dir で指定したディレクトリでない限りアクセスできなくなります。

例 16.3. 任意の場所からテンプレートを取得する例


<?php
$smarty->display('file:/export/templates/index.tpl');
$smarty->display('file:/path/to/my/templates/menu.tpl');
?>

   

テンプレート内で任意の場所からテンプレートを取得する例


{include file='file:/usr/local/share/templates/navigation.tpl'}

   

Windows のファイルパスについて

Windows マシンで Smarty を動作させている場合、ファイルパスの先頭に通常はドライブレター(C:) がつきます。 この場合、名前空間の衝突を避けながら望む結果を得るために、必ず file: リソースを使うようにして下さい。

例 16.4. Windows のファイルパスを指定してテンプレートを使う例


<?php
$smarty->display('file:C:/export/templates/index.tpl');
$smarty->display('file:F:/path/to/my/templates/menu.tpl');
?>

  

テンプレート内で Windows のファイルパスを指定する例:


{include file='file:D:/usr/local/share/templates/navigation.tpl'}