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}