Przekazywanie zmiennych między szablonami
Ten przewodnik wyjaśnia, jak w Latte przekazywane są zmienne między szablonami za pomocą różnych tagów, takich jak
{include}, {import}, {embed}, {layout}, {sandbox} i innych.
Dowiesz się także, jak pracować ze zmiennymi wewnątrz tagów {block} i {define} oraz do czego
służy tag {parameters}.
Rodzaje zmiennych
Zmienne w Latte można podzielić na trzy kategorie według tego, jak i gdzie są definiowane:
Zmienne wejściowe to te, które są przekazywane do szablonu z zewnątrz, na przykład ze skryptu PHP albo za pomocą
tagu takiego jak {include}.
$latte->render('template.latte', ['userName' => 'Jan', 'userAge' => 30]);
Zmienne otaczające to zmienne istniejące w miejscu konkretnego tagu. Należą do nich wszystkie zmienne wejściowe
oraz inne zmienne utworzone tagami takimi jak {var}, {default} albo wewnątrz pętli
{foreach}.
{foreach $users as $user}
{include 'userBox.latte', user: $user}
{/foreach}
Zmienne jawne to te, które są podane bezpośrednio w tagu i 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 otaczające zdefiniowane przed blokiem są dostępne wewnątrz bloku, ale
wszelkie zmiany zmiennych są widoczne tylko w obrębie tego bloku.
{var $foo = 'original'}
{block example}
{var $foo = 'modified'}
{/block}
{$foo} // wypisze: original
{define}
Tag {define} służy do tworzenia bloków, które są renderowane dopiero po wywołaniu przez
{include}. Zmienne dostępne wewnątrz tych bloków zależą od tego, czy w definicji zadeklarowano parametry. Blok
z zadeklarowanymi parametrami ma dostęp zarówno do tych parametrów, jak i do wszystkich zmiennych wejściowych szablonu, w
którym został zdefiniowany. Blok bez parametrów ma dostęp do tych zmiennych wejściowych również. W żadnym z przypadków
zmienne otaczające nie są dostępne.
{define hello}
{* ma dostęp do wszystkich zmiennych wejściowych szablonu *}
{/define}
{define hello $name}
{* ma dostęp do parametru $name i zmiennych wejściowych *}
{/define}
{parameters}
Tag {parameters} służy do jawnego zadeklarowania oczekiwanych zmiennych wejściowych na początku szablonu. W
ten sposób łatwo udokumentujesz oczekiwane zmienne i ich typy danych. Można też zdefiniować wartości domyślne.
{parameters int $age, string $name = 'unknown'}
<p>Age: {$age}, Name: {$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 użyto tagu, jak i zmienne zdefiniowane jawnie. Szablon docelowy może jednak ograniczyć zakres
za pomocą {parameters}.
{include 'profile.latte', userId: $user->id}
{include block}
Przy wstawianiu bloku zdefiniowanego w tym samym szablonie przekazywane są do niego wszystkie zmienne otaczające i jawnie zdefiniowane:
{define blockName}
<p>Name: {$name}, Age: {$age}</p>
{/define}
{var $name = 'Jan', $age = 30}
{include blockName}
W tym przykładzie do bloku blockName przekazywane są zmienne $name i $age. Tak samo
zachowuje się {include parent}.
Przy wstawianiu bloku z innego szablonu przekazywane są tylko zmienne wejściowe i zmienne zdefiniowane jawnie. Zmienne otaczające 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 potomnego 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 pozwala osadzać bloki w szablonie. W odróżnieniu
od {include} przekazywane są tylko zmienne zadeklarowane jawnie:
{embed 'menu.latte', items: $menuItems}
{/embed}
W tym przykładzie szablon menu.latte ma dostęp tylko do zmiennej $items.
Odwrotnie, bloki wewnątrz {embed} mają dostęp do wszystkich zmiennych otaczających:
{var $name = 'Jan'}
{embed 'menu.latte', items: $menuItems}
{block foo}
{$name}
{/block}
{/embed}
{import}
Tag {import} służy do wczytania bloków z innych szablonów. Do importowanych bloków przekazywane są zarówno
zmienne wejściowe, jak i zadeklarowane jawnie.
{import 'buttons.latte'}
{sandbox}
Tag {sandbox} izoluje szablon w celu bezpiecznego przetwarzania. Zmienne przekazywane są wyłącznie jawnie.
{sandbox 'secure.latte', data: $secureData}