Szintaxis

A Latte szintaxisa a webdesignerek gyakorlati igényeiből fakadt. A legbarátságosabb szintaxist kerestük, amellyel elegánsan leírhatók olyan konstrukciók is, amelyek egyébként igazi fejtörést okoznának. Ugyanakkor minden kifejezés pontosan ugyanúgy íródik, mint PHP-ban, így nem kell új nyelvet tanulnia. Egyszerűen kamatoztathatja azt, amit már régóta tud.

Az alábbiakban egy minimális sablon látható, amely néhány alapvető elemet illusztrál: tageket, n:attribútumokat, kommentárokat és szűrőket.

{* ez egy kommentár *}
<ul n:if=$items>                  {* n:if egy n:attribútum *}
{foreach $items as $item}         {* foreach ciklust képviselő tag *}
	<li>{$item|capitalize}</li>   {* változót szűrővel kiíró tag *}
{/foreach}                        {* ciklus vége *}
</ul>

Nézzük meg közelebbről ezeket a fontos elemeket, és hogy hogyan segíthetnek Önnek lenyűgöző sablont létrehozni.

Tagek

A sablon tageket tartalmaz, amelyek a sablon logikáját vezérlik (például foreach ciklusok) vagy kifejezéseket írnak ki. Mindkettőhöz egyetlen elválasztót { ... } használnak, így nem kell azon gondolkodnia, hogy milyen elválasztót használjon milyen helyzetben, mint más rendszereknél. Ha a { karaktert idézőjel vagy szóköz követi, a Latte nem tekinti azt tag kezdetének, így a sablonokban problémamentesen használhat JavaScript konstrukciókat, JSON-t vagy CSS szabályokat is.

Tekintse meg az összes tag áttekintését. Ezenkívül létrehozhat egyéni tageket is.

A Latte érti a PHP-t

A tageken belül használhat PHP kifejezéseket, amelyeket jól ismer:

A Latte ezenkívül a PHP szintaxisát néhány kellemes bővítménnyel egészíti ki.

n:attribútumok

Minden páros tag, például {if} … {/if}, amely egyetlen HTML elemen működik, átírható n:attribútum formájába. Így lehetne például leírni a {foreach}-et is a bevezető példában:

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

A funkcionalitás ekkor arra a HTML elemre vonatkozik, amelybe elhelyezték:

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

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

kiírja:

<p>Én</p>
<p>♥</p>
<p>Latte</p>

Az inner- előtag segítségével módosíthatjuk a viselkedést úgy, hogy az csak az elem belső részére vonatkozzon:

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

Kiírja:

<div>
	<p>Én</p>
	<hr>
	<p>♥</p>
	<hr>
	<p>Latte</p>
	<hr>
</div>

Vagy a tag- előtag segítségével a funkcionalitást csak magukra a HTML tagekre alkalmazzuk:

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

Ami a $url változótól függően írja ki:

{* ha $url üres *}
<p>Cím</p>

{* ha $url 'https://nette.org'-ot tartalmaz *}
<p><a href="https://nette.org">Cím</a></p>

Azonban az n:attribútumok nemcsak a páros tagek rövidítései. Léteznek tiszta n:attribútumok is, mint például a n:href vagy a kódoló rendkívül ügyes segítője, a n:class.

Szűrők

Tekintse meg a standard szűrők áttekintését.

A szűrőket függőleges vonal után írjuk (előtte lehet szóköz):

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

A szűrőket láncolni lehet, és balról jobbra kerülnek alkalmazásra:

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

A paramétereket a szűrő neve után adjuk meg, kettősponttal vagy vesszővel elválasztva:

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

A szűrőket kifejezésre is lehet alkalmazni:

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

Blokkra:

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

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

<h1>{='  Helló világ  '|trim}<h1>

Dinamikus HTML tagek

A Latte támogatja a dinamikus HTML tageket, amelyek hasznosak, ha rugalmasságra van szükség a tagnevekben:

<h{$level}>Címsor</h{$level}>

A fenti kód például <h1>Címsor</h1> vagy <h2>Címsor</h2> kódot generálhat a $level változó értékétől függően. A dinamikus HTML tageknek a Latte-ban mindig párosnak kell lenniük. Alternatívájuk a n:tag.

Mivel a Latte egy biztonságos sablonrendszer, ellenőrzi, hogy az eredményül kapott tagnév érvényes-e, és nem tartalmaz-e nem kívánt vagy káros értékeket. Továbbá biztosítja, hogy a záró tag neve mindig megegyezzen a nyitó tag nevével.

Kommentárok

A kommentárokat így írjuk, és nem kerülnek be a kimenetbe:

{* ez egy kommentár Latte-ban *}

A tageken belül működnek a PHP kommentárok:

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

Szintaktikai cukor

Stringek idézőjelek nélkül

Egyszerű stringeknél elhagyhatók az idézőjelek:

mint PHP-ban:  {var $arr = ['helló', 'btn--default', '€']}

rövidítve:    {var $arr = [helló, btn--default, €]}

Egyszerű stringek azok, amelyek tisztán betűkből, számjegyekből, aláhúzásokból, kötőjelekből és pontokból állnak. Nem kezdődhetnek számjeggyel, és nem kezdődhetnek vagy végződhetnek kötőjellel. Nem állhatnak csak nagybetűkből és aláhúzásokból, mert akkor konstansnak minősülnek (pl. PHP_VERSION). És nem ütközhetnek a kulcsszavakkal: and, array, clone, default, false, in, instanceof, new, null, or, return, true, xor.

Konstansok

Mivel az egyszerű stringeknél elhagyhatók az idézőjelek, javasoljuk, hogy a megkülönböztetés érdekében a globális konstansokat perjellel kezdve írja:

{if \PROJECT_ID === 1} ... {/if}

Ez az írásmód teljesen érvényes magában a PHP-ban is, a perjel azt jelzi, hogy a konstans a globális névtérben van.

Rövidített ternáris operátor

Ha a ternáris operátor harmadik értéke üres, elhagyható:

mint PHP-ban:  {$stock ? 'Raktáron' : ''}

rövidítve:    {$stock ? 'Raktáron'}

Kulcsok modern írásmódja tömbökben

A tömbök kulcsait hasonlóan lehet írni, mint a névvel ellátott paramétereket a függvényhívásoknál:

mint PHP-ban:  {var $arr = ['one' => 'elem 1', 'two' => 'elem 2']}

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

Szűrők

A szűrőket bármilyen kifejezésre lehet alkalmazni, csak az egészet zárójelek közé kell tenni:

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

Az in operátor

Az in operátorral helyettesíthető az in_array() függvény. Az összehasonlítás mindig szigorú:

{* az in_array($item, $items, true) megfelelője *}
{if $item in $items}
	...
{/if}

Történelmi kitekintő

A Latte története során számos szintaktikai cukorkával állt elő, amelyek néhány év múlva magában a PHP-ban is megjelentek. Például a Latte-ban már régen lehetett tömböket [1, 2, 3] formában írni az array(1, 2, 3) helyett, vagy használni a nullsafe operátort $obj?->foo, mielőtt ez magában a PHP-ban lehetséges lett volna. A Latte bevezette a tömb kibontására szolgáló (expand) $arr operátort is, amely a mai PHP ...$arr operátorának felel meg.

Az Undefined-safe operátor ??->, amely a nullsafe operátor ?-> megfelelője, de nem vált ki hibát, ha a változó nem létezik, történelmi okokból jött létre, és ma a standard PHP ?-> operátor használatát javasoljuk.

PHP korlátozások Latte-ban

Latte-ban csak PHP kifejezéseket lehet írni. Tehát nem lehet pontosvesszővel lezárt utasításokat használni. Nem lehet osztályokat deklarálni vagy vezérlési struktúrákat használni, pl. if, foreach, switch, return, try, throw és másokat, amelyek helyett a Latte saját tageket kínál. Szintén nem lehet attribútumokat, backtickeket vagy néhány mágikus konstanst használni. Nem használható az unset, echo, include, require, exit, eval sem, mert ezek nem függvények, hanem speciális PHP nyelvi konstrukciók, és ezért nem kifejezések. A kommentárok közül csak a többsoros /* ... */ támogatott.

Ezeket a korlátozásokat azonban meg lehet kerülni a RawPhpExtension bővítmény aktiválásával, amely lehetővé teszi bármilyen PHP kód használatát a {php ...} tagben a sablon szerzőjének felelősségére.

verzió: 3.0