Передача переменных между шаблонами
Это руководство объясняет, как в 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} // выводит: original
{define}
Тег {define} служит для создания блоков, которые отрисовываются
только при вызове через {include}. Переменные, доступные внутри
таких блоков, зависят от того, объявлены ли в определении параметры.
Блок с объявленными параметрами имеет доступ и к этим параметрам, и ко
всем входным переменным шаблона, где он определён. Блок без параметров
имеет доступ к этим входным переменным тоже. Ни в одном из случаев
окружающие переменные не доступны.
{define hello}
{* имеет доступ ко всем входным переменным шаблона *}
{/define}
{define hello $name}
{* имеет доступ к параметру $name и входным переменным *}
{/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}
В этом примере в блок blockName передаются переменные $name и
$age. То же поведение действует и для {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}