{function} は、テンプレート内で関数を作成します。
これはプラグイン関数のようにコールすることができます。
見た目に関する内容を生成するプラグインを書くよりは、
それをテンプレート側に書いておいたほうが管理しやすくなるでしょう。
深く込み入ったメニューなどのデータの取り回しもシンプルになります。
テンプレート関数はグローバルに定義されます。Smarty のコンパイラはシングルパスのコンパイラなので、
指定したテンプレートの外部で定義されたテンプレート関数をコールするときには
{call}
タグを使わなければなりません。それ以外の場合は、テンプレート内で直接
{funcname ...} として関数を使うことができます。
{function} タグには name 属性が必須です。
ここに、テンプレート関数の名前を書きます。
この名前のタグを使って、テンプレート関数をコールすることができます。
属性 を使って、テンプレート関数に変数のデフォルト値を渡すことができます。 デフォルト値は、テンプレート関数をコールするときに上書きすることができます。
テンプレート関数からは、呼び出し元テンプレートのすべての変数を使うことができます。 テンプレート関数内での変数の値の変更や新たな変数の作成はローカルスコープで行われ、 テンプレート関数の実行後は呼び出し元テンプレートからは見えなくなります。
属性
| 属性名 | 型 | 必須 | デフォルト | 概要 |
|---|---|---|---|---|
| name | string | Yes | n/a | テンプレート関数の名前 |
| [var ...] | [var type] | No | n/a | ローカルからテンプレート関数に渡すデフォルトの変数の値 |
Example 7.41. 再帰的なメニュー {function} の例
{* 関数の定義 *}
{function name=menu level=0}
{function menu level=0} {* 短縮形 *}
<ul class="level{$level}">
{foreach $data as $entry}
{if is_array($entry)}
<li>{$entry@key}</li>
{menu data=$entry level=$level+1}
{else}
<li>{$entry}</li>
{/if}
{/foreach}
</ul>
{/function}
{* 例として使う配列を作成します *}
{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
['item3-3-1','item3-3-2']],'item4']}
{* 配列を関数に渡します *}
{menu data=$menu}
出力は、次のようになります。
* item1
* item2
* item3
o item3-1
o item3-2
o item3-3
+ item3-3-1
+ item3-3-2
* item4
{call}
も参照ください。