Передача переменных между шаблонами
Это руководство объяснит вам, как переменные передаются между
шаблонами в Latte с помощью различных тегов, таких как {include}
,
{import}
, {embed}
, {layout}
, {sandbox}
и других. Вы также
узнаете, как работать с переменными в тегах {block}
и {define}
, и
для чего служит тег {parameters}
.
Типы переменных
Переменные в Latte можно разделить на три категории в зависимости от того, как и где они определены:
Входные переменные — это те, которые передаются в шаблон извне,
например, из PHP-скрипта или с помощью тега, такого как {include}
.
$latte->render('template.latte', ['userName' => 'Ян', '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 = 'Ян', $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 = 'Ян'}
{embed 'menu.latte', items: $menuItems}
{block foo}
{$name}
{/block}
{/embed}
{import}
Тег {import}
используется для загрузки блоков из других шаблонов.
Передаются как входные, так и явно объявленные переменные в
импортированные блоки.
{import 'buttons.latte'}
{sandbox}
Тег {sandbox}
изолирует шаблон для безопасной обработки.
Переменные передаются исключительно явно.
{sandbox 'secure.latte', data: $secureData}