Передача переменных между шаблонами

Это руководство объясняет, как передавать переменные между шаблонами в Latte с помощью различных тегов, таких как {include}, {import}, {embed}, {layout}, {sandbox}, и других. Вы также узнаете, как работать с переменными в тегах {block} и {define}, а также о назначении тега {parameters}.

Типы переменных

Переменные в Latte можно разделить на три категории в зависимости от того, как и где они определяются:

Входные переменные – это те, которые передаются в шаблон извне, например, из 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}
версия: 3.0