Передача змінних між шаблонами
Цей посібник пояснить вам, як змінні передаються між шаблонами в 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 = 'оригінальний'}
{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 '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}