Syntaxe
Syntax Latte byla navržena s ohledem na praktické potřeby webdesignérů. Hledali jsme co nejpřívětivější syntax, která umožní elegantně zapsat i složité konstrukce. Zároveň jsme zachovali kompatibilitu s PHP, takže se nemusíte učit nový jazyk – stačí využít to, co již znáte.
Níže uvádíme minimální šablonu, která ilustruje několik základních prvků: tagy, n:atributy, komentáře a filtry.
{* toto je komentář *}
<ul n:if="$items"> {* n:if je n:atribut *}
{foreach $items as $item} {* tag představující cyklus foreach *}
<li>{$item|capitalize}</li> {* tag vypisující proměnnou s filtrem *}
{/foreach} {* konec cyklu *}
</ul>
Podívejme se blíže na tyto důležité prvky a na to, jak vám mohou pomoci vytvořit úžasnou šablonu.
Tagy
Šablona obsahuje tagy (neboli značky či makra), které řídí logiku šablony (například smyčky foreach) nebo
vypisují výrazy. Pro obojí se používá jednotný delimiter { ... }
, což eliminuje nutnost přemýšlet, jaký
delimiter v jaké situaci použít, na rozdíl od některých jiných systémů. Pokud bezprostředně za {
následuje uvozovka nebo mezera, Latte tento znak nepovažuje za začátek tagu. To umožňuje bezproblémové použití
JavaScriptových konstrukcí, JSONu nebo pravidel v CSS přímo v šablonách.
Kompletní přehled všech tagů najdete v dokumentaci. Navíc máte možnost vytvářet i vlastní tagy pro specifické potřeby vašeho projektu.
Latte rozumí PHP
Uvnitř tagů můžete používat standardní PHP výrazy:
- proměnné
- řetězce (včetně HEREDOC a NOWDOC), pole, čísla, atd.
- operátory
- volání funkcí a metod (které lze v případě potřeby omezit sandboxem)
- match
- anonymní funkce
- callbacky
- víceřádkové komentáře
/* ... */
- a mnoho dalšího…
Latte navíc rozšiřuje PHP syntax o několik užitečných vylepšení.
n:atributy
Všechny párové tagy, jako například {if} … {/if}
, které operují nad jedním HTML elementem, lze přepsat
do podoby n:atributů. Takto by bylo možné zapsat i {foreach}
z úvodní ukázky:
<ul n:if="$items">
<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>
Funkcionalita se vztahuje na HTML element, ve kterém je n:atribut umístěn:
{var $items = ['I', '♥', 'Latte']}
<p n:foreach="$items as $item">{$item}</p>
Tento kód vypíše:
<p>I</p>
<p>♥</p>
<p>Latte</p>
Pomocí prefixu inner-
můžeme upravit chování tak, aby se vztahovalo pouze na vnitřní obsah elementu:
<div n:inner-foreach="$items as $item">
<p>{$item}</p>
<hr>
</div>
Výsledek bude:
<div>
<p>I</p>
<hr>
<p>♥</p>
<hr>
<p>Latte</p>
<hr>
</div>
Prefix tag-
umožňuje aplikovat funkcionalitu pouze na samotné HTML tagy:
<p><a href={$url} n:tag-if="$url">Title</a></p>
V závislosti na hodnotě proměnné $url
se vypíše:
{* když je $url prázdné *}
<p>Title</p>
{* když $url obsahuje 'https://nette.org' *}
<p><a href="https://nette.org">Title</a></p>
N:atributy nejsou jen zkratkou pro párové tagy. Existují i specifické n:atributy jako n:href nebo velmi užitečný n:class.
Filtry
Kompletní seznam standardních filtrů najdete v dokumentaci.
Filtry se zapisují za svislítko (před kterým může být mezera):
<h1>{$heading|upper}</h1>
Filtry lze řetězit, přičemž se aplikují zleva doprava:
<h1>{$heading|lower|capitalize}</h1>
Parametry filtrů se zadávají za jménem filtru, oddělené dvojtečkami nebo čárkami:
<h1>{$heading|truncate:20, ''}</h1>
Filtry lze aplikovat i na výrazy:
{var $name = ($title|upper) . ($subtitle|lower)}
Na bloky:
<h1>{block |lower}{$heading}{/block}</h1>
Nebo přímo na hodnoty (v kombinaci s tagem {=expr}
):
<h1>{=' Hello world '|trim}<h1>
Dynamické HTML tagy
Latte podporuje dynamické HTML tagy, což je užitečné, když potřebujete flexibilitu v názvech tagů:
<h{$level}>Heading</h{$level}>
Tento kód může generovat například <h1>Heading</h1>
nebo
<h2>Heading</h2>
v závislosti na hodnotě proměnné $level
. Dynamické HTML tagy v Latte
musí být vždy párové. Alternativou je použití n:tag.
Latte jako bezpečný šablonovací systém kontroluje, zda je výsledný název tagu validní a neobsahuje nežádoucí nebo potenciálně škodlivé hodnoty. Zároveň zajišťuje, že název koncového tagu bude vždy shodný s názvem otevíracího tagu.
Komentáře
Komentáře se zapisují následujícím způsobem a nejsou součástí výstupu:
{* tohle je komentář v Latte *}
Uvnitř tagů lze použít standardní PHP komentáře:
{include 'file.info', /* value: 123 */}
Syntaktický cukr
Řetězce bez uvozovek
U jednoduchých řetězců lze vynechat uvozovky:
standardní PHP: {var $arr = ['hello', 'btn--default', '€']}
zkrácená verze: {var $arr = [hello, btn--default, €]}
Jednoduché řetězce se skládají výhradně z písmen, číslic, podtržítek, pomlček a teček. Nesmí začínat
číslicí a nesmí začínat nebo končit pomlčkou. Nesmí být tvořeny pouze velkými písmeny a podtržítky, protože ty
jsou považovány za konstanty (např. PHP_VERSION
). Také nesmí kolidovat s klíčovými slovy: and
,
array
, clone
, default
, false
, in
, instanceof
,
new
, null
, or
, return
, true
, xor
.
Zkrácený ternární operátor
Pokud je třetí hodnota ternárního operátoru prázdná, lze ji vynechat:
standardní PHP: {$stock ? 'Skladem' : ''}
zkrácená verze: {$stock ? 'Skladem'}
Moderní zápis klíčů v poli
Klíče v poli lze zapisovat podobně jako pojmenované parametry při volání funkcí:
standardní PHP: {var $arr = ['one' => 'item 1', 'two' => 'item 2']}
moderní zápis: {var $arr = [one: 'item 1', two: 'item 2']}
Filtry
Filtry lze aplikovat na libovolné výrazy, stačí celý výraz uzavřít do závorek:
{var $content = ($text|truncate: 30|upper)}
Operátor in
Operátor in
nahrazuje funkci in_array()
. Porovnání je vždy striktní:
{* ekvivalent in_array($item, $items, true) *}
{if $item in $items}
...
{/if}
Historické okénko
Latte v průběhu své historie zavedlo mnoho syntaktických vylepšení, která se později objevila i v samotném PHP.
Například v Latte bylo možné používat zápis pole jako [1, 2, 3]
místo array(1, 2, 3)
nebo
nullsafe operátor $obj?->foo
dlouho před tím, než to umožnilo PHP. Latte také představilo operátor pro
rozbalení pole (expand) $arr
, který je ekvivalentem dnešního PHP operátoru ...$arr
.
Undefined-safe operátor ??->
, podobný nullsafe operátoru ?->
, ale nezpůsobující chybu
při neexistující proměnné, vznikl z historických důvodů. Dnes doporučujeme používat standardní PHP operátor
?->
.
Omezení PHP v Latte
V Latte lze používat pouze PHP výrazy. Nelze používat příkazy ukončené středníkem, deklarovat třídy nebo
používat řídící struktury jako if
,
foreach
, switch
, return
, try
, throw
atd. Místo nich Latte
nabízí své vlastní tagy. Nelze používat ani atributy, backticks či některé magické konstanty. Také nelze použít unset
,
echo
, include
, require
, exit
, eval
, protože nejde o funkce, ale
o speciální jazykové konstrukce PHP. Z komentářů jsou podporovány pouze víceřádkové /* ... */
.
Tato omezení lze obejít aktivací rozšíření RawPhpExtension, které umožňuje používat ve značce
{php ...}
jakýkoliv PHP kód na zodpovědnost autora šablony.