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:
- változók
- stringek (beleértve a HEREDOC és NOWDOC), tömbök, számok stb.
- operátorok
- függvény- és metódushívások (amelyeket sandboxszal lehet korlátozni)
- match
- névtelen függvények
- callbackek
- többsoros kommentárok
/* ... */
- stb…
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.