Przekazywanie zmiennych między szablonami

Ten przewodnik wyjaśnia, w jaki sposób zmienne są przekazywane między szablonami w Latte przy użyciu różnych tagów, takich jak {include}, {import}, {embed}, {layout}, {sandbox} i innych. Dowiesz się również, jak pracować ze zmiennymi w tagach {block} i {define} oraz jaki jest cel tagu {parameters}.

Rodzaje zmiennych

Zmienne w Latte można podzielić na trzy kategorie w zależności od tego, jak i gdzie są zdefiniowane:

Zmienne wejściowe to te, które są przekazywane do szablonu z zewnątrz, na przykład ze skryptu PHP lub przy użyciu tagu takiego jak {include}.

$latte->render('template.latte', ['userName' => 'Jan', 'userAge' => 30]);

Zmienne otaczające to zmienne istniejące w miejscu określonego tagu. Obejmują one wszystkie zmienne wejściowe i inne zmienne utworzone przy użyciu tagów takich jak {var}, {default} lub w pętli {foreach}.

{foreach $users as $user}
	{include 'userBox.latte', user: $user}
{/foreach}

Zmienne jawne to zmienne bezpośrednio określone w tagu i wysłane do szablonu docelowego.

{include 'userBox.latte', name: $user->name, age: $user->age}

{block}

Znacznik {block} służy do definiowania bloków kodu wielokrotnego użytku, które można dostosowywać lub rozszerzać w dziedziczonych szablonach. Otaczające zmienne zdefiniowane przed blokiem są dostępne wewnątrz bloku, ale wszelkie zmiany zmiennych są odzwierciedlane tylko w tym bloku.

{var $foo = 'original'}
{block example}
	{var $foo = 'modified'}
{/block}

{$foo}    // outputs: original

{define}

Znacznik {define} jest używany do tworzenia bloków, które są renderowane tylko wtedy, gdy są wywoływane za pomocą {include}. Zmienne dostępne wewnątrz tych bloków zależą od tego, czy w definicji określono parametry. Jeśli parametry są określone, tylko te parametry są dostępne. Jeśli nie, dostępne są wszystkie zmienne wejściowe szablonu, w którym zdefiniowane są bloki.

{define hello}
	{* has access to all input variables of the template *}
{/define}

{define hello $name}
	{* has access only to the $name parameter *}
{/define}

{parameters}

Znacznik {parameters} służy do jawnego deklarowania oczekiwanych zmiennych wejściowych na początku szablonu. W ten sposób można łatwo udokumentować oczekiwane zmienne i ich typy danych. Możliwe jest również zdefiniowanie wartości domyślnych.

{parameters int $age, string $name = 'unknown'}
<p>Age: {$age}, Name: {$name}</p>

{include file}

Znacznik {include file} służy do wstawiania całego szablonu. Szablon ten przekazuje zarówno zmienne wejściowe szablonu, w którym tag jest używany, jak i jawnie zdefiniowane zmienne. Szablon docelowy może jednak ograniczyć zakres za pomocą {parameters}.

{include 'profile.latte', userId: $user->id}

{include block}

Podczas wstawiania bloku zdefiniowanego w tym samym szablonie, wszystkie otaczające i jawnie zdefiniowane zmienne są do niego przekazywane:

{define blockName}
	<p>Name: {$name}, Age: {$age}</p>
{/define}

{var $name = 'Jan', $age = 30}
{include blockName}

W tym przykładzie zmienne $name i $age są przekazywane do bloku blockName. To samo zachowanie dotyczy {include parent}.

Podczas wstawiania bloku z innego szablonu przekazywane są tylko zmienne wejściowe i jawnie zdefiniowane zmienne. Zmienne otaczające nie są automatycznie dostępne.

{include blockInOtherTemplate, name: $name, age: $age}

{layout} lub {extends}

Znaczniki te definiują układ, do którego przekazywane są zmienne wejściowe szablonu podrzędnego i zmienne utworzone w kodzie przed blokami:

{layout 'layout.latte'}
{var $seo = 'index, follow'}

Szablon layout.latte:

<head>
	<meta name="robots" content="{$seo}">
</head>

{embed}

Znacznik {embed} jest podobny do znacznika {include}, ale umożliwia osadzanie bloków w szablonie. W przeciwieństwie do {include}, przekazywane są tylko jawnie zadeklarowane zmienne:

{embed 'menu.latte', items: $menuItems}
{/embed}

W tym przykładzie szablon menu.latte ma dostęp tylko do zmiennej $items.

I odwrotnie, bloki wewnątrz {embed} mają dostęp do wszystkich otaczających zmiennych:

{var $name = 'Jan'}
{embed 'menu.latte', items: $menuItems}
	{block foo}
		{$name}
	{/block}
{/embed}

{import}

Znacznik {import} służy do ładowania bloków z innych szablonów. Do zaimportowanych bloków przekazywane są zarówno zmienne wejściowe, jak i jawnie zadeklarowane zmienne.

{import 'buttons.latte'}

{sandbox}

Znacznik {sandbox} izoluje szablon w celu bezpiecznego przetwarzania. Zmienne są przekazywane wyłącznie jawnie.

{sandbox 'secure.latte', data: $secureData}
wersja: 3.0