What is Smarty?
Why use it?
Use Cases and Work Flow
Syntax Comparison
Template Inheritance
Best Practices
Crash Course
You may use the Smarty logo according to the trademark notice.
For sponsorship, advertising, news or other inquiries, contact us at:
テンプレートは様々なリソースから呼び出して使用できます。テンプレートを
display()
、
fetch()
したり別のテンプレートからインクルードしたりする際には、
リソースの種類に続けて適切なパスとテンプレート名を指定します。
リソースを明示的に指定しない場合は
$default_resource_type
の値であるとみなします。
$template_dir
からのテンプレートを使用する場合は、
テンプレートリソースの指定は必要ありません。しかし、一貫性を保つために
file:
リソースを使用してもかまいません。使用したいテンプレートへのパスを、
$template_dir
のルートディレクトリからの相対パス (先頭のスラッシュはなし) で指定します。
Example 15.17. $template_dir のテンプレートを使用する
<?php $smarty->display('index.tpl'); $smarty->display('file:index.tpl'); // 上と同じ ?>
Smarty のテンプレート
{include file='index.tpl'} {include file='file:index.tpl'} {* 上と同じ *}
$template_dir
の外に置かれたテンプレートを使うには、リソースの種類
file:
を指定しなければなりません。
その後にテンプレートへの絶対パス (先頭のスラッシュつき) を続けます。
セキュリティが有効な場合、template_dir 以外の場所にあるテンプレートにはアクセスできません。
Example 15.18. 任意のディレクトリからのテンプレートを使用する
<?php $smarty->display('file:/export/templates/index.tpl'); $smarty->display('file:/path/to/my/templates/menu.tpl'); ?>
Smarty のテンプレート
{include file='file:/usr/local/share/templates/navigation.tpl'}
通常、Windows 環境の場合はファイルパスの先頭にドライブレター (C:)
が含まれます。ネームスペースの衝突を回避して期待通りの結果を得るために、
必ず file:
を使用して下さい。
Example 15.19. Windows ファイルパスからテンプレートを使用する
<?php $smarty->display('file:C:/export/templates/index.tpl'); $smarty->display('file:F:/path/to/my/templates/menu.tpl'); ?>
Smarty テンプレート
{include file='file:D:/usr/local/share/templates/navigation.tpl'}
Smarty は、string:
あるいは eval:
リソースを使って文字列からテンプレートをレンダリングすることができます。
string:
リソースは、テンプレートファイルと同じように振る舞います。
テンプレートのソースが文字列からコンパイルされ、コンパイル済みのテンプレートのコードを後で再利用します。
各テンプレート文字列に対して、それぞれ新しいコンパイル済みテンプレートファイルができます。
テンプレート文字列に頻繁にアクセスするのなら、この方法を選ぶといいでしょう。
もしテンプレート文字列を頻繁に変更する (あるいはあまり再利用性のない値を含む文字列である)
場合は、eval:
リソースのほうがよいでしょう。
eval:
リソースは、ページをレンダリングするときに毎回テンプレートソースを評価します。
これは、再利用性の低い値を持つ文字列を扱うときによい方法です。
同じ文字列に頻繁にアクセスするのなら、string:
リソースのほうがよいでしょう。
string:
リソースでは、文字列ごとにコンパイル済みファイルができあがります。
Smarty は文字列が変更されたかどうかを検出できないので、
個々の文字列につい新たにコンパイルしてファイルを生成します。
コンパイルした文字列でディスクが埋まってしまわないよう、
適切なリソースを選択することが重要です。
Example 15.20. 文字列からのテンプレートを使用する
<?php $smarty->assign('foo','value'); $template_string = 'display {$foo} here'; $smarty->display('string:'.$template_string); // コンパイルしたものを再利用します $smarty->display('eval:'.$template_string); // 毎回コンパイルします ?>
Smarty テンプレート
{include file="string:$template_string"} {* コンパイルしたものを再利用します *} {include file="eval:$template_string"} {* 毎回コンパイルします *}
extends:
リソースを使って、テンプレートの継承の親子関係を PHP スクリプトから定義することができます。
詳細は テンプレートの継承 を参照ください。
Example 15.21. テンプレートの継承を PHP スクリプトから使用する
<?php $smarty->display('extends:parent.tpl|child.tpl|grandchild.tpl'); ?>
これは、継承をプログラム的に定義しなければならないときに使います。 PHP から継承を定義するときは、子テンプレート側からはどのような継承関係になるかが明らかではありません。 この方式を使えば、通常はより柔軟かつ直感的にテンプレート側から継承関係を処理できるようになります。
データベース・ソケット・LDAP 等の PHPによってアクセス可能なリソースからテンプレートを取得する事ができます。 そのためにはリソースプラグイン関数を記述し、それを登録する必要があります。
リソースプラグイン関数についての詳細な情報は リソースプラグイン の項を参照してください。
元から存在する file:
リソースは上書きできないことに注意しましょう。
しかし、ファイルシステム上のテンプレートを別の方法で取得するテンプレートを作成することはできます。
それを別のリソース名で登録すればよいのです。
Example 15.22. カスタムリソースを使用する
<?php // これらの関数をアプリケーションに追加します function db_get_template ($tpl_name, &$tpl_source, $smarty_obj) { // ここでデータベースを呼び出し、取得した実際のテンプレートを // $tpl_source に代入します $tpl_source = "This is the template text"; // 成功した場合に true を返します。false を返すと失敗したことになります return true; } function db_get_timestamp($tpl_name, &$tpl_timestamp, $smarty_obj) { // テンプレートの最終更新時刻の Unix タイムスタンプを // $tpl_timestampに代入するためにデータベースを呼び出します // これで、再コンパイルが必要かどうかを判断します $tpl_timestamp = time(); // この例だと常に再コンパイルとなります! // 成功した場合に true を返します。false を返すと失敗したことになります return true; } function db_get_secure($tpl_name, $smarty_obj) { // 全てのテンプレートがセキュアであると仮定します return true; } function db_get_trusted($tpl_name, $smarty_obj) { // テンプレートから使用しません } // テンプレートリソース名"db"を登録します $smarty->registerResource("db", array("db_get_template", "db_get_timestamp", "db_get_secure", "db_get_trusted")); // phpスクリプトからテンプレートリソースを使用します $smarty->display("db:index.tpl"); ?>
Smarty テンプレート
{include file='db:/extras/navigation.tpl'}
テンプレートリソースからテンプレートの取得に失敗した際に、 テンプレートのコンテンツを取り戻すために呼び出されるユーザ定義関数を指定します。 この関数の使用方法の1つとして、その場限りのテンプレートを作成する処理を行います。
ストリーム
も参照ください。