Предаване на променливи между шаблони

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