Передача змінних між шаблонами

Цей посібник пояснює, як передавати змінні між шаблонами в 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