テンプレート間での変数の受け渡し
このガイドでは、{include}、{import}、{embed}、{layout}、{sandbox}
などのタグを使って、Latte
のテンプレート間で変数がどのように渡されるのかを説明します。あわせて {block} と
{define} タグの中で変数をどう扱うか、そして {parameters}
タグの目的も学びます。
変数の種類
Latte の変数は、どこでどのように定義されるかによって 3 つに分けられます。
入力変数は、PHP スクリプトや {include}
のようなタグから、テンプレートの外部より渡される変数です。
$latte->render('template.latte', ['userName' => 'Jan', 'userAge' => 30]);
周囲の変数は、あるタグの位置に存在している変数です。すべての入力変数に加え、{var}、{default}、{foreach}
ループの中などで作られた変数が含まれます。
{foreach $users as $user}
{include 'userBox.latte', user: $user}
{/foreach}
明示的な変数は、タグの中で直接指定して対象のテンプレートに送る変数です。
{include 'userBox.latte', name: $user->name, age: $user->age}
{block}
{block}
タグは、継承したテンプレートでカスタマイズや拡張ができる再利用可能なコードブロックを定義するために使います。ブロックより前に定義された周囲の変数はブロックの中でも使えますが、変数への変更はそのブロックの中にしか反映されません。
{var $foo = 'original'}
{block example}
{var $foo = 'modified'}
{/block}
{$foo} // 出力: original
{define}
{define} タグは、{include}
で呼ばれたときにだけレンダリングされるブロックを作るために使います。ブロックの中で使える変数は、定義でパラメータを宣言しているかどうかによって決まります。パラメータを宣言したブロックは、そのパラメータと、定義されているテンプレートのすべての入力変数にアクセスできます。パラメータのないブロックも、その入力変数にアクセスできます。どちらの場合も周囲の変数は使えません。
{define hello}
{* テンプレートのすべての入力変数にアクセスできます *}
{/define}
{define hello $name}
{* $name パラメータと入力変数にアクセスできます *}
{/define}
{parameters}
{parameters}
タグは、テンプレートの先頭で期待する入力変数を明示的に宣言するために使います。これにより、期待される変数とそのデータ型を簡単に文書化できます。既定値を定義することもできます。
{parameters int $age, string $name = 'unknown'}
<p>年齢: {$age}、名前: {$name}</p>
{include file}
{include file}
タグはテンプレート全体を挿入するために使います。このテンプレートには、タグが使われているテンプレートの入力変数と、明示的に定義された変数の両方が渡されます。ただし対象のテンプレートは
{parameters} でスコープを制限できます。
{include 'profile.latte', userId: $user->id}
{include block}
同じテンプレートで定義されたブロックを挿入する場合、周囲の変数と明示的に定義された変数がすべて渡されます。
{define blockName}
<p>名前: {$name}、年齢: {$age}</p>
{/define}
{var $name = 'Jan', $age = 30}
{include blockName}
この例では、$name と $age の変数が blockName
ブロックに渡されます。{include parent} でも同じ振る舞いになります。
別のテンプレートのブロックを挿入する場合は、入力変数と明示的に定義された変数だけが渡されます。周囲の変数は自動的には使えません。
{include blockInOtherTemplate, name: $name, age: $age}
{layout} または {extends}
これらのタグはレイアウトを指定します。子テンプレートの入力変数と、ブロックより前のコードで作られた変数がレイアウトに渡されます。
{layout 'layout.latte'}
{var $seo = 'index, follow'}
テンプレート layout.latte:
<head>
<meta name="robots" content="{$seo}">
</head>
{embed}
{embed} タグは {include}
タグに似ていますが、テンプレートにブロックを埋め込めます。{include}
と違い、明示的に宣言された変数だけが渡されます。
{embed 'menu.latte', items: $menuItems}
{/embed}
この例では、menu.latte テンプレートは $items
変数にしかアクセスできません。
逆に、{embed} の中のブロックは周囲の変数すべてにアクセスできます。
{var $name = 'Jan'}
{embed 'menu.latte', items: $menuItems}
{block foo}
{$name}
{/block}
{/embed}
{import}
{import}
タグは、ほかのテンプレートからブロックを読み込むために使います。読み込まれたブロックには、入力変数と明示的に宣言された変数の両方が渡されます。
{import 'buttons.latte'}
{sandbox}
{sandbox}
タグは、安全に処理するためにテンプレートを隔離します。変数は明示的にのみ渡されます。
{sandbox 'secure.latte', data: $secureData}