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:

  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 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.

Vylepšit tuto stránku