Szintaxis

A Syntax Latte a webdesignerek gyakorlati igényeiből született. Kerestük a leginkább felhasználóbarát szintaxist, amellyel elegánsan lehet írni olyan konstrukciókat, amelyek egyébként igazi kihívást jelentenek. Ugyanakkor minden kifejezés pontosan ugyanúgy van megírva, mint a PHP-ben, így nem kell új nyelvet tanulnod. Csak a lehető legtöbbet hozod ki abból, amit már tudsz.

Az alábbiakban egy minimális sablont mutatunk be, amely néhány alapelemet szemléltet: címkék, n:attribútumok, megjegyzések és szűrők.

{* ez egy megjegyzés *}
<ul n:if="$items">                {* n:if is n:atribut *}
{foreach $items as $item}         {* tag representing foreach loop *}
	<li>{$item|capitalize}</li>   {* egy változót szűrővel kiíró tag *}
{/foreach}                        {* ciklus vége *}

Nézzük meg közelebbről ezeket a fontos elemeket, és azt, hogyan segíthetnek egy hihetetlen sablon létrehozásában.

Címkék

A sablon olyan címkéket tartalmaz, amelyek a sablon logikáját (például foreach ciklusok) vagy kimeneti kifejezéseket vezérlik. Mindkettőhöz egyetlen elválasztójelet használ { ... }, így nem kell azon gondolkodni, hogy más rendszerekhez hasonlóan melyik elválasztójelet melyik helyzetben használjuk. Ha a { karaktert idézőjel vagy szóköz követi, a Latte nem tekinti azt egy tag kezdetének, így a sablonokban gond nélkül használhat JavaScript-konstrukciókat, JSON-t vagy CSS-szabályokat.

Lásd az összes címke áttekintését. Ezenkívül egyéni címkéket is létrehozhat.

A Latte érti a PHP-t

A címkéken belül jól ismert PHP-kifejezéseket használhatsz:

Ezen kívül a Latte számos szép kiterjesztést ad a PHP szintaxisához.

n:attribútumok

Az egyes HTML-elemekre ható páros tagek, mint például a {if} … {/if}, n:attribútum jelöléssel írhatók. A fenti példában szereplő {foreach} például így is írható:

<ul n:if="$items">
	<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>

A funkció ekkor annak a HTML-elemnek felel meg, amelyikbe be van írva:

{var $items = ['I', '♥', 'Latte']}

<p n:foreach="$items as $item">{$item}</p>

Nyomtatás:

<p>I</p>
<p>♥</p>
<p>Latte</p>

A inner- előtag használatával megváltoztathatjuk a viselkedést úgy, hogy a funkció csak az elem testére vonatkozzon:

<div n:inner-foreach="$items as $item">
	<p>{$item}</p>
	<hr>
</div>

Nyomtatás:

<div>
	<p>I</p>
	<hr>
	<p>♥</p>
	<hr>
	<p>Latte</p>
	<hr>
</div>

A tag- előtag használatával a funkciót csak a HTML-címkékre alkalmazzuk:

<p><a href="{$url}" n:tag-if="$url">Title</a></p>

A $url változó értékétől függően ez kiírásra kerül:

// when $url is empty
<p>Title</p>

// when $url equals 'https://nette.org'
<p><a href="https://nette.org">Title</a></p>

A n:attribútumok azonban nem csak a páros címkék rövidítései, vannak tisztán n:attribútumok is, például a kódoló legjobb barátja, az n:class.

Szűrők

Lásd a szabványos szűrők összefoglalóját.

A Latte lehetővé teszi a szűrők hívását a pipajel jelölés használatával (az előző szóköz megengedett):

<h1>{$heading|upper}</h1>

A szűrők láncolhatók, ebben az esetben balról jobbra haladva alkalmazandók:

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

A paraméterek a szűrő neve után kerülnek, kettősponttal vagy vesszővel elválasztva:

<h1>{$heading|truncate:20,''}</h1>

A szűrők kifejezésekre alkalmazhatók:

{var $name = ($title|upper) . ($subtitle|lower)}

Blokkoláskor:

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

Vagy közvetlenül az értékre (a {=expr} taggel):

<h1>{='  Hello world  '|trim}<h1>

Hozzászólások

A megjegyzések így íródnak, és nem kerülnek be a kimenetbe:

{* ez egy komment a Latte nyelven *}

A PHP-kommentárok a címkéken belül működnek:

{include 'file.info', /* value: 123 */}

Szintaktikai cukor

Idézőjelek nélküli karakterláncok

Az idézőjelek elhagyhatók az egyszerű karakterláncok esetében:

as in PHP:   {var $arr = ['hello', 'btn--default', '€']}

abbreviated: {var $arr = [hello, btn--default, €]}

Az egyszerű karakterláncok olyanok, amelyek kizárólag betűkből, számjegyekből, aláhúzásokból, kötőjelekből és pontokból állnak. Nem kezdődhetnek számjegyekkel, és nem kezdődhetnek és nem végződhetnek kötőjellel. Nem állhat csak nagybetűkből és aláhúzásokból, mert akkor konstansnak minősül (pl. PHP_VERSION). És nem ütközhet a and, array, clone, default, false, in, instanceof, new, null, or, return, true, xor kulcsszavakkal.

Rövid hármas operátor

Ha a terner operátor harmadik értéke üres, akkor elhagyható:

as in PHP:   {$stock ? 'In stock' : ''}

abbreviated: {$stock ? 'In stock'}

Modern kulcsjelölés a tömbben

A tömbkulcsok a függvények hívásakor a megnevezett paraméterekhez hasonlóan írhatók:

as in PHP:   {var $arr = ['one' => 'item 1', 'two' => 'item 2']}

modern:      {var $arr = [one: 'item 1', two: 'item 2']}

Szűrők

A szűrők bármilyen kifejezéshez használhatók, csak zárójelbe kell tenni az egészet:

{var $content = ($text|truncate: 30|upper)}

Operátor in

A in operátor a in_array() függvény helyettesítésére használható. Az összehasonlítás mindig szigorú:

{* like in_array($item, $items, true) *}
{if $item in $items}
	...
{/if}

Választható láncolás a meghatározatlan biztonságos operátorral

Az undefined-safe operátor ??-> hasonló a nullsafe operátorhoz ?->, de nem okoz hibát, ha egy változó, tulajdonság vagy index egyáltalán nem létezik.

{$order??->id}

ezzel azt akarjuk mondani, hogy ha a $order definiált és nem null, akkor a $order->id lesz kiszámítva, de ha a $order null vagy nem létezik, akkor hagyjuk abba, amit csinálunk, és csak nullát adunk vissza.

Lehet, hogy a ?-> használatával sok olyan kódot helyettesíthetsz, amely ismétlődő nullás ellenőrzéseket végez:

{$user??->address??->street}
// roughly means isset($user) && isset($user->address) ? $user->address->street : null

Egy ablak a történelembe

A Latte története során számos szintaktikai cukorkával rukkolt elő, amelyek néhány évvel később megjelentek magában a PHP-ben is. Például a Latte-ban lehetséges volt tömböket írni úgy, hogy [1, 2, 3] array(1, 2, 3) helyett, vagy használni a nullsafe operátort $obj?->foo jóval azelőtt, hogy ez magában a PHP-ben lehetséges lett volna. A Latte bevezette a (expand) $arr tömbbővítő operátort is, amely a mai PHP ...$arr operátornak felel meg.

PHP korlátozások a Latte-ban

A Latte-ban csak PHP kifejezéseket lehet írni. Vagyis nem lehet osztályokat deklarálni vagy vezérlési struktúrákat használni, mint például a if, foreach, switch, return, try, throw és mások, amelyek helyett a Latte kínálja a címkéket. Szintén nem használhatsz attribútumokat, backtickeket vagy mágikus konstansokat, mert annak nem lenne értelme. Nem használhatod még a echo, include, require, exit, eval, unset, mert ezek nem függvények, hanem speciális PHP nyelvi konstrukciók, tehát nem kifejezések.

Ezeket a korlátozásokat azonban megkerülheti a RawPhpExtension kiterjesztés aktiválásával, amely lehetővé teszi, hogy a sablon szerzőjének felelősségére bármilyen PHP kódot használjon a {php ...} tagben.