テンプレート間での変数の受け渡し

このガイドでは、{include}{import}{embed}{layout}{sandbox} などのさまざまなタグを使って、Latte のテンプレート間で変数を受け渡す方法を説明します。また、{block}{define} タグで変数を扱う方法や、{parameters} タグの目的についても説明します。

変数の種類

ラテの変数は、その定義方法と定義場所によって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}    // outputs: original

{define}

{define} タグは、{include} を使用して呼び出されたときにのみレンダリングされるブロックを作成するために使用します。これらのブロックの内部で使用できる変数は、定義でパラメータが指定されて いるかどうかによって異なります。パラメータが指定されている場合は、それらのパラメータにのみアクセスできます。パラメータが指定されていない場合は、ブロックが定義されているテンプレートのすべての入力変数にアクセスできます。

{define hello}
	{* has access to all input variables of the template *}
{/define}

{define hello $name}
	{* has access only to the $name parameter *}
{/define}

{parameters}

{parameters} タグは、テンプレートの冒頭で期待される入力変数を明示的に宣言するために使用します。こうすることで、期待される変数とそのデータ型を簡単に文書化することができます。デフォルト値を定義することも可能です。

{parameters int $age, string $name = 'unknown'}
<p>Age: {$age}, Name: {$name}</p>

{include file}

{include file} タグは、テンプレート全体を挿入するために使用します。このテンプレートには、タグが使用されるテンプレートの入力変数と、明示的に定義された変数の両方が渡されます。ただし、ターゲット・テンプレートは、{parameters} を使用してスコープを制限することができます。

{include 'profile.latte', userId: $user->id}

{include block}

同じテンプレートで定義されたブロックを挿入する場合、周囲にある変数と明示的に定義された変 数はすべてそのブロックに渡されます:

{define blockName}
	<p>Name: {$name}, Age: {$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}
version: 3.0