Syntaxe
Syntax Latte nebyla vymyšlena inženýry od stolu, ale vzešla z ryze praktických požadavků webdesignerů. Hledali jsme tu nejpřívětivější syntax, se kterou elegantně zapíšete i konstrukce, které jinak představují skutečný oříšek. Budete překvapeni, jak moc vám Latte zjednoduší práci.
Najdete tu značky pro pokročilou tvorbu layoutů, pro tzv. dědičnost šablon, vnořené bloky a podobně. Přitom syntaxe vychází přímo z PHP, nebudete se tedy muset učit něco zcela nového a zúročíte své knowhow.
Tagy
Popis všech výchozích tagů (neboli značek či maker) najdete na samostatné stránce. Krom toho můžete vytvářet i develop.
Všechny párové značky, například {if} … {/if}
, operující nad jedním HTML elementem, se dají přepsat
do podoby n:atributů. Takto by bylo možné zapsat například i {foreach}
<ul n:if="$items">
<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>
A to se s n:atributy dají dělat ještě daleko zajímavější kousky, jak se za chvíli dozvíte.
Tag {$item|capitalize}
, který slouží k vypsání proměnné $item
, obsahuje tzv. filtr, v tomto případě capitalize
, který převede první písmenko každého slova
na velké.
Velmi důležité je, že Latte vypisované proměnné automaticky escapuje. Vypsání proměnné totiž vyžaduje escapování, tj. převedení znaků majících v HTML speciální význam na jiné odpovídající sekvence. Opomenutí by vedlo ke vzniku závažné bezpečnostní díry Cross Site Scripting (XSS).
Protože v různých dokumentech a na různých místech stránky se používají jiné escapovací funkce, disponuje Latte zcela unikátní technologií security, která rozezná, ve které části dokumentu se značka nachází a podle toho zvolí správné escapování. Nemusíte se proto bát, že váš kodér na escapování zapomene a způsobí vám velké starosti kvůli bezpečnostní díře. Což je skvělé!
Pokud by proměnná $item
obsahovala HTML kód a chtěli bychom ji vypsat bez jakékoliv
transformace, stačí přidat modifikátor noescape: {$item|noescape}
. Opomenutí přitom nezpůsobí bezpečností
díru, dle principu „less code, more security“.
Uvnitř značek přitom můžeme používat PHP takové, jaké ho známe. Dokonce včetně komentářů. Latte navíc syntaxi PHP rozšiřuje o tři příjemné novinky:
- můžeme vynechat uvozovky kolem řetězce z písmen, číslic a pomlček
- stručnější zápis podmínek
$a ? 'b'
odpovídající$a ? 'b' : null
- můžete používat optional chaining
$var?->call()?->elem[1]?->item
Příklad:
{$cond ? hello} // vypíše 'hello' pokud je $cond truthy
{$order->item?->name} // znamená isset($order->item) ? $order->item->name : null
n:atributy
Ukazovali jsme si, že n:atributy (též nazývané n:makra) se zapisují přímo do HTML značek jako jejich speciální
atributy. A také si říkali, že všechny párové tagy (například {if} … {/if}
) se dají přepsat do podoby
n:atributu. Funkcionalita se pak vztahuje na HTML element, do něhož je umístěný:
{var $items = ['I', '♥', 'Nette Framework']}
<p n:foreach="$items as $item">{$item}</p>
vypíše:
<p>I</p>
<p>♥</p>
<p>Nette Framework</p>
Pomocí prefixu inner-
můžeme chování poupravit tak, aby se vztahovalo jen na vnitřní část elementu:
<div n:inner-foreach="$items as $item">
<p>{$item}</p>
<hr>
</div>
Vypíše se:
<div>
<p>I</p>
<hr>
<p>♥</p>
<hr>
<p>Nette Framework</p>
<hr>
</div>
Nebo pomocí prefixu tag-
aplikujeme funkcionalitu jen na samotné HTML značky:
<p><a href="{$url}" n:tag-if="$url">Title</a></p>
Což vypíše v závislosti na proměnné $url
:
{* když je $url prázdné *}
<p>Title</p>
{* když $url obsahuje 'https://nette.org' *}
<p><a href="https://nette.org">Title</a></p>
Avšak n:atributy nejsou jen zkratkou pro párové značky. Existují i ryzí n:atributy, jako třeba n:href nebo velešikovný pomocník kodéra n:class.
Filtry
Podívejte se na přehled standardních filtrů.
Filtry se zapisují za svislítko (může být před ním mezera):
<h1>{$heading|upper}</h1>
Filtry lze zřetězit a poté se aplikují v pořadí od levého k pravému:
<h1>{$heading|lower|capitalize}</h1>
Parametry se zadávají za jménem filtru oddělené dvojtečkami nebo čárkami:
<h1>{$heading|truncate:20,''}</h1>
Filtry lze aplikovat i na výraz:
{var $name = ($title|upper) . ($subtitle|lower)}</h1>
Výrazy
Volitelné řetězení s nullsafe operátorem
Volitelné řetězení umožňuje psát kód, kde Latte okamžitě zastaví vyhodnocování výrazů, pokud narazí na null.
A to díky novému operátoru ?->
umožňujícímu volitelný přístup k proměnným nebo prvkům pole. Stejnou
věc přináší PHP 8, nicméně v Latte ho můžete používat i v PHP 7.
Když píšeme kód jako:
{$order?->id}
říkáme tím, že když $order
není null, bude vypsán $order->id
, ale když je
$order
null, zastaví se vyhodnocování a prostě se vrátí null.
Uvidíte, že pomocí ?->
nahradíte spoustu kódu, který by jinak opakovaně kontroloval null:
{$user?->address?->street}
// znamená cca ($user !== null) && ($user->address !== null) ? $user->address->street : null
{$items[2]?->count}
// zamená cca ($items[2] !== null) ? $items[2]->count : null
{$user->getIdentity()?->name}
// zamená cca $user->getIdentity() !== null ? $user->getIdentity()->name : null
Význam je „cca“, protože ve skutečnosti se výraz vyhodnocuje důmyslněji a žádný krok se neopakuje. Například
$user->getIdentity()
se zavolá jen jednou, tedy nemůže nastat problém způsobený tím, že by v podmínce
vrátilo objekt a následně pak null.
Výrazy s volitelným řetězením lze používat kdekoliv, například v podmínkách:
{if $blogPost?->count('*')}
// znamená if (isset($blogPost) && $blogPost->count('*'))
...
{/if}
Volitelné řetězení s undefined-safe operátorem
Undefined-safe operator ??->
je obdoba nullsafe operatoru ?->
, avšak nevyvolá chybu, pokud
proměnná, property nebo index v poli vůbec neexistuje.
{$order??->id}
říkáme tím, že když existuje $order
a není null, bude vypsán $order->id
, ale když je
$order
null nebo neexistuje, zastaví se vyhodnocování a prostě se vrátí null.
{$user??->address??->street}
// znamená cca isset($user) && isset($user->address) ? $user->address->street : null
Operátor rozbalení pole (expand)
Operátor (expand)
umožňuje použití pole v místě, kde se očekává více argumentů. Jde o obdobu
operátoru ...
z PHP, na rozdíl od něj však zachovává i klíče.
Lze jej použít například pro předání argumentů do bloků nebo vkládaných šablon, pokud je máme v poli.
{include 'foobar.latte' (expand) $args} {* argumenty pro include *}
Komentáře
Komentáře se zapisují {* tímto způsobem *}
a do výstupu se nedostanou.