Предаване на променливи между шаблони
Това ръководство ще ви обясни как се предават променливи между
шаблони в 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.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}