テンプレート間での変数の受け渡し
このガイドでは、{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 = '元の値'}
{block example}
{var $foo = '変更された値'}
{/block}
{$foo} // 出力: 元の値
{define}
{define}
タグは、{include}
を使用して呼び出された後にのみレンダリングされるブロックを作成するために使用されます。これらのブロック内で利用可能な変数は、定義にパラメータが指定されているかどうかによって異なります。指定されている場合は、これらのパラメータにのみアクセスできます。指定されていない場合は、ブロックが定義されているテンプレートのすべての入力変数にアクセスできます。
{define hello}
{* テンプレートのすべての入力変数にアクセスできます *}
{/define}
{define hello $name}
{* パラメータ $name にのみアクセスできます *}
{/define}
{parameters}
{parameters}
タグは、テンプレートの先頭で期待される入力変数を明示的に宣言するために使用されます。これにより、期待される変数とそのデータ型を簡単に文書化できます。デフォルト値を定義することも可能です。
{parameters int $age, string $name = '不明'}
<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}