Przekazywanie zmiennych między szablonami
Ten przewodnik wyjaśni Ci, jak zmienne są przekazywane między szablonami w Latte za pomocą 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 do czego służy
znacznik {parameters}
.
Typy zmiennych
Zmienne w Latte możemy 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 za pomocą
tagu jak {include}
.
$latte->render('template.latte', ['userName' => 'Jan', 'userAge' => 30]);
Zmienne otoczenia to zmienne istniejące w miejscu danego znacznika. Obejmują wszystkie zmienne wejściowe i inne
zmienne utworzone za pomocą tagów jak {var}
, {default}
lub w ramach pętli {foreach}
.
{foreach $users as $user}
{include 'userBox.latte', user: $user}
{/foreach}
Zmienne jawne to te, które są bezpośrednio określone wewnątrz tagu i są wysyłane do szablonu docelowego.
{include 'userBox.latte', name: $user->name, age: $user->age}
{block}
Tag {block}
służy do definiowania bloków kodu wielokrotnego użytku, które można dostosowywać lub
rozszerzać w szablonach dziedziczących. Zmienne otoczenia zdefiniowane przed blokiem są dostępne wewnątrz bloku, ale wszelkie
zmiany zmiennych będą widoczne tylko w ramach tego bloku.
{var $foo = 'oryginalny'}
{block example}
{var $foo = 'zmieniony'}
{/block}
{$foo} // wypisze: oryginalny
{define}
Tag {define}
służy do tworzenia bloków, które renderują się dopiero po ich wywołaniu za pomocą
{include}
. Zmienne dostępne wewnątrz tych bloków zależą od tego, czy w definicji podano parametry. Jeśli tak,
dostęp mają tylko do tych parametrów. Jeśli nie, dostęp mają do wszystkich zmiennych wejściowych szablonu, w którym bloki
są zdefiniowane.
{define hello}
{* ma dostęp do wszystkich zmiennych wejściowych szablonu *}
{/define}
{define hello $name}
{* ma dostęp tylko do parametru $name *}
{/define}
{parameters}
Tag {parameters}
służy do jawnej deklaracji oczekiwanych zmiennych wejściowych na początku szablonu. W ten
sposób można łatwo dokumentować oczekiwane zmienne i ich typy danych. Można również zdefiniować wartości domyślne.
{parameters int $age, string $name = 'nieznane'}
<p>Wiek: {$age}, Imię: {$name}</p>
{include file}
Tag {include file}
służy do wstawienia całego szablonu. Do tego szablonu przekazywane są zarówno zmienne
wejściowe szablonu, w którym znacznik jest użyty, jak i zmienne w nim jawnie zdefiniowane. Szablon docelowy może jednak
ograniczyć zakres za pomocą {parameters}
.
{include 'profile.latte', userId: $user->id}
{include block}
Gdy wstawiasz blok zdefiniowany w tym samym szablonie, przekazywane są do niego wszystkie zmienne otoczenia i jawnie zdefiniowane:
{define blockName}
<p>Imię: {$name}, Wiek: {$age}</p>
{/define}
{var $name = 'Jan', $age = 30}
{include blockName}
W tym przykładzie zmienne $name
i $age
zostaną przekazane do bloku blockName
. W ten
sam sposób zachowuje się również {include parent}
.
Podczas wstawiania bloku z innego szablonu przekazywane są tylko zmienne wejściowe i jawnie zdefiniowane. Zmienne otoczenia nie są automatycznie dostępne.
{include blockInOtherTemplate, name: $name, age: $age}
{layout}
lub {extends}
Te tagi definiują layout, do którego przekazywane są zmienne wejściowe szablonu podrzędnego oraz zmienne utworzone w kodzie przed blokami:
{layout 'layout.latte'}
{var $seo = 'index, follow'}
Szablon layout.latte
:
<head>
<meta name="robots" content="{$seo}">
</head>
{embed}
Tag {embed}
jest podobny do tagu {include}
, ale umożliwia wstawianie bloków do szablonu. 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
.
Natomiast w blokach wewnątrz {embed}
jest dostęp do wszystkich zmiennych otoczenia:
{var $name = 'Jan'}
{embed 'menu.latte', items: $menuItems}
{block foo}
{$name}
{/block}
{/embed}
{import}
Tag {import}
służy do ładowania bloków z innych szablonów. Przekazywane są zarówno zmienne wejściowe, jak
i jawnie zadeklarowane do importowanych bloków.
{import 'buttons.latte'}
{sandbox}
Tag {sandbox}
izoluje szablon do bezpiecznego przetwarzania. Zmienne są przekazywane wyłącznie jawnie.
{sandbox 'secure.latte', data: $secureData}