Předávání proměnných napříč šablonami
Tento průvodce vám vysvětlí, jak se proměnné předávají mezi šablonami v Latte pomocí různých tagů jako
{include}
, {import}
, {embed}
, {layout}
, {sandbox}
a dalších.
Dozvíte se také, jak pracovat s proměnnými v tagu {block}
a {define}
, a k čemu slouží značka
{parameters}
.
Typy proměnných
Proměnné v Latte můžeme rozdělit do tří kategorií podle toho, jak a kde jsou definovány:
Vstupní proměnné jsou ty, které jsou do šablony předávány zvenčí, například z PHP skriptu nebo pomocí tagu
jako {include}
.
$latte->render('template.latte', ['userName' => 'Jan', 'userAge' => 30]);
Okolní proměnné jsou proměnné existující v místě určité značky. Zahrnují všechny vstupní proměnné a
další proměnné vytvořené pomocí tagů jako {var}
, {default}
nebo v rámci smyčky
{foreach}
.
{foreach $users as $user}
{include 'userBox.latte', user: $user}
{/foreach}
Explicitní proměnné jsou ty, které jsou přímo specifikovány uvnitř tagu a jsou odeslány do cílové šablony.
{include 'userBox.latte', name: $user->name, age: $user->age}
{block}
Tag {block}
se používá k definování opakovaně použitelných bloků kódu, které lze v dědičných
šablonách přizpůsobit nebo rozšířit. Okolní proměnné definované před blokem jsou dostupné uvnitř bloku, ale
jakékoli změny proměnných se projeví jen v rámci toho bloku.
{var $foo = 'původní'}
{block example}
{var $foo = 'změněný'}
{/block}
{$foo} // vypíše: původní
{define}
Tag {define}
slouží k vytváření bloků, které se renderují až po jejich zavolání pomocí
{include}
. Proměnné dostupné uvnitř těchto bloků závisí na tom, zda jsou v definici uvedeny parametry. Pokud
ano, přístup mají jen k těmto parametrům. Pokud ne, přístup mají ke všem vstupním proměnným šablony, ve které jsou
bloky definovány.
{define hello}
{* má přístup ke všem vstupním proměnným šablony *}
{/define}
{define hello $name}
{* má přístup jen k parametru $name *}
{/define}
{parameters}
Tag {parameters}
slouží k explicitní deklaraci očekávaných vstupních proměnných na začátku šablony.
Tímto způsobem lze snadno dokumentovat očekávané proměnné a jejich datové typy. Také je možné definovat výchozí
hodnoty.
{parameters int $age, string $name = 'neznámé'}
<p>Věk: {$age}, Jméno: {$name}</p>
{include file}
Tag {include file}
slouží k vložení celé šablony. Této šabloně se předávají jak vstupní proměnné
šablony, ve které je značka použita, tak proměnné v ní explicitně definované. Cílová šablona ale může rozsah omezit
pomocí {parameters}
.
{include 'profile.latte', userId: $user->id}
{include block}
Když vkládáte blok definovaný ve stejné šabloně, předávají se do něj všechny okolní a explicitně definované proměnné:
{define blockName}
<p>Jméno: {$name}, Věk: {$age}</p>
{/define}
{var $name = 'Jan', $age = 30}
{include blockName}
V tomto příkladu se proměnné $name
a $age
předají do bloku blockName
. Stejným
způsobem se chová i {include parent}
.
Při vkládání bloku z jiné šablony jsou předávány pouze vstupní proměnné a explicitně definované. Okolní proměnné nejsou automaticky dostupné.
{include blockInOtherTemplate, name: $name, age: $age}
{layout}
nebo {extends}
Tyto tagy definují layout, do kterého se předávají vstupní proměnné podřízené šablony a dále proměnné vytvořené v kódu před bloky:
{layout 'layout.latte'}
{var $seo = 'index, follow'}
Šablona layout.latte
:
<head>
<meta name="robots" content="{$seo}">
</head>
{embed}
Tag {embed}
je podobný tagu {include}
, ale umožňuje vkládání bloků do šablony. Na rozdíl od
{include}
se předávají pouze explicitně deklarované proměnné:
{embed 'menu.latte', items: $menuItems}
{/embed}
V tomto příkladu má šablona menu.latte
přístup pouze k proměnné $items
.
Naopak v blocích uvnitř {embed}
je přístup ke všem okolním proměnným:
{var $name = 'Jan'}
{embed 'menu.latte', items: $menuItems}
{block foo}
{$name}
{/block}
{/embed}
{import}
Tag {import}
se využívá pro načítání bloků z jiných šablon. Přenáší se jak vstupní, tak
explicitně deklarované proměnné do importovaných bloků.
{import 'buttons.latte'}
{sandbox}
Tag {sandbox}
izoluje šablonu pro bezpečné zpracování. Proměnné jsou předávány výhradně
explicitně.
{sandbox 'secure.latte', data: $secureData}