Latte tagy (makra)
Přehled a popis všech tagů (značek či maker) šablonovacího systému Latte, které máte standardně k dispozici.
{$var} , {...} nebo {=...} |
vypíše escapovanou proměnnou nebo výraz |
{$var|filter} |
vypíše s použitím filtrů |
{l} nebo {r} |
vypíše znak { nebo } |
{if} … {elseif} … {else} … {/if} |
podmínka if |
{ifset} … {elseifset} … {/ifset} |
podmínka ifset |
{ifchanged} … {/ifchanged} |
test, zda došlo ke změně |
{switch} {case} {default} {/switch} |
podmínka switch |
n:else |
alternativní obsah pro podmínky |
{foreach} … {/foreach} |
foreach |
{for} … {/for} |
for |
{while} … {/while} |
while |
{continueIf $cond} |
pokračovat další iterací |
{skipIf $cond} |
přeskočit iteraci |
{breakIf $cond} |
přerušení cyklu |
{exitIf $cond} |
včasné ukončení |
{first} … {/first} |
první průchod? |
{last} … {/last} |
poslední průchod? |
{sep} … {/sep} |
bude následovat další průchod? |
{iterateWhile} … {/iterateWhile} |
strukturovaný foreach |
$iterator |
speciální proměnná uvnitř foreach |
{include 'file.latte'} |
načte šablonu z dalšího souboru |
{sandbox 'file.latte'} |
načte šablonu v sandbox režimu |
{block} |
anonymní blok |
{block blockname} |
definice bloku |
{define blockname} |
definice bloku pro pozdější použití |
{include blockname} |
vykreslení bloku |
{include blockname from 'file.latte'} |
vykreslí blok ze souboru |
{import 'file.latte'} |
načte bloky ze šablony |
{layout 'file.latte'} / {extends} |
určuje soubor s layoutem |
{embed} … {/embed} |
načte šablonu či blok a umožní přepsat bloky |
{ifset blockname} … {/ifset} |
podmínka, zda existuje blok |
{try} … {else} … {/try} |
zachycení výjimek |
{rollback} |
zahození bloku try |
{var $foo = value} |
vytvoří proměnnou |
{default $foo = value} |
vytvoří proměnnou, pokud neexistuje |
{parameters} |
deklaruje proměnné, typy a výchozí hodnoty |
{capture} … {/capture} |
zachytí blok do proměnné |
{varType} |
deklaruje typ proměnné |
{varPrint} |
navrhne typy proměnných |
{templateType} |
deklaruje typy proměnných podle třídy |
{templatePrint} |
navrhne třídu s typy proměnných |
{_...} |
vypíše překlad |
{translate} … {/translate} |
přeloží obsah |
{contentType} |
přepne escapování a pošle HTTP hlavičku |
{debugbreak} |
umístí do kódu breakpoint |
{do} |
vykoná kód, ale nic nevypíše |
{dump} |
dumpuje proměnné do Tracy Bar |
{php} |
vykoná jakýkoliv PHP kód |
{spaceless} … {/spaceless} |
odstraní nadbytečné mezery |
{syntax} |
změna syntaxe za běhu |
{trace} |
zobrazí stack trace |
n:class |
dynamický zápis HTML atributu class |
n:attr |
dynamický zápis jakýchkoliv HTML atributů |
n:tag |
dynamický zápis jména HTML elementu |
n:ifcontent |
vynechá prázdný HTML tag |
n:href |
odkaz používaný v HTML elementech
<a> |
{link} |
vypíše odkaz |
{plink} |
vypíše odkaz na presenter |
{control} |
vykreslí komponentu |
{snippet} … {/snippet} |
výstřižek, který lze odeslat AJAXem |
{snippetArea} |
obálka pro výstřižky |
{cache} … {/cache} |
cachuje část šablony |
{form} … {/form} |
vykreslí značky formuláře |
{label} … {/label} |
vykreslí popisku formulářového prvku |
{input} |
vykreslí formulářový prvek |
{inputError} |
vypíše chybovou hlášku formulářového prvku |
n:name |
oživí formulářový prvek |
{formContainer} … {/formContainer} |
kreslení formulářového kontejneru |
Vypisování
{$var}
{...}
{=...}
Latte používá značku {=...}
pro výpis jakéhokoliv výrazu. Pro vaše pohodlí Latte nevyžaduje rovnítko,
pokud výraz začíná proměnnou nebo voláním funkce. To v praxi znamená, že ho téměř nikdy nemusíte psát:
Můžete zapsat libovolný výraz, který znáte z PHP. Není třeba se učit nový jazyk. Například:
Prosím, nehledejte v předchozím příkladu žádný smysl, ale kdybyste tam nějaký našli, napište nám :-)
Escapování výstupu
Nejdůležitějším úkolem šablonovacího systému je zabránit bezpečnostním dírám. A přesně to Latte dělá vždy, když něco vypisujete. Automaticky to escapuje:
Přesněji řečeno, Latte používá kontextově sensitivní escapování, což je tak důležitá a unikátní vlastnost, že jsme jí věnovali samostatnou kapitolu.
Co když potřebujete vypsat obsah kódovaný v HTML z důvěryhodného zdroje? Jednoduše můžete escapování vypnout:
Nesprávné použití filtru noescape
může vést ke vzniku zranitelnosti XSS! Nikdy jej
nepoužívejte, pokud si nejste naprosto jisti, co děláte a že vypisovaný řetězec pochází z důvěryhodného
zdroje.
Vypsání v JavaScriptu
Díky kontextově sensitivnímu escapování je neobyčejně snadné vypisovat proměnné uvnitř JavaScriptu a Latte se postará o správné escapování.
Proměnná nemusí být jen řetězec, podporován je kterýkoliv datový typ, který se zakóduje jako JSON:
Vygeneruje:
To je také důvod, proč se kolem proměnné nepíší uvozovky: Latte je u řetězců doplní samo. Pokud chcete řetězcovou proměnnou vložit do jiného řetězce, jednoduše je spojte:
Filtry
Vypsaný výraz může být upraven filtrem. Například takto řetězec převedeme na velká písmena a zkrátíme na maximálně 30 znaků:
Filtry můžete používat i na dílčí části výrazu:
Podmínky
{if}
{elseif}
{else}
Podmínky v Latte se chovají stejně jako jejich protějšky v PHP. Můžete v nich používat stejné výrazy, jaké znáte z PHP, takže se nemusíte učit nový jazyk.
Jako každou párovou značku lze i {if} ... {/if}
zapsat v podobě n:attributu:
Můžete k n:atributům připojit prefix tag-
. Pak se podmínka bude vztahovat jen na vypsání HTML značek a
obsah mezi nimi se vypíše vždy:
Praktické, že?
n:else
Pokud podmínku {if} ... {/if}
zapíšete v podobě n:attributu, můžete
uvést i alternativní větev pomocí n:else
:
Atribut n:else
můžete použít také ve dvojici s n:ifset
, n:foreach
, n:try
, n:ifcontent
a n:ifchanged
.
{/if $cond}
Výraz v podmínce {if}
lze uvést také v ukončovací značce. To se hodí v situacích, kdy při
otevírání podmínky ještě jeho hodnotu neznáme. Říkáme tomu odložené rozhodnutí.
Například začneme vypisovat tabulku se záznamy z databáze a teprve po dokončení výpisu si uvědomíme, že
v databázi žádný záznam nebyl. Tak dáme podmínku do koncové značky {/if}
a pokud žádný záznam nebude,
nic se nevypíše:
Šikovné, že?
V odložené podmínce lze použít i {else}
, ale nikoliv {elseif}
.
{ifset}
{elseifset}
Viz také {ifset block}
Pomocí podmínky {ifset $var}
zjistíme, zda proměnná (nebo více proměnných) existuje a má
nenullovou hodnotu. Je to ekvivalent if (isset($var))
v PHP. Jako každou párovou značku ji lze zapsat
i v podobě n:attributu:
{ifchanged}
{ifchanged}
kontroluje, zda se hodnota proměnné změnila od poslední iterace ve smyčce (foreach, for nebo
while).
Pokud ve značce uvedeme jednu či více proměnných, bude kontrolovat, zda se nějaká z nich změnila, a podle toho vypíše obsah. Například tento kód vypíše první písmenko jména jako nadpis pokaždé, když se při výpisu jmen změní:
Pokud neuvedeme žádný argument, bude se kontrolovat vykreslený obsah oproti jeho předchozímu stavu. V předchozím příkladu tedy můžeme argument ve značce vynechat. Samozřejmě také můžeme použít n:attribut:
Uvnitř {ifchanged}
lze také použít klauzuli {else}
.
{switch}
{case}
{default}
Porovnává hodnotu s více možnostmi. Je to obdoba podmíněného příkazu switch
z PHP, ale Latte ho
vylepšuje:
- používá striktní porovnání (
===
) - nepotřebuje
break
Je to tedy přesný ekvivalent struktury match
, kterou přináší PHP 8.0.
Klauzule {case}
může obsahovat více hodnot oddělených čárkami:
Cykly
V Latte najdete všechny cykly, které znáte z PHP: foreach, for a while.
{foreach}
Cyklus zapíšeme stejně jako v PHP:
Navíc má několik šikovných vylepšení, o kterých si nyní povíme.
Latte kontroluje, zda vytvořené proměnné nechtěně nepřepisují globální proměnné téhož jména. To vás ochrání
před situací, kdy počítáte s tím, že v $lang
je aktuální jazyk stránky, ale
foreach $langs as $lang
vám tu proměnnou přepíše.
Cyklus foreach lze také elegantně a úsporně zapsat pomocí n:attributu:
Víte, že k n:atributům můžete připojit prefix inner-
? Pak se bude ve smyčce opakovat pouze vnitřek
elementu:
Takže se vypíše něco jako:
{else}
Uvnitř cyklu foreach
můžete použít klauzuli {else}
, jejíž obsah se zobrazí, pokud je cyklus
prázdný:
$iterator
Uvnitř cyklu foreach
vytvoří Latte proměnnou $iterator
, která poskytuje užitečné informace
o probíhajícím cyklu:
$iterator->first
– je to první průchod?$iterator->last
– je to poslední průchod?$iterator->counter
– počítadlo, začíná od 1$iterator->counter0
– počítadlo, začíná od 0$iterator->odd
– je to lichý průchod?$iterator->even
– je to sudý průchod?$iterator->parent
– iterator obklopující ten aktuální$iterator->nextValue
– následující položka$iterator->nextKey
– klíč následující položky
Latte je chytré a $iterator->last
funguje nejen u polí, ale i když cyklus probíhá nad obecným
iterátorem, kde není dopředu znám počet položek.
{first}
{last}
{sep}
Tyto značky lze používat uvnitř cyklu {foreach}
. Obsah {first}
se vykreslí při prvním
průchodu. Obsah {last}
se vykreslí při posledním průchodu. Jde vlastně o zkratky pro
{if $iterator->first}
a {if $iterator->last}
.
Značky lze také elegantně použít jako n:attributy:
Obsah značky {sep}
se vykreslí, pokud průchod není poslední. Hodí se pro vykreslování oddělovačů,
například čárek mezi vypisovanými položkami:
To je docela praktické, že?
{iterateWhile}
Zjednodušuje seskupování lineárních dat během iterování v cyklu foreach tím, že iteraci provádí ve vnořené smyčce, dokud je splněná podmínka. Přečtěte si podrobný návod.
Může také elegantně nahradit {first}
a {last}
v příkladu výše:
Viz také filtry batch a group.
{for}
Cyklus zapisujeme stejně jako v PHP:
Značku lze také použít jako n:attribut:
{while}
Opět zapisujeme cyklus stejně jako v PHP:
Nebo jako n:attribut:
Je možná i varianta s podmínkou v koncové značce, která odpovídá v PHP cyklu do-while:
{continueIf}
{skipIf}
{breakIf}
Pro řízení jakéhokoliv cyklu můžete použít značky {continueIf ?}
a {breakIf ?}
, které
přejdou na další prvek resp. ukončí cyklus při splnění podmínky:
Značka {skipIf}
je velmi podobná {continueIf}
, ale nezvyšuje počítadlo
$iterator->counter
. Takže pokud vypisujete počítadlo a zároveň přeskočíte některé položky, nebudou
v číslování mezery. A také klauzule {else}
se vykreslí, když přeskočíte všechny položky.
{exitIf}
Ukončí vykreslování šablony nebo bloku při splnění podmínky (tzv. „early exit“).
Vložení šablony
{include 'file.latte'}
Viz také {include block}
Značka {include}
načte a vykreslí uvedenou šablonu. V PHP bychom to přirovnali k:
Vložené šablony nemají přístup k proměnným aktivního kontextu, mají přístup jen ke globálním proměnným.
Proměnné do vložené šablony můžete předávat takto:
Název šablony může být jakýkoliv výraz v PHP:
Vložený obsah lze upravit pomocí filtrů. Následující příklad odstraní veškeré HTML a upraví velikost písmen:
Ve výchozím nastavení dědičnost šablon v tomto případě nehraje roli. I když
v inkludované šabloně můžeme používat bloky, nedojde k nahrazení odpovídajících bloků v šabloně, do které se
inkluduje. Inkludované šablony považujte za samostatné odstíněné části stránek nebo modulů. Toto chování můžete
změnit pomocí modifikátoru with blocks
:
Vztah mezi názvem souboru uvedeným ve značce a souborem na disku je záležitostí loaderu.
{sandbox}
Při vkládání šablony vytvořené koncovým uživatelem byste měli zvážit sandbox režim (více informací v dokumentaci sandboxu):
{block}
Viz také {block name}
Anonymní bloky slouží jako způsob, jak aplikovat filtry na část šablony. Například takto můžete použít filtr strip, který odstraní zbytečné mezery:
Řízení výjimek
{try}
Díky této značce je extrémně snadné vytvářet robustní šablony.
Pokud při vykreslování bloku {try}
dojde k výjimce, celý blok se zahodí a vykreslování bude pokračovat
za ním:
Volitelná klauzule {else}
se vykreslí jen když nastane výjimka:
Značku lze také použít jako n:attribut:
Je také možné definovat vlastní obslužný handler pro výjimky, například kvůli logování.
{rollback}
Blok {try}
lze zastavit a přeskočit také ručně pomocí {rollback}
. Díky tomu nemusíte předem
kontrolovat všechna vstupní data a až během vykreslování se můžete rozhodnout, že objekt nechcete vůbec vykreslit:
Proměnné
{var}
{default}
Nové proměnné vytvoříme v šabloně značkou {var}
:
Značka {default}
funguje podobně, ale vytváří proměnné jen tehdy, pokud neexistují. Pokud proměnná již
existuje a obsahuje hodnotu null
, nebude přepsána:
Můžete uvádět i typy proměnných. Zatím jsou informativní a Latte je nekontroluje.
{parameters}
Podobně jako funkce deklaruje své parametry, může i šablona na začátku deklarovat své proměnné:
Proměnné $a
a $b
bez uvedené výchozí hodnoty mají automaticky výchozí hodnotu
null
. Deklarované typy jsou zatím informativní a Latte je nekontroluje.
Jiné proměnné než deklarované se do šablony nepřenášejí. Tím se liší od značky {default}
.
{capture}
Zachytí výstup do proměnné:
Značku lze, podobně jako každou párovou značku, zapsat také jako n:attribut:
HTML výstup se do proměnné $var
uloží v podobě objektu Latte\Runtime\Html
, aby nedošlo k nežádoucímu escapování při vypsání.
Ostatní
{contentType}
Značka určuje, jaký typ obsahu šablona představuje. Možnosti jsou:
html
(výchozí typ)xml
javascript
css
calendar
(iCal)text
Její použití je důležité, protože nastaví kontextově
sensitivní escapování a jen tak může escapovat správně. Například {contentType xml}
přepne do režimu
XML, {contentType text}
escapování zcela vypne.
Pokud je parametrem plnohodnotný MIME type, jako například application/xml
, tak navíc odešle HTTP hlavičku
Content-Type
do prohlížeče:
{debugbreak}
Označuje místo, kde dojde k pozastavení běhu programu a spuštění debuggeru, aby mohl programátor provést inspekci běhového prostředí a zjistit, zda program funguje podle očekávání. Podporuje Xdebug. Lze doplnit podmínku, která určuje, kdy má být program pozastaven.
{do}
Vykoná PHP kód a nic nevypisuje. Stejně jako u všech dalších značek se PHP kódem rozumí jeden výraz, viz omezení PHP.
{dump}
Vypíše proměnnou nebo aktuální kontext.
Vyžaduje knihovnu Tracy.
{php}
Umožňuje vykonat jakýkoliv PHP kód. Značku je nutné aktivovat pomocí rozšíření RawPhpExtension.
{spaceless}
Odstraní zbytečné bílé místo z výstupu. Funguje podobně jako filtr spaceless.
Vygeneruje:
Značku lze také zapsat jako n:attribut.
{syntax}
Latte značky nemusejí být ohraničeny pouze jednoduchými složenými závorkami. Můžete si zvolit i jiný oddělovač a
to dokonce za běhu. Slouží k tomu {syntax …}
, kde jako parametr lze uvést:
- double:
{{...}}
- off: zcela vypne zpracování Latte značek
S využitím n:atributů lze vypnout Latte třeba jen jednomu bloku JavaScriptu:
Latte lze velmi pohodlně používat i uvnitř JavaScriptu, jen se stačí vyhnout konstrukcím jako v tomto příkladě, kdy
následuje písmeno hned za {
, viz Latte uvnitř
JavaScriptu nebo CSS.
Pokud Latte vypnete pomocí {syntax off}
(tj. značkou, nikoliv n:atributem), bude důsledně ignorovat všechny
značky až do {/syntax}
.
{trace}
Vyhodí výjimku Latte\RuntimeException
, jejíž stack trace se nese v duchu šablon. Tedy místo volání
funkcí a metod obsahuje volání bloků a vkládání šablon. Pokud používáte nástroj pro přehledné zobrazení vyhozených
výjimek, jako je například Tracy, přehledně se vám zobrazí call stack včetně
všech předávaných argumentů.
Pomocníci HTML kodéra
n:class
Díky n:class
velice snadno vygenerujete HTML atribut class
přesně podle představ.
Příklad: potřebujeme, aby aktivní prvek měl třídu active
:
A dále, aby první prvek měl třídy first
a main
:
A všechny prvky mají mít třídu list-item
:
Úžasně jednoduché, že?
n:attr
Atribut n:attr
umí se stejnou elegancí jako n:class generovat libovolné HTML
atributy.
V závislosti na vrácených hodnotách vypíše např.:
n:tag
Atribut n:tag
umí dynamicky měnit název HTML elementu.
Pokud je $heading === null
, vypíše se beze změny tag <h1>
. Jinak se změní název elementu
na hodnotu proměnné, takže pro $heading === 'h3'
se vypíše:
Protože Latte je bezpečný šablonovací systém, kontroluje, zda je nový název značky platný a neobsahuje žádné nežádoucí nebo škodlivé hodnoty.
n:ifcontent
Předchází tomu, aby se vypsal prázdný HTML element, tj. element neobsahující nic než mezery.
Vypíše v závislosti na hodnotě proměnné $error
:
Překlady
Aby značky pro překlad fungovaly, je potřeba aktivovat překladač. Pro
překlad můžete také použít filtr translate
.
{_...}
Překládá hodnoty do jiných jazyků.
Překladači lze předávat i další parametry:
{translate}
Překládá části šablony:
Značku lze také zapsat jako n:attribut, pro překlad vnitřku elementu: