Latte tagek

A Latte sablonrendszer összes tagjének áttekintése és leírása, amelyek alapértelmezés szerint rendelkezésre állnak.

Kiírás
{$var}, {...} vagy {=...} kiírja az escapelt változót vagy kifejezést
{$var|filter} szűrők használatával írja ki
{l} vagy {r} kiírja a { vagy } karaktert
Feltételek
{if}{elseif}{else}{/if} if feltétel
{ifset}{elseifset}{/ifset} ifset feltétel
{ifchanged}{/ifchanged} teszteli, hogy történt-e változás
{switch} {case} {default} {/switch} switch feltétel
n:else alternatív tartalom feltételekhez
Ciklusok
{foreach}{/foreach} foreach
{for}{/for} for
{while}{/while} while
{continueIf $cond} folytatás a következő iterációval
{skipIf $cond} iteráció kihagyása
{breakIf $cond} ciklus megszakítása
{exitIf $cond} korai kilépés
{first}{/first} ez az első futás?
{last}{/last} ez az utolsó futás?
{sep}{/sep} lesz még következő futás?
{iterateWhile}{/iterateWhile} strukturált foreach
$iterator speciális változó a foreach-en belül
További sablonok beillesztése
{include 'file.latte'} betölti a sablont egy másik fájlból
{sandbox 'file.latte'} betölti a sablont sandbox módban
Blokkok, elrendezések, sablonöröklődés
{block} névtelen blokk
{block blockname} definiál egy blokkot
{define blockname} definiál egy blokkot későbbi használatra
{include blockname} blokk megjelenítése
{include blockname from 'file.latte'} megjeleníti a blokkot egy fájlból
{import 'file.latte'} betölti a blokkokat egy sablonból
{layout 'file.latte'} / {extends} meghatározza a layout fájlt
{embed}{/embed} betölt egy sablont vagy blokkot és lehetővé teszi a blokkok felülírását
{ifset blockname}{/ifset} feltétel, hogy létezik-e a blokk
Kivételkezelés
{try}{else}{/try} kivételek elkapása
{rollback} a try blokk eldobása
Változók
{var $foo = value} létrehoz egy változót
{default $foo = value} létrehoz egy változót, ha nem létezik
{parameters} deklarálja a változókat, típusokat és alapértelmezett értékeket
{capture}{/capture} elkapja a blokkot egy változóba
Típusok
{varType} deklarálja a változó típusát
{varPrint} javaslatot tesz a változók típusaira
{templateType} deklarálja a változók típusait egy osztály szerint
{templatePrint} javaslatot tesz egy osztályra a változók típusaival
Fordítások
{_...} kiírja a fordítást
{translate}{/translate} lefordítja a tartalmat
Egyéb
{contentType} átkapcsolja az escapelést és HTTP fejlécet küld
{debugbreak} breakpointet helyez el a kódban
{do} végrehajtja a kódot, de semmit sem ír ki
{dump} dumpolja a változókat a Tracy Bar-ba
{php} végrehajt bármilyen PHP kódot
{spaceless}{/spaceless} eltávolítja a felesleges szóközöket
{syntax} szintaxis váltás futás közben
{trace} megjeleníti a stack trace-t
HTML kódoló segédeszközök
n:class dinamikus HTML class attribútum írás
n:attr dinamikus bármilyen HTML attribútum írás
n:tag dinamikus HTML elem név írás
n:ifcontent kihagyja az üres HTML taget
Csak a Nette Frameworkben érhető el
n:href link, amelyet <a> HTML elemekben használnak
{link} kiír egy linket
{plink} kiír egy linket egy presenterhez
{control} megjelenít egy komponenst
{snippet}{/snippet} kivágat, amelyet AJAX-szal lehet küldeni
{snippetArea} burkoló kivágatokhoz
{cache}{/cache} gyorsítótárazza a sablon egy részét
Csak a Nette Forms-szal érhető el
{form}{/form} megjeleníti az űrlap tageket
{label}{/label} megjeleníti az űrlap elem címkéjét
{input} megjeleníti az űrlap elemet
{inputError} kiírja az űrlap elem hibaüzenetét
n:name életre kelti az űrlap elemet
{formContainer}{/formContainer} űrlap konténer rajzolása

Kiírás

{$var} {...} {=...}

A Latte-ban a {=...} taget használjuk bármilyen kifejezés kiírására a kimenetre. A Latte törődik a kényelmével, így ha a kifejezés változóval vagy függvényhívással kezdődik, nem szükséges az egyenlőségjelet írni. Ami a gyakorlatban azt jelenti, hogy szinte soha nem kell írni:

Név: {$name} {$surname}<br>
Kor: {date('Y') - $birth}<br>

Kifejezésként bármit leírhat, amit PHP-ból ismer. Egyszerűen nem kell új nyelvet tanulnia. Így például:

{='0' . ($num ?? $num * 3) . ', ' . PHP_VERSION}

Kérjük, ne keressen semmi értelmet az előző példában, de ha találna benne valamit, írjon nekünk :-)

Kimenet escapelése

Mi a sablonrendszer legfontosabb feladata? Megakadályozni a biztonsági réseket. És pontosan ezt teszi a Latte mindig, amikor valamit kiír. Automatikusan escapeli:

<p>{='egy < kettő'}</p>   {* kiírja: '<p>egy &lt; kettő</p>' *}

Hogy pontosak legyünk, a Latte kontextusérzékeny escapelést használ, ami olyan fontos és egyedi dolog, hogy külön fejezetet szenteltünk neki.

És mi van, ha megbízható forrásból származó HTML-kódolt tartalmat ír ki? Akkor könnyen kikapcsolható az escapelés:

{$trustedHtmlString|noescape}

A noescape szűrő helytelen használata XSS sebezhetőséghez vezethet! Soha ne használja, ha nem teljesen biztos abban, amit csinál, és hogy a kiírt string megbízható forrásból származik.

Kiírás JavaScriptben

A kontextusérzékeny escapelésnek köszönhetően csodálatosan egyszerű a változók kiírása JavaScripten belül, és a helyes escapelést a Latte elintézi.

A változó nemcsak string lehet, bármely adattípus támogatott, amely aztán JSON-ként kódolódik:

{var $foo = ['hello', true, 1]}
<script>
	alert({$foo});
</script>

Generálja:

<script>
	alert(["hello", true, 1]);
</script>

Ez az oka annak is, hogy a változó köré nem írnak idézőjeleket: a Latte a stringeknél automatikusan hozzáadja őket. És ha egy string változót egy másik stringbe szeretne beilleszteni, egyszerűen fűzze össze őket:

<script>
	alert('Hello ' + {$name} + '!');  // OK

	alert({="Hello $name!"});         // OK

	alert('Hello {$name} !');         // HIBA!
</script>

Szűrők

A kiírt kifejezést módosíthatja szűrővel. Így például egy stringet nagybetűssé alakíthatunk és maximum 30 karakterre rövidíthetünk:

{$string|upper|truncate:30}

A szűrőket a kifejezés részeire is alkalmazhatja így:

{$left . ($middle|upper) . $right}

Feltételek

{if} {elseif} {else}

A feltételek ugyanúgy viselkednek, mint PHP megfelelőik. Használhatja bennük ugyanazokat a kifejezéseket, amelyeket PHP-ból ismer, nem kell új nyelvet tanulnia.

{if $product->inStock > Stock::Minimum}
	Raktáron
{elseif $product->isOnWay()}
	Úton
{else}
	Nem elérhető
{/if}

Mint minden páros taget, úgy az {if} ... {/if} párt is lehet n:attributumként írni, például:

<p n:if="$count > 0">Raktáron {$count} darab</p>

Tudta, hogy az n:attribútumokhoz csatolhat tag- előtagot? Akkor a feltétel csak a HTML tagek kiírására vonatkozik, és a köztük lévő tartalom mindig kiíródik:

<a href="..." n:tag-if="$clickable">Hello</a>

{* kiírja 'Hello', ha $clickable hamis *}
{* kiírja '<a href="...">Hello</a>', ha $clickable igaz *}

Nagyszerű.

n:else

Ha az {if} ... {/if} feltételt n:attributumként írja, lehetősége van alternatív ágat is megadni az n:else segítségével:

<strong n:if="$count > 0">Raktáron {$count} darab</strong>

<em n:else>nem elérhető</em>

Az n:else attribútumot párban is használhatja a n:ifset, n:foreach, n:try, n:ifcontent és n:ifchanged attribútumokkal.

{/if $cond}

Talán meglepő, hogy az {if} feltételben lévő kifejezést a záró tagben is meg lehet adni. Ez olyan helyzetekben hasznos, amikor a feltétel megnyitásakor még nem ismerjük az értékét. Nevezzük ezt elhalasztott döntésnek.

Például elkezdünk kiírni egy táblázatot adatbázis-rekordokkal, és csak a kiírás befejezése után vesszük észre, hogy az adatbázisban nem volt rekord. Így a feltételt a {/if} záró tagbe tesszük, és ha nincs rekord, semmi sem íródik ki:

{if}
	<h1>Adatbázis sorainak listája</h1>

	<table>
	{foreach $resultSet as $row}
		...
	{/foreach}
	</table>
{/if isset($row)}

Ügyes, igaz?

Az elhalasztott feltételben használható {else}, de {elseif} nem.

{ifset} {elseifset}

Lásd még {ifset block}

Az {ifset $var} feltétellel megállapíthatjuk, hogy egy változó (vagy több változó) létezik-e és nem null értékű-e. Valójában ugyanaz, mint az if (isset($var)) PHP-ban. Mint minden páros taget, ezt is lehet n:attributumként írni, mutassuk be példaként:

<meta name="robots" content={$robots} n:ifset="$robots">

{ifchanged}

Az {ifchanged} ellenőrzi, hogy a változó értéke megváltozott-e a ciklus (foreach, for vagy while) utolsó iterációja óta.

Ha a tagben egy vagy több változót adunk meg, ellenőrzi, hogy valamelyikük megváltozott-e, és ennek megfelelően írja ki a tartalmat. Például a következő példa a név első betűjét írja ki címként minden alkalommal, amikor a nevek kiírása során megváltozik:

{foreach ($names|sort) as $name}
	{ifchanged $name[0]} <h2>{$name[0]}</h2> {/ifchanged}

	<p>{$name}</p>
{/foreach}

Ha azonban nem adunk meg argumentumot, a megjelenített tartalmat hasonlítja össze az előző állapotával. Ez azt jelenti, hogy az előző példában nyugodtan elhagyhatjuk az argumentumot a tagben. És természetesen használhatunk n:attributumot is:

{foreach ($names|sort) as $name}
	<h2 n:ifchanged>{$name[0]}</h2>

	<p>{$name}</p>
{/foreach}

Az {ifchanged}-en belül {else} klauzulát is meg lehet adni.

{switch} {case} {default}

Összehasonlítja az értéket több lehetőséggel. Ez a PHP-ból ismert switch feltételes utasítás megfelelője. Azonban a Latte javítja:

  • szigorú összehasonlítást (===) használ
  • nincs szüksége break-re

Tehát pontosan megegyezik a PHP 8.0-val érkező match struktúrával.

{switch $transport}
	{case train}
		Vonattal
	{case plane}
		Repülővel
	{default}
		Másképp
{/switch}

A {case} klauzula több, vesszővel elválasztott értéket is tartalmazhat:

{switch $status}
{case $status::New}<b>új tétel</b>
{case $status::Sold, $status::Unknown}<i>nem elérhető</i>
{/switch}

Ciklusok

A Latte-ban megtalálja az összes ciklust, amelyet PHP-ból ismer: foreach, for és while.

{foreach}

A ciklust pontosan ugyanúgy írjuk, mint PHP-ban:

{foreach $langs as $code => $lang}
	<span>{$lang}</span>
{/foreach}

Ezenkívül van néhány ügyes trükkje, amelyekről most beszélünk.

A Latte például ellenőrzi, hogy a létrehozott változók véletlenül nem írják-e felül az azonos nevű globális változókat. Ez megmenti azokat a helyzeteket, amikor arra számít, hogy a $lang-ban az oldal aktuális nyelve van, és nem veszi észre, hogy a foreach $langs as $lang felülírta ezt a változót.

A foreach ciklust nagyon elegánsan és tömören is le lehet írni n:attributummal:

<ul>
	<li n:foreach="$items as $item">{$item->name}</li>
</ul>

Tudta, hogy az n:attribútumokhoz csatolhat inner- előtagot? Akkor a ciklusban csak az elem belseje ismétlődik:

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

Tehát valami ilyesmi íródik ki:

<div>
	<h4>Foo</h4>
	<p>Lorem ipsum.</p>
	<h4>Bar</h4>
	<p>Sit dolor.</p>
</div>

{else}

A foreach cikluson belül megadhat egy {else} klauzulát, amelynek tartalma akkor jelenik meg, ha a ciklus üres:

<ul>
	{foreach $people as $person}
		<li>{$person->name}</li>
	{else}
		<li><em>Sajnáljuk, ebben a listában nincsenek felhasználók</em></li>
	{/foreach}
</ul>

$iterator

A foreach cikluson belül a Latte létrehozza a $iterator változót, amely segítségével hasznos információkat tudhatunk meg a folyamatban lévő ciklusról:

  • $iterator->first – ez az első futás a cikluson?
  • $iterator->last – ez az utolsó futás?
  • $iterator->counter – hányadik futás ez egytől számolva?
  • $iterator->counter0 – hányadik futás ez nullától számolva?
  • $iterator->odd – ez páratlan futás?
  • $iterator->even – ez páros futás?
  • $iterator->parent – az aktuálisat körülvevő iterátor
  • $iterator->nextValue – a következő elem a ciklusban
  • $iterator->nextKey – a következő elem kulcsa a ciklusban
{foreach $rows as $row}
	{if $iterator->first}<table>{/if}

	<tr id="row-{$iterator->counter}">
		<td>{$row->name}</td>
		<td>{$row->email}</td>
	</tr>

	{if $iterator->last}</table>{/if}
{/foreach}

A Latte okos, és a $iterator->last nemcsak tömböknél működik, hanem akkor is, ha a ciklus egy általános iterátoron fut, ahol előre nem ismert az elemek száma.

{first} {last} {sep}

Ezeket a tageket a {foreach} cikluson belül lehet használni. A {first} tartalma akkor jelenik meg, ha ez az első futás. A {last} tartalma akkor jelenik meg… kitalálja? Igen, ha ez az utolsó futás. Valójában ezek a {if $iterator->first} és {if $iterator->last} rövidítései.

A tageket elegánsan lehet n:attributumként is használni:

{foreach $rows as $row}
	{first}<h1>Nevek listája</h1>{/first}

	<p>{$row->name}</p>

	<hr n:last>
{/foreach}

A {sep} tag tartalma akkor jelenik meg, ha a futás nem az utolsó, tehát hasznos elválasztók kiírására, például vesszők a kiírt elemek között:

{foreach $items as $item} {$item} {sep}, {/sep} {/foreach}

Ez elég praktikus, igaz?

{iterateWhile}

Leegyszerűsíti a lineáris adatok csoportosítását a foreach ciklusban történő iterálás során azáltal, hogy az iterációt egy beágyazott ciklusban végzi, amíg a feltétel teljesül. Olvassa el a részletes útmutatót.

Elegánsan helyettesítheti a {first} és {last} tageket is a fenti példában:

{foreach $rows as $row}
	<table>

	{iterateWhile}
	<tr id="row-{$iterator->counter}">
		<td>{$row->name}</td>
		<td>{$row->email}</td>
	</tr>
	{/iterateWhile true}

	</table>
{/foreach}

Lásd még a batch és group szűrőket.

{for}

A ciklust pontosan ugyanúgy írjuk, mint PHP-ban:

{for $i = 0; $i < 10; $i++}
	<span>Elem {$i}</span>
{/for}

A taget n:attributumként is lehet használni:

<h1 n:for="$i = 0; $i < 10; $i++">{$i}</h1>

{while}

A ciklust ismét pontosan ugyanúgy írjuk, mint PHP-ban:

{while $row = $result->fetch()}
	<span>{$row->title}</span>
{/while}

Vagy n:attributumként:

<span n:while="$row = $result->fetch()">
	{$row->title}
</span>

Lehetséges egy változat is a feltétellel a záró tagben, amely a PHP do-while ciklusának felel meg:

{while}
	<span>{$item->title}</span>
{/while $item = $item->getNext()}

{continueIf} {skipIf} {breakIf}

Bármely ciklus vezérlésére használhatók a {continueIf ?} és {breakIf ?} tagek, amelyek a következő elemre ugranak, ill. befejezik a ciklust a feltétel teljesülésekor:

{foreach $rows as $row}
	{continueIf $row->date < $now}
	{breakIf $row->parent === null}
	...
{/foreach}

A {skipIf} tag nagyon hasonló a {continueIf}-hez, de nem növeli a $iterator->counter számlálót, így ha kiírjuk és közben kihagyunk néhány elemet, nem lesznek lyukak a számozásban. És az {else} klauzula is megjelenik, ha minden elemet kihagyunk.

<ul>
	{foreach $people as $person}
		{skipIf $person->age < 18}
		<li>{$iterator->counter}. {$person->name}</li>
	{else}
		<li><em>Sajnáljuk, ebben a listában nincsenek felnőttek</em></li>
	{/foreach}
</ul>

{exitIf}

Befejezi a sablon vagy blokk megjelenítését a feltétel teljesülésekor (ún. “early exit”).

{exitIf !$messages}

<h1>Üzenetek</h1>
<div n:foreach="$messages as $message">
   {$message}
</div>

Sablon beillesztése

{include 'file.latte'}

Lásd még {include block}

Az {include} tag betölti és megjeleníti a megadott sablont. Ha kedvenc nyelvünk, a PHP nyelvén beszélnénk, ez valami ilyesmi:

<?php include 'header.phtml'; ?>

A beillesztett sablonok nem férnek hozzá az aktív kontextus változóihoz, csak a globális változókhoz férnek hozzá.

Változókat így adhat át a beillesztett sablonnak:

{include 'template.latte', foo: 'bar', id: 123}

A sablon neve bármilyen PHP kifejezés lehet:

{include $someVar}
{include $ajax ? 'ajax.latte' : 'not-ajax.latte'}

A beillesztett tartalmat módosíthatja szűrőkkel. A következő példa eltávolít minden HTML-t és módosítja a betűméretet:

<title>{include 'heading.latte' |stripHtml|capitalize}</title>

Alapértelmezés szerint a sablonöröklődés ebben az esetben semmilyen módon nem játszik szerepet. Bár a beillesztett sablonban használhatunk blokkokat, nem történik meg a megfelelő blokkok helyettesítése abban a sablonban, amelybe beillesztjük. Gondoljon a beillesztett sablonokra mint önálló, árnyékolt oldalrészekre vagy modulokra. Ez a viselkedés megváltoztatható a with blocks módosítóval:

{include 'template.latte' with blocks}

A tagben megadott fájlnév és a lemezen lévő fájl közötti kapcsolat a loader dolga.

{sandbox}

Végfelhasználó által létrehozott sablon beillesztésekor érdemes megfontolni a sandbox módot (további információk a sandbox dokumentációjában):

{sandbox 'untrusted.latte', level: 3, data: $menu}

{block}

Lásd még {block name}

A név nélküli blokkok arra szolgálnak, hogy szűrőket alkalmazzanak a sablon egy részére. Például így lehet alkalmazni a strip szűrőt, amely eltávolítja a felesleges szóközöket:

{block|strip}
<ul>
	<li>Hello World</li>
</ul>
{/block}

Kivételkezelés

{try}

Ennek a tagnek köszönhetően rendkívül egyszerű robusztus sablonokat létrehozni.

Ha a {try} blokk megjelenítése során kivétel történik, az egész blokk eldobódik, és a megjelenítés utána folytatódik:

{try}
	<ul>
		{foreach $twitter->loadTweets() as $tweet}
  			<li>{$tweet->text}</li>
		{/foreach}
	</ul>
{/try}

Az opcionális {else} klauzula tartalma csak akkor jelenik meg, ha kivétel történik:

{try}
	<ul>
		{foreach $twitter->loadTweets() as $tweet}
  			<li>{$tweet->text}</li>
		{/foreach}
	</ul>
	{else}
	<p>Sajnáljuk, nem sikerült betölteni a tweeteket.</p>
{/try}

A taget n:attributumként is lehet használni:

<ul n:try>
	...
</ul>

Lehetőség van saját kivételkezelő handler definiálására is, például naplózás céljából.

{rollback}

A {try} blokkot manuálisan is le lehet állítani és átugrani a {rollback} segítségével. Ennek köszönhetően nem kell előre ellenőrizni az összes bemeneti adatot, és csak a megjelenítés során dönthet úgy, hogy az objektumot egyáltalán nem szeretné megjeleníteni:

{try}
<ul>
	{foreach $people as $person}
 		{skipIf $person->age < 18}
 		<li>{$person->name}</li>
	{else}
		{rollback}
	{/foreach}
</ul>
{/try}

Változók

{var} {default}

Új változókat a sablonban a {var} taggel hozunk létre:

{var $name = 'John Smith'}
{var $age = 27}

{* Többszörös deklaráció *}
{var $name = 'John Smith', $age = 27}

A {default} tag hasonlóan működik, de csak akkor hoz létre változókat, ha azok nem léteznek. Ha a változó már létezik és null értéket tartalmaz, nem íródik felül:

{default $lang = 'hu'}

Megadhat változótípusokat is. Ezek egyelőre informatívak, és a Latte nem ellenőrzi őket.

{var string $name = $article->getTitle()}
{default int $id = 0}

{parameters}

Ahogy a függvények deklarálják a paramétereiket, úgy a sablon is deklarálhatja a változóit az elején:

{parameters
	$a,
	?int $b,
	int|string $c = 10
}

Az $a és $b változók megadott alapértelmezett érték nélkül automatikusan null alapértelmezett értéket kapnak. A deklarált típusok egyelőre informatívak, és a Latte nem ellenőrzi őket.

A deklaráltakon kívül más változók nem kerülnek át a sablonba. Ebben különbözik a {default} tagtől.

{capture}

Elkapja a kimenetet egy változóba:

{capture $var}
<ul>
	<li>Hello World</li>
</ul>
{/capture}

<p>Elkapott: {$var}</p>

A taget, mint minden páros taget, n:attributumként is lehet írni:

<ul n:capture="$var">
	<li>Hello World</li>
</ul>

A HTML kimenet a $var változóba Latte\Runtime\Html objektumként kerül mentésre, hogy ne történjen nem kívánt escapelés a kiíráskor.

Egyéb

{contentType}

A taggel meghatározhatja, milyen típusú tartalmat képvisel a sablon. A lehetőségek:

  • html (alapértelmezett típus)
  • xml
  • javascript
  • css
  • calendar (iCal)
  • text

Használata fontos, mert beállítja a kontextusérzékeny escapelést, és csak így tud helyesen escapelni. Például a {contentType xml} átkapcsol XML módba, a {contentType text} teljesen kikapcsolja az escapelést.

Ha a paraméter egy teljes értékű MIME típus, mint például application/xml, akkor még a Content-Type HTTP fejlécet is elküldi a böngészőnek:

{contentType application/xml}
<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>RSS feed</title>
		<item>
			...
		</item>
	</channel>
</rss>

{debugbreak}

Jelzi azt a helyet, ahol a program futása leáll, és elindul a hibakereső, hogy a programozó megvizsgálhassa a futási környezetet, és megállapíthassa, hogy a program az elvárásoknak megfelelően működik-e. Támogatja az Xdebug-ot. Hozzáadható egy feltétel, amely meghatározza, mikor kell a programot leállítani.

{debugbreak}                {* leállítja a programot *}

{debugbreak $counter == 1}  {* leállítja a programot a feltétel teljesülésekor *}

{do}

Végrehajtja a PHP kódot, és semmit sem ír ki. Mint minden más tagnél, a PHP kód egyetlen kifejezést jelent, lásd PHP korlátozások.

{do $num++}

{dump}

Kiírja a változót vagy az aktuális kontextust.

{dump $name} {* Kiírja a $name változót *}

{dump}       {* Kiírja az összes aktuálisan definiált változót *}

Szükséges a Tracy könyvtár.

{php}

Lehetővé teszi bármilyen PHP kód végrehajtását. A taget aktiválni kell a RawPhpExtension bővítménnyel.

{spaceless}

Eltávolítja a felesleges fehér szóközt a kimenetből. Hasonlóan működik, mint a spaceless szűrő.

{spaceless}
	<ul>
		<li>Hello</li>
	</ul>
{/spaceless}

Generálja

<ul> <li>Hello</li> </ul>

A taget n:attributumként is lehet írni.

{syntax}

A Latte tageknek nem kell csak egyszerű kapcsos zárójelekkel határolva lenniük. Választhatunk más elválasztót is, akár futás közben is. Erre szolgál a {syntax …}, ahol paraméterként megadható:

  • double: {{...}}
  • off: teljesen kikapcsolja a Latte tagek feldolgozását

Az n:attribútumok használatával kikapcsolhatja a Latte-t például csak egy JavaScript blokkra:

<script n:syntax="off">
	var obj = {var: 123}; // ez már nem tag
</script>

A Latte nagyon kényelmesen használható JavaScripten belül is, csak kerülni kell az olyan konstrukciókat, mint ebben a példában, amikor a { jelet közvetlenül betű követi, lásd Latte JavaScripten vagy CSS-en belül.

Ha a Latte-t a {syntax off} segítségével kapcsolja ki (azaz taggel, nem n:attribútummal), akkor következetesen figyelmen kívül hagyja az összes taget a {/syntax}-ig.

{trace}

Kivált egy Latte\RuntimeException kivételt, amelynek stack trace-je a sablonok szellemében van. Tehát a függvény- és metódushívások helyett blokkok hívását és sablonok beillesztését tartalmazza. Ha olyan eszközt használ a kiváltott kivételek áttekinthető megjelenítésére, mint például a Tracy, áttekinthetően megjelenik a hívási verem, beleértve az összes átadott argumentumot.

HTML kódoló segédeszközök

n:class

Az n:class segítségével nagyon egyszerűen generálhat HTML class attribútumot pontosan az elképzelések szerint.

Példa: szükségem van arra, hogy az aktív elemnek active osztálya legyen:

{foreach $items as $item}
	<a n:class="$item->isActive() ? active">...</a>
{/foreach}

Továbbá, hogy az első elemnek first és main osztálya legyen:

{foreach $items as $item}
	<a n:class="$item->isActive() ? active, $iterator->first ? 'first main'">...</a>
{/foreach}

És minden elemnek legyen list-item osztálya:

{foreach $items as $item}
	<a n:class="$item->isActive() ? active, $iterator->first ? 'first main', list-item">...</a>
{/foreach}

Csodálatosan egyszerű, igaz?

n:attr

Az n:attr attribútum ugyanolyan eleganciával tud generálni bármilyen HTML attribútumot, mint a n:class.

{foreach $data as $item}
	<input type="checkbox" n:attr="value: $item->getValue(), checked: $item->isActive()">
{/foreach}

A visszaadott értékektől függően kiírja pl.:

<input type="checkbox">

<input type="checkbox" value="Hello">

<input type="checkbox" value="Hello" checked>

n:tag

Az n:tag attribútum dinamikusan tudja megváltoztatni a HTML elem nevét.

<h1 n:tag="$heading" class="main">{$title}</h1>

Ha $heading === null, akkor változatlanul a <h1> tag íródik ki. Ellenkező esetben az elem neve a változó értékére változik, tehát $heading === 'h3' esetén kiíródik:

<h3 class="main">...</h3>

Mivel a Latte egy biztonságos sablonrendszer, ellenőrzi, hogy az új tagnév érvényes-e, és nem tartalmaz-e nem kívánt vagy káros értékeket.

n:ifcontent

Megakadályozza, hogy üres HTML elem íródjon ki, azaz olyan elem, amely semmit sem tartalmaz a szóközökön kívül.

<div>
	<div class="error" n:ifcontent>{$error}</div>
</div>

A $error változó értékétől függően írja ki:

{* $error = '' *}
<div>
</div>

{* $error = 'Kötelező' *}
<div>
	<div class="error">Kötelező</div>
</div>

Fordítások

Ahhoz, hogy a fordítási tagek működjenek, aktiválni kell a fordítót. A fordításhoz használhatja a translate szűrőt is.

{_...}

Értékeket fordít más nyelvekre.

<a href="basket">{_'Kosár'}</a>
<span>{_$item}</span>

A fordítónak további paramétereket is át lehet adni:

<a href="basket">{_'Kosár', domain: order}</a>

{translate}

Lefordítja a sablon részeit:

<h1>{translate}Rendelés{/translate}</h1>

{translate domain: order}Lorem ipsum ...{/translate}

A taget n:attributumként is lehet írni, az elem belsejének fordításához:

<h1 n:translate>Rendelés</h1>
verzió: 3.0