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 vlastní tagy.

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 důvěryhodný HTML kód a chtěli bychom ji vypsat bez jakékoliv transformace, stačí přidat filter 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 několik příjemných vlastností:

  1. můžeme vynechat uvozovky kolem řetězce z písmen, číslic a pomlček
  2. stručnější zápis podmínek $a ? 'b' odpovídající $a ? 'b' : null
  3. můžete používat filtry $a|upper
  4. můžete používat undefined-safe operátor $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>

Na blok:

<h1>{block |lower}{$heading}{/block}</h1>

Nebo přímo na hodnotu (v kombinaci s tagem {=expr}):

<h1>{='  Hello world  '|trim}<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.