Nette Documentation Preview

syntax
Latte címkék
************

.[perex]
Az összes beépített Latte-címke összefoglalása és leírása.

.[table-latte-tags language-latte]
|## Nyomtatás
| `{$var}`, `{...}` vagy `{=...}` | [nyomtat egy szkanderezett változót vagy kifejezést |#printing]
| `{$var\|filter}` | [nyomtatás szűrőkkel |#filters]
| `{l}` vagy `{r}` | kinyomtatja a `{` or `}` karaktert.

.[table-latte-tags language-latte]
|## Feltételek
| `{if}`... `{elseif}`... `{else}`... `{/if}` | [condition if |#if-elseif-else]
| `{ifset}`... `{elseifset}`... `{/ifset}` | [feltétel ifset |#ifset-elseifset]
| `{ifchanged}`... `{/ifchanged}` | [tesztelés, hogy történt-e változás |#ifchanged]
| `{switch}` `{case}` `{default}` `{/switch}` | [condition switch |#switch-case-default]
| `n:else` | [alternatív tartalom a feltételekhez |#n:else]

.[table-latte-tags language-latte]
|## Loops
| `{foreach}`... `{/foreach}` | [foreach |#foreach]
| `{for}`... `{/for}` | [for |#for]
| `{while}`... `{/while}` | [while |#while]
| `{continueIf $cond}` | [folytatás a következő iterációhoz |#continueif-skipif-breakif]
| `{skipIf $cond}` | [kihagyja az aktuális ciklus iterációját |#continueif-skipif-breakif]
| `{breakIf $cond}` | [a ciklus megszakítása |#continueif-skipif-breakif]
| `{exitIf $cond}` | [korai kilépés |#exitif]
| `{first}`... `{/first}` | [ez az első iteráció? |#first-last-sep]
| `{last}`... `{/last}` | [ez az utolsó ismétlés? |#first-last-sep]
| `{sep}`... `{/sep}` | [Következik a következő ismétlés? |#first-last-sep]
| `{iterateWhile}`... `{/iterateWhile}` | [strukturált foreach |#iterateWhile]
| `$iterator` | [speciális változó a foreach cikluson belül |#$iterator]

.[table-latte-tags language-latte]
|## Más sablonok bevonása
| `{include 'file.latte'}` | [más fájlból származó sablont tartalmaz |#include]
| `{sandbox 'file.latte'}` | [sablon felvétele sandbox módban |#sandbox]

.[table-latte-tags language-latte]
|## Blokkok, elrendezések, sablonöröklés
| `{block}` | [névtelen blokk |#block]
| `{block blockname}` | [blokkdefiníció |template-inheritance#blocks]
| `{define blockname}` | [blokkdefiníció jövőbeli használatra |template-inheritance#definitions]
| `{include blockname}` | [nyomtatási blokk |template-inheritance#printing-blocks]
| `{include blockname from 'file.latte'}` | [blokk nyomtatása fájlból |template-inheritance#printing-blocks]
| `{import 'file.latte'}` | [blokkok betöltése egy másik sablonból |template-inheritance#horizontal-reuse]
| `{layout 'file.latte'}` / `{extends}` | [elrendezési fájl megadása |template-inheritance#layout-inheritance]
| `{embed}`... `{/embed}` | [betölti a sablont vagy a blokkot, és lehetővé teszi a blokkok felülírását |template-inheritance#unit-inheritance]
| `{ifset blockname}`... `{/ifset}` | [feltétel, ha a blokk definiálva van |template-inheritance#checking-block-existence]

.[table-latte-tags language-latte]
|## Kivételkezelés
| `{try}`... `{else}`... `{/try}` | [kivételek kezelése |#try]
| `{rollback}` | [elveti a try blokkot |#rollback]

.[table-latte-tags language-latte]
|## Változók
| `{var $foo = value}` | [változó létrehozása |#var-default]
| `{default $foo = value}` | [alapértelmezett érték, ha a változót nem deklarálták |#var-default]
| `{parameters}` | [változók deklarálása, alapértelmezett értékek beírása |#parameters]
| `{capture}`... `{/capture}` | [egy szakasz rögzítése egy változóhoz |#capture]

.[table-latte-tags language-latte]
|## Típusok
| `{varType}` | [a változó típusának deklarálása |type-system#varType]
| `{varPrint}` | [Javasolja a változók típusait |type-system#varPrint]
| `{templateType}` | [a változók típusainak deklarálása osztály használatával |type-system#templateType]
| `{templatePrint}` | [osztályt generál tulajdonságokkal |type-system#templatePrint]

.[table-latte-tags language-latte]
|## Fordítás
| `{_string}` | [lefordítva nyomtat |#Translation]
| `{translate}`... `{/translate}` | [lefordítja a tartalmat |#Translation]

.[table-latte-tags language-latte]
|## Egyéb
| `{contentType}` | [átkapcsolja az escaping módot és elküldi a HTTP fejlécet |#contenttype]
| `{debugbreak}` | [töréspontot állít a kódhoz |#debugbreak]
| `{do}` | [kiértékel egy kifejezést nyomtatás nélkül |#do]
| `{dump}` | [a változókat a Tracy Bar-ba dobja ki |#dump]
| `{php}` | [bármilyen PHP kódot végrehajt |#php]
| `{spaceless}`... `{/spaceless}` | [eltávolítja a felesleges szóközöket |#spaceless]
| `{syntax}` | [futás közben váltja a szintaxist |#syntax]
| `{trace}` | [megjeleníti a veremkövetést |#trace]

.[table-latte-tags language-latte]
|## HTML tag-segédprogramok
| `n:class` | [smart class attribútum |#n:class]
| `n:attr` | [intelligens HTML attribútumok |#n:attr]
| `n:tag` | [HTML elem dinamikus neve |#n:tag]
| `n:ifcontent` | [Üres HTML tag elhagyása |#n:ifcontent]

.[table-latte-tags language-latte]
|## Csak a Nette keretrendszerben érhető el
| `n:href` | [hivatkozás a `<a>` HTML-elemekben |application:creating-links#In the Presenter Template]
| `{link}` | [linket nyomtat |application:creating-links#In the Presenter Template]
| `{plink}` | [bemutatóra mutató link nyomtatása |application:creating-links#In the Presenter Template]
| `{control}` | [komponens nyomtatása |application:components#Rendering]
| `{snippet}`... `{/snippet}` | [AJAX-szel küldhető sablonrészlet |application:ajax#snippets-in-latte]
| `{snippetArea}` | [snippet borítékolás |application:ajax#snippet-areas]
| `{cache}`... `{/cache}` | [egy sablonrészlet gyorsítótárba helyezése |caching:#caching-in-latte]

.[table-latte-tags language-latte]
|## Csak Nette Forms esetén érhető el
| `{form}`... `{/form}` | [nyomtat egy űrlapelemet |forms:rendering#form]
| `{label}`... `{/label}` | [nyomtat egy űrlap beviteli címkét |forms:rendering#label-input]
| `{input}` | [nyomtat egy űrlap beviteli elemet |forms:rendering#label-input]
| `{inputError}` | [hibaüzenetet nyomtat az űrlap beviteli eleméhez |forms:rendering#inputError]
| `n:name` | [HTML beviteli elem aktiválása |forms:rendering#n:name]
| `{formContainer}`... `{/formContainer}` | [az űrlap tárolójának renderelése |forms:rendering#special-cases]


Nyomtatás .[#toc-printing]
==========================


`{$var}` `{...}` `{=...}`
-------------------------

A Latte a `{=...}` címkét használja bármely kifejezés kimeneti kiadására. Ha a kifejezés változóval vagy függvényhívással kezdődik, nem szükséges egyenlőségjelet írni. Ami a gyakorlatban azt jelenti, hogy szinte soha nem kell kiírni:

```latte
Name: {$name} {$surname}<br>
Age: {date('Y') - $birth}<br>
```

Bármit leírhatsz kifejezésként, amit a PHP-ból ismersz. Csak nem kell megtanulnod egy új nyelvet. Például:


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

Kérjük, ne keressenek értelmet az előző példában, de ha találnak benne, írják meg nekünk :-)


Kimenet menekülése .[#toc-escaping-output]
------------------------------------------

Mi a sablonrendszer legfontosabb feladata? A biztonsági rések elkerülése. És pontosan ezt teszi a Latte, amikor valamit a kimenetre nyomtat. Automatikusan mindent elrejt:

```latte
<p>{='one < two'}</p>   {* prints: '<p>one &lt; two</p>' *}
```

Pontosabban, a Latte kontextusfüggő eszkópálást használ, ami olyan fontos és egyedülálló funkció, hogy [külön fejezetet |safety-first#context-aware-escaping] szenteltünk neki.

És ha megbízható forrásból származó HTML-kódolt tartalmat nyomtat? Akkor egyszerűen kikapcsolhatja az escapinget:

```latte
{$trustedHtmlString|noescape}
```

.[warning]
A `noescape` szűrő visszaélésszerű használata XSS sebezhetőséghez vezethet! Soha ne használd, hacsak nem vagy **teljesen biztos** abban, hogy mit csinálsz, és hogy a nyomtatott karakterlánc megbízható forrásból származik.


Nyomtatás JavaScriptben .[#toc-printing-in-javascript]
------------------------------------------------------

A kontextusérzékeny escapingnek köszönhetően csodálatosan egyszerű a változók JavaScripten belüli nyomtatása, és a Latte megfelelően kikerüli őket.

A változónak nem kell sztringnek lennie, bármilyen adattípus támogatott, amit aztán JSON-ként kódol:

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

Generál:

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

Ez az oka annak is, hogy **nem szabad a változót idézőjelbe tenni**: Latte a karakterláncok köré teszi őket. Ha pedig egy stringváltozót egy másik stringbe akarsz tenni, egyszerűen kapcsold össze őket:

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

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

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


Szűrők .[#toc-filters]
----------------------

A nyomtatott kifejezés [szűrőkkel |syntax#filters] módosítható. Ez a példa például a karakterláncot nagybetűvé alakítja, és legfeljebb 30 karakterre rövidíti:

```latte
{$string|upper|truncate:30}
```

A kifejezés részeire is alkalmazhat szűrőket az alábbiak szerint:

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


Feltételek .[#toc-conditions]
=============================


`{if}` `{elseif}` `{else}`
--------------------------

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

```latte
{if $product->inStock > Stock::Minimum}
	In stock
{elseif $product->isOnWay()}
	On the way
{else}
	Not available
{/if}
```

Mint minden páros tag, a `{if} ... {/ if}` párja is leírható például [n:attribútumként |syntax#n:attributes]:

```latte
<p n:if="$count > 0">In stock {$count} items</p>
```

Tudtad, hogy az n:attribútumokhoz hozzáadhatod a `tag-` előtagot? Ekkor a feltétel csak a HTML-címkéket érinti, és a köztük lévő tartalom mindig ki lesz nyomtatva:

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

{* prints 'Hello' when $clickable is falsey *}
{* prints '<a href="...">Hello</a>' when $clickable is truthy *}
```

Szép.


`n:else` .{data-version:3.0.11}
-------------------------------

Ha a `{if} ... {/if}` feltételt [n:attribútum |syntax#n:attributes] formájában írja, akkor lehetősége van a `n:else` segítségével egy alternatív ágat is megadni:

```latte
<strong n:if="$count > 0">In stock {$count} items</strong>

<em n:else>not available</em>
```

A `n:else` attribútum a következővel együtt is használható [`n:ifset` |#ifset-elseifset], [`n:foreach` |#foreach], [`n:try` |#try], [`n:ifcontent` |#n:ifcontent], és [`n:ifchanged` |#ifchanged].


`{/if $cond}`
-------------

Meglepő lehet, hogy a `{if}` feltételben szereplő kifejezést a végtagban is meg lehet adni. Ez olyan helyzetekben hasznos, amikor a tag megnyitásakor még nem ismerjük a feltétel értékét. Nevezzük ezt halasztott döntésnek.

Például elkezdünk listázni egy táblázatot rekordokkal az adatbázisból, és csak a jelentés befejezése után vesszük észre, hogy nem volt rekord az adatbázisban. Ezért a `{/if}` címke végére feltételt teszünk, és ha nincs rekord, akkor egyik sem kerül kiírásra:

```latte
{if}
	<h1>Printing rows from the database</h1>

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

Praktikus, ugye?

A `{else}` a halasztott feltételben is használható, de a `{elseif}` nem.


`{ifset}` `{elseifset}`
-----------------------

.[note]
Lásd még [`{ifset block}` |template-inheritance#checking-block-existence]

A `{ifset $var}` feltétel segítségével meghatározhatja, hogy egy változó (vagy több változó) létezik-e, és van-e nem null értékű értéke. Ez tulajdonképpen ugyanaz, mint a `if (isset($var))` a PHP-ben. Mint minden páros tag, ez is leírható [n:attribútum |syntax#n:attributes] formában, ezért mutassuk meg példában:

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


`{ifchanged}`
-------------

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

Ha egy vagy több változót adunk meg a címkében, akkor ellenőrzi, hogy valamelyik változott-e, és ennek megfelelően kiírja a tartalmát. A következő példa például a nevek felsorolásakor minden egyes változáskor a név első betűjét írja ki címként:

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

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

Ha azonban nem adunk meg argumentumot, akkor maga a megjelenített tartalom kerül ellenőrzésre a korábbi állapothoz képest. Ez azt jelenti, hogy az előző példában nyugodtan elhagyhatjuk az argumentumot a címkében. És természetesen használhatjuk az [n:attribute-ot |syntax#n:attributes] is:

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

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

`{else}` záradékot is beilleszthetünk a `{ifchanged}` belsejébe.


`{switch}` `{case}` `{default}`
-------------------------------
Összehasonlítja az értéket több opcióval. Ez hasonló a PHP-ből ismert `switch` struktúrához. A Latte azonban továbbfejleszti:

- szigorú összehasonlítást használ (`===`)
- nem igényel `break`

Tehát ez pontosan megegyezik a PHP 8.0-ban található `match` struktúrával.

```latte
{switch $transport}
	{case train}
		By train
	{case plane}
		By plane
	{default}
		Differently
{/switch}
```

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

```latte
{switch $status}
{case $status::New}<b>new item</b>
{case $status::Sold, $status::Unknown}<i>not available</i>
{/switch}
```


Hurok .[#toc-loops]
===================

A Latte-ban a PHP-ból ismert ciklusok állnak rendelkezésedre: foreach, for és while.


`{foreach}`
-----------

A ciklust pontosan ugyanúgy írja meg, mint a PHP-ben:

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

Ezen kívül van néhány praktikus csípése, amiről most beszélni fogunk.

Például Latte ellenőrzi, hogy a létrehozott változók véletlenül se írják felül az azonos nevű globális változókat. Ez megmenti Önt, amikor feltételezi, hogy a `$lang` az oldal aktuális nyelve, és nem veszi észre, hogy a `foreach $langs as $lang` felülírta az adott változót.

A foreach ciklus is nagyon elegánsan és gazdaságosan írható meg az [n:attribútummal |syntax#n:attributes]:

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

Tudtad, hogy az n:attribútumokhoz a `inner-` előtagot is be lehet illeszteni? Most akkor csak az elem belső része fog ismétlődni a ciklusban:

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

Tehát valami ilyesmit ír ki:

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


`{else}` .{toc: foreach-else}
-----------------------------

A `foreach` ciklushoz választható egy opcionális `{else}` záradék, amelynek szövege akkor jelenik meg, ha a megadott tömb üres:

```latte
<ul>
	{foreach $people as $person}
		<li>{$person->name}</li>
	{else}
		<li><em>Sorry, no users in this list</em></li>
	{/foreach}
</ul>
```


`$iterator`
-----------

A `foreach` cikluson belül a `$iterator` változót inicializáljuk. Az aktuális ciklusra vonatkozó fontos információkat tárolja.

- `$iterator->first` - ez az első iteráció?
- `$iterator->last` - ez az utolsó iteráció?
- `$iterator->counter` - iterációs számláló, 1-től kezdődik.
- `$iterator->counter0` - iterációs számláló, 0-ról indul.
- `$iterator->odd` - ez az iteráció páratlan?
- `$iterator->even` - ez az iteráció páros?
- `$iterator->parent` - az aktuális iterátort körülvevő iterátor.
- `$iterator->nextValue` - a ciklus következő eleme
- `$iterator->nextKey` - a ciklus következő elemének kulcsa.


```latte
{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 láta okos és a `$iterator->last` nemcsak tömbök esetén működik, hanem akkor is, ha a ciklus egy általános iterátoron fut át, ahol az elemek száma nem ismert előre.


`{first}` `{last}` `{sep}`
--------------------------

Ezek a címkék a `{foreach}` cikluson belül használhatók. A `{first}` tartalma az első menetben kerül megjelenítésre.
A `{last}` tartalma renderelésre kerül ... kitalálod? Igen, az utolsó lépésnél. Ezek valójában a `{if $iterator->first}` és a `{if $iterator->last}` rövidítései.

A címkék [n:attribútumként |syntax#n:attributes] is leírhatók:

```latte
{foreach $rows as $row}
	{first}<h1>List of names</h1>{/first}

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

	<hr n:last>
{/foreach}
```

A `{sep}` tartalma akkor kerül megjelenítésre, ha az iteráció nem az utolsó, így alkalmas olyan elhatárolójelek, mint például a felsorolt elemek közötti vesszők kiírására:

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

Ez elég praktikus, nem igaz?


`{iterateWhile}`
----------------

Egyszerűsíti a lineáris adatok csoportosítását a foreach ciklusban történő iteráció során azáltal, hogy az iterációt egy beágyazott ciklusban hajtja végre, amíg a feltétel teljesül. [Olvassa el az utasításokat a szakácskönyvben |cookbook/iteratewhile].

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

```latte
{foreach $rows as $row}
	<table>

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

	</table>
{/foreach}
```


`{for}`
-------

A ciklust pontosan ugyanúgy írjuk le, mint a PHP-ben:

```latte
{for $i = 0; $i < 10; $i++}
	<span>Item #{$i}</span>
{/for}
```

A címkét [n:attribútumként |syntax#n:attributes] is írhatjuk:

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


`{while}`
---------

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

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

Vagy [n:attribútumként |syntax#n:attributes]:

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

A végtagban lévő feltétellel rendelkező változat megfelel a do-while ciklusnak a PHP-ban:

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


`{continueIf}` `{skipIf}` `{breakIf}`
-------------------------------------

Vannak speciális címkék, amelyekkel bármely ciklus vezérlésére használhatod - `{continueIf ?}` és `{breakIf ?}`, amelyek a feltételek teljesülése esetén a következő iterációra ugranak, illetve befejezik a kört:

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


A `{skipIf}` címke nagyon hasonlít a `{continueIf}` címkéjéhez, de nem növeli a számlálót. Így nem keletkeznek lyukak a számozásban, ha a `$iterator->counter` kiírásával néhány elemet kihagyunk. A {else} záradék is megjelenik, ha minden elemet kihagyunk.

```latte
<ul>
	{foreach $people as $person}
		{skipIf $person->age < 18}
		<li>{$iterator->counter}. {$person->name}</li>
	{else}
		<li><em>Sorry, no adult users in this list</em></li>
	{/foreach}
</ul>
```


`{exitIf}` .{data-version:3.0.5}
--------------------------------

Befejezi egy sablon vagy blokk megjelenítését, ha egy feltétel teljesül (azaz "korai kilépés").

```latte
{exitIf !$messages}

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


Beleértve a sablonokat .[#toc-including-templates]
==================================================


`{include 'file.latte'}` .{toc: include}
----------------------------------------

.[note]
Lásd még [`{include block}` |template-inheritance#printing-blocks]

A `{include}` címke betölti és megjeleníti a megadott sablont. Kedvenc PHP nyelvünkön ez így hangzik:

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

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

A beillesztett sablonhoz a következő módon adhat át változókat:

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

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

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

A beillesztett tartalom [szűrőkkel |syntax#filters] módosítható. A következő példa eltávolít minden HTML-t és beállítja az esetet:

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

A [sablon öröklés |template inheritance] **nem vesz részt** ebben alapértelmezés szerint. Bár blokkcímkéket adhat hozzá a bevont sablonokhoz, ezek nem fogják helyettesíteni a megfelelő blokkokat abban a sablonban, amelybe bevonták őket. Gondoljon az inklúziókra úgy, mint az oldalak vagy modulok független és árnyékolt részeire. Ez a viselkedés a `with blocks` módosítóval módosítható:

```latte
{include 'template.latte' with blocks}
```

A címkében megadott fájlnév és a lemezen lévő fájl közötti kapcsolat a [betöltő |extending-latte#Loaders] függvénye.


`{sandbox}`
-----------

Ha egy végfelhasználó által létrehozott sablont vesz fel, fontolja meg a sandboxolást (további információ a [sandbox dokumentációban |sandbox]):

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


`{block}`
=========

.[note]
Lásd még [`{block name}` |template-inheritance#blocks]

A név nélküli blokkok arra szolgálnak, hogy [szűrőket |syntax#filters] alkalmazhassunk a sablon egy részére. Például alkalmazhat egy [csíkszűrőt |filters#strip] a felesleges szóközök eltávolítására:

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


Kivételkezelés .[#toc-exception-handling]
=========================================


`{try}`
-------

Ez a címke rendkívül megkönnyíti a robusztus sablonok készítését.

Ha a `{try}` blokk renderelése közben kivétel lép fel, az egész blokk elvetésre kerül, és a renderelés utána folytatódik:

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

A `{else}` opcionális záradék tartalma csak akkor kerül renderelésre, ha kivétel történik:

```latte
{try}
	<ul>
		{foreach $twitter->loadTweets() as $tweet}
  			<li>{$tweet->text}</li>
		{/foreach}
	</ul>
	{else}
	<p>Sorry, the tweets could not be loaded.</p>
{/try}
```

A címke [n:attribútumként |syntax#n:attributes] is írható:

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

Lehetőség van [saját kivételkezelő |develop#exception handler] definiálására is, pl. naplózáshoz:


`{rollback}`
------------

A `{try}` blokk manuálisan is megállítható és kihagyható a `{rollback}` segítségével. Így nem kell előre ellenőrizni az összes bemeneti adatot, és csak a renderelés során lehet eldönteni, hogy van-e értelme renderelni az objektumot.

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


Változók .[#toc-variables]
==========================


`{var}` `{default}`
-------------------

A sablonban új változókat hozunk létre a `{var}` címkével:

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

{* Többszörös nyilatkozat *}
{var $name = 'John Smith', $age = 27}
```

A `{default}` címke hasonlóan működik, azzal a különbséggel, hogy csak akkor hoz létre változókat, ha azok nem léteznek:

```latte
{default $lang = 'cs'}
```

A [változók típusait |type-system] is megadhatja. Ezek egyelőre tájékoztató jellegűek, és a Latte nem ellenőrzi őket.

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


`{parameters}`
--------------

Ahogyan egy függvény deklarálja a paramétereit, úgy egy sablon is deklarálhatja a változókat az elején:

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

A `$a` és `$b` változók alapértelmezett érték nélkül automatikusan a `null` alapértelmezett értéket kapják. A deklarált típusok továbbra is tájékoztató jellegűek, és a Latte nem ellenőrzi őket.

A deklarált változókon kívül más nem kerül át a sablonba. Ez egy különbség a `{default}` címkéhez képest.


`{capture}`
-----------

A `{capture}` címke használatával a kimenetet egy változóba rögzítheti:

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

<p>Captured: {$var}</p>
```

A címke [n:attribútumként |syntax#n:attributes] is írható, mint bármelyik páros címke:

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

A HTML kimenet a `$var` változóban tárolódik `Latte\Runtime\Html` objektumként, hogy [elkerülje a nem kívánt escapinget |develop#disabling-auto-escaping-of-variable] nyomtatáskor.


Egyéb .[#toc-others]
====================


`{contentType}`
---------------

A címkével megadhatja, hogy a sablon milyen típusú tartalmat képvisel. A lehetőségek a következők:

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

Használata azért fontos, mert ez állítja be a [kontextusfüggő escapinget |safety-first#context-aware-escaping], és csak így tud a Latte helyesen menekülni. Például a `{contentType xml}` XML módba kapcsol, a `{contentType text}` pedig teljesen kikapcsolja az escapinget.

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

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


`{debugbreak}`
--------------

Megadja azt a helyet, ahol a kód végrehajtása megszakad. Hibakeresési célokra szolgál, hogy a programozó ellenőrizze a futási környezetet, és biztosítsa, hogy a kód az elvárásoknak megfelelően fut. Támogatja az [Xdebugot |https://xdebug.org]. Ezenkívül megadható egy feltétel, amikor a kódnak meg kell törnie.

```latte
{debugbreak}                {* megszakítja a programot *}

{debugbreak $counter == 1}  {* megszakítja a programot, ha a feltétel teljesül *}
```


`{do}`
------

Végrehajtja a PHP-kódot, és nem ír ki semmit. A többi címkéhez hasonlóan a PHP-kód is egyetlen kifejezés, lásd a [PHP korlátait |syntax#PHP Limitations in Latte].

```latte
{do $num++}
```


`{dump}`
--------

Egy változó vagy az aktuális kontextus kiürítése.

```latte
{dump $név} {* a $név változó kiírása *}

{dump}       {* dumps az összes definiált változót *}
```

.[caution]
A [Tracy |tracy:] csomagot igényli.


`{php}`
-------

Lehetővé teszi bármilyen PHP kód futtatását. A címkét a [RawPhpExtension |develop#RawPhpExtension] kiterjesztés használatával kell aktiválni.


`{spaceless}`
-------------

Eltávolítja a felesleges szóközöket. Hasonló a [szóköz nélküli |filters#spaceless] szűrőhöz.

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

Kimenetek:

```latte
<ul> <li>Hello</li> </ul>
```

A címke [n:attribútumként |syntax#n:attributes] is írható:


`{syntax}`
----------

A latte címkéket nem kell csak szimpla szögletes zárójelek közé zárni. Választhat más elválasztójelet is, akár futás közben is. Erre szolgál a `{syntax…}`, ahol a paraméter lehet:

- double: `{{...}}`
- off: teljesen kikapcsolja a Latte címkéket

Az n:attribútum jelölés használatával csak egy JavaScript blokk esetében tilthatjuk le a Latte-et:

```latte
<script n:syntax="off">
	var obj = {var: 123}; // this isn't a tag any more
</script>
```

A Latte nagyon kényelmesen használható JavaScript-en belül, csak kerüljük az olyan konstrukciókat, mint ebben a példában, ahol a betű közvetlenül a `{` után következik, lásd: [Latte JavaScripten vagy CSS-en belül |recipes#Latte inside JavaScript or CSS].

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


{trace}
-------

Dob egy `Latte\RuntimeException` kivételt, amelynek stack trace-je a sablonok szellemében van. Így függvények és metódusok hívása helyett blokkok hívását és sablonok beillesztését foglalja magában. Ha a dobott kivételek egyértelmű megjelenítésére szolgáló eszközt, például a [Tracy-t |tracy:] használja, akkor jól láthatóvá válik a hívási verem, beleértve az összes átadott argumentumot is.


HTML-tag-segédprogramok .[#toc-html-tag-helpers]
================================================


n:class .[#toc-n-class]
-----------------------

A `n:class` segítségével nagyon könnyen létrehozható a `class` HTML-attribútum pontosan a kívánt módon.

Példa: Az aktív elemnek a `active` osztállyal kell rendelkeznie:

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

Továbbá az első elemnek a `first` és a `main` osztályokkal kell rendelkeznie:

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

És minden elemnek a `list-item` osztállyal kell rendelkeznie:

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

Elképesztően egyszerű, nem igaz?


n:attr .[#toc-n-attr]
---------------------

A `n:attr` attribútum tetszőleges HTML-attribútumokat generálhat, ugyanolyan eleganciával, mint az [n:class |#n:class].

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

A visszaadott értékektől függően megjeleníti pl:

```latte
<input type="checkbox">

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

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


n:tag .[#toc-n-tag]
-------------------

A `n:tag` attribútum dinamikusan megváltoztathatja egy HTML-elem nevét.

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

Ha a `$heading === null`, a `<h1>` címke változatlanul kiírásra kerül. Ellenkező esetben az elem neve a változó értékére változik, így a `$heading === 'h3'` esetében azt írja ki:

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

Mivel a Latte egy biztonságos templating rendszer, ellenőrzi, hogy az új tag neve érvényes-e, és nem tartalmaz-e nem kívánt vagy rosszindulatú értékeket.


n:ifcontent .[#toc-n-ifcontent]
-------------------------------

Megakadályozza, hogy egy üres HTML-elem kiírásra kerüljön, azaz egy olyan elem, amely csak szóközöket tartalmaz.

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

A `$error` változó értékeitől függően ez kiíródik:

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

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


Fordítás .[#toc-translation]
============================

Ahhoz, hogy a fordítási címkék működjenek, be kell állítania a [fordítót |develop#TranslatorExtension]. Használhatja a [`translate` |filters#translate] szűrőt a fordításhoz.


`{_...}`
--------

Lefordítja az értékeket más nyelvekre.

```latte
<a href="basket">{_'Basket'}</a>
<span>{_$item}</span>
```

A fordítónak más paraméterek is átadhatók:

```latte
<a href="basket">{_'Basket', domain: order}</a>
```


`{translate}`
-------------

Překládá části šablony:

```latte
<h1>{translate}Order{/translate}</h1>

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

[attribútumként |syntax#n:attributes] is írható, hogy lefordítsuk az elem belsejét:

```latte
<h1 n:translate>Order</h1>
```

Latte címkék

Az összes beépített Latte-címke összefoglalása és leírása.

Nyomtatás
{$var}, {...} vagy {=...} nyomtat egy szkanderezett változót vagy kifejezést
{$var|filter} nyomtatás szűrőkkel
{l} vagy {r} kinyomtatja a { or } karaktert.
Feltételek
{if}{elseif}{else}{/if} condition if
{ifset}{elseifset}{/ifset} feltétel ifset
{ifchanged}{/ifchanged} tesztelés, hogy történt-e változás
{switch} {case} {default} {/switch} condition switch
n:else alternatív tartalom a feltételekhez
Loops
{foreach}{/foreach} foreach
{for}{/for} for
{while}{/while} while
{continueIf $cond} folytatás a következő iterációhoz
{skipIf $cond} kihagyja az aktuális ciklus iterációját
{breakIf $cond} a ciklus megszakítása
{exitIf $cond} korai kilépés
{first}{/first} ez az első iteráció?
{last}{/last} ez az utolsó ismétlés?
{sep}{/sep} Következik a következő ismétlés?
{iterateWhile}{/iterateWhile} strukturált foreach
$iterator speciális változó a foreach cikluson belül
Más sablonok bevonása
{include 'file.latte'} más fájlból származó sablont tartalmaz
{sandbox 'file.latte'} sablon felvétele sandbox módban
Blokkok, elrendezések, sablonöröklés
{block} névtelen blokk
{block blockname} blokkdefiníció
{define blockname} blokkdefiníció jövőbeli használatra
{include blockname} nyomtatási blokk
{include blockname from 'file.latte'} blokk nyomtatása fájlból
{import 'file.latte'} blokkok betöltése egy másik sablonból
{layout 'file.latte'} / {extends} elrendezési fájl megadása
{embed}{/embed} betölti a sablont vagy a blokkot, és lehetővé teszi a blokkok felülírását
{ifset blockname}{/ifset} feltétel, ha a blokk definiálva van
Kivételkezelés
{try}{else}{/try} kivételek kezelése
{rollback} elveti a try blokkot
Változók
{var $foo = value} változó létrehozása
{default $foo = value} alapértelmezett érték, ha a változót nem deklarálták
{parameters} változók deklarálása, alapértelmezett értékek beírása
{capture}{/capture} egy szakasz rögzítése egy változóhoz
Típusok
{varType} a változó típusának deklarálása
{varPrint} Javasolja a változók típusait
{templateType} a változók típusainak deklarálása osztály használatával
{templatePrint} osztályt generál tulajdonságokkal
Fordítás
{_string} lefordítva nyomtat
{translate}{/translate} lefordítja a tartalmat
Egyéb
{contentType} átkapcsolja az escaping módot és elküldi a HTTP fejlécet
{debugbreak} töréspontot állít a kódhoz
{do} kiértékel egy kifejezést nyomtatás nélkül
{dump} a változókat a Tracy Bar-ba dobja ki
{php} bármilyen PHP kódot végrehajt
{spaceless}{/spaceless} eltávolítja a felesleges szóközöket
{syntax} futás közben váltja a szintaxist
{trace} megjeleníti a veremkövetést
HTML tag-segédprogramok
n:class smart class attribútum
n:attr intelligens HTML attribútumok
n:tag HTML elem dinamikus neve
n:ifcontent Üres HTML tag elhagyása
Csak a Nette keretrendszerben érhető el
n:href hivatkozás a <a> HTML-elemekben
{link} linket nyomtat
{plink} bemutatóra mutató link nyomtatása
{control} komponens nyomtatása
{snippet}{/snippet} AJAX-szel küldhető sablonrészlet
{snippetArea} snippet borítékolás
{cache}{/cache} egy sablonrészlet gyorsítótárba helyezése
Csak Nette Forms esetén érhető el
{form}{/form} nyomtat egy űrlapelemet
{label}{/label} nyomtat egy űrlap beviteli címkét
{input} nyomtat egy űrlap beviteli elemet
{inputError} hibaüzenetet nyomtat az űrlap beviteli eleméhez
n:name HTML beviteli elem aktiválása
{formContainer}{/formContainer} az űrlap tárolójának renderelése

Nyomtatás

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

A Latte a {=...} címkét használja bármely kifejezés kimeneti kiadására. Ha a kifejezés változóval vagy függvényhívással kezdődik, nem szükséges egyenlőségjelet írni. Ami a gyakorlatban azt jelenti, hogy szinte soha nem kell kiírni:

Name: {$name} {$surname}<br>
Age: {date('Y') - $birth}<br>

Bármit leírhatsz kifejezésként, amit a PHP-ból ismersz. Csak nem kell megtanulnod egy új nyelvet. Például:

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

Kérjük, ne keressenek értelmet az előző példában, de ha találnak benne, írják meg nekünk :-)

Kimenet menekülése

Mi a sablonrendszer legfontosabb feladata? A biztonsági rések elkerülése. És pontosan ezt teszi a Latte, amikor valamit a kimenetre nyomtat. Automatikusan mindent elrejt:

<p>{='one < two'}</p>   {* prints: '<p>one &lt; two</p>' *}

Pontosabban, a Latte kontextusfüggő eszkópálást használ, ami olyan fontos és egyedülálló funkció, hogy külön fejezetet szenteltünk neki.

És ha megbízható forrásból származó HTML-kódolt tartalmat nyomtat? Akkor egyszerűen kikapcsolhatja az escapinget:

{$trustedHtmlString|noescape}

A noescape szűrő visszaélésszerű használata XSS sebezhetőséghez vezethet! Soha ne használd, hacsak nem vagy teljesen biztos abban, hogy mit csinálsz, és hogy a nyomtatott karakterlánc megbízható forrásból származik.

Nyomtatás JavaScriptben

A kontextusérzékeny escapingnek köszönhetően csodálatosan egyszerű a változók JavaScripten belüli nyomtatása, és a Latte megfelelően kikerüli őket.

A változónak nem kell sztringnek lennie, bármilyen adattípus támogatott, amit aztán JSON-ként kódol:

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

Generál:

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

Ez az oka annak is, hogy nem szabad a változót idézőjelbe tenni: Latte a karakterláncok köré teszi őket. Ha pedig egy stringváltozót egy másik stringbe akarsz tenni, egyszerűen kapcsold össze őket:

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

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

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

Szűrők

A nyomtatott kifejezés szűrőkkel módosítható. Ez a példa például a karakterláncot nagybetűvé alakítja, és legfeljebb 30 karakterre rövidíti:

{$string|upper|truncate:30}

A kifejezés részeire is alkalmazhat szűrőket az alábbiak szerint:

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

Feltételek

{if} {elseif} {else}

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

{if $product->inStock > Stock::Minimum}
	In stock
{elseif $product->isOnWay()}
	On the way
{else}
	Not available
{/if}

Mint minden páros tag, a {if} ... {/ if} párja is leírható például n:attribútumként:

<p n:if="$count > 0">In stock {$count} items</p>

Tudtad, hogy az n:attribútumokhoz hozzáadhatod a tag- előtagot? Ekkor a feltétel csak a HTML-címkéket érinti, és a köztük lévő tartalom mindig ki lesz nyomtatva:

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

{* prints 'Hello' when $clickable is falsey *}
{* prints '<a href="...">Hello</a>' when $clickable is truthy *}

Szép.

n:else

Ha a {if} ... {/if} feltételt n:attribútum formájában írja, akkor lehetősége van a n:else segítségével egy alternatív ágat is megadni:

<strong n:if="$count > 0">In stock {$count} items</strong>

<em n:else>not available</em>

A n:else attribútum a következővel együtt is használható n:ifset, n:foreach, n:try, n:ifcontent, és n:ifchanged.

{/if $cond}

Meglepő lehet, hogy a {if} feltételben szereplő kifejezést a végtagban is meg lehet adni. Ez olyan helyzetekben hasznos, amikor a tag megnyitásakor még nem ismerjük a feltétel értékét. Nevezzük ezt halasztott döntésnek.

Például elkezdünk listázni egy táblázatot rekordokkal az adatbázisból, és csak a jelentés befejezése után vesszük észre, hogy nem volt rekord az adatbázisban. Ezért a {/if} címke végére feltételt teszünk, és ha nincs rekord, akkor egyik sem kerül kiírásra:

{if}
	<h1>Printing rows from the database</h1>

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

Praktikus, ugye?

A {else} a halasztott feltételben is használható, de a {elseif} nem.

{ifset} {elseifset}

Lásd még {ifset block}

A {ifset $var} feltétel segítségével meghatározhatja, hogy egy változó (vagy több változó) létezik-e, és van-e nem null értékű értéke. Ez tulajdonképpen ugyanaz, mint a if (isset($var)) a PHP-ben. Mint minden páros tag, ez is leírható n:attribútum formában, ezért mutassuk meg példában:

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

{ifchanged}

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

Ha egy vagy több változót adunk meg a címkében, akkor ellenőrzi, hogy valamelyik változott-e, és ennek megfelelően kiírja a tartalmát. A következő példa például a nevek felsorolásakor minden egyes változáskor a név első betűjét írja ki címként:

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

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

Ha azonban nem adunk meg argumentumot, akkor maga a megjelenített tartalom kerül ellenőrzésre a korábbi állapothoz képest. Ez azt jelenti, hogy az előző példában nyugodtan elhagyhatjuk az argumentumot a címkében. És természetesen használhatjuk az n:attribute-ot is:

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

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

{else} záradékot is beilleszthetünk a {ifchanged} belsejébe.

{switch} {case} {default}

Összehasonlítja az értéket több opcióval. Ez hasonló a PHP-ből ismert switch struktúrához. A Latte azonban továbbfejleszti:

  • szigorú összehasonlítást használ (===)
  • nem igényel break

Tehát ez pontosan megegyezik a PHP 8.0-ban található match struktúrával.

{switch $transport}
	{case train}
		By train
	{case plane}
		By plane
	{default}
		Differently
{/switch}

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

{switch $status}
{case $status::New}<b>new item</b>
{case $status::Sold, $status::Unknown}<i>not available</i>
{/switch}

Hurok

A Latte-ban a PHP-ból ismert ciklusok állnak rendelkezésedre: foreach, for és while.

{foreach}

A ciklust pontosan ugyanúgy írja meg, mint a PHP-ben:

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

Ezen kívül van néhány praktikus csípése, amiről most beszélni fogunk.

Például Latte ellenőrzi, hogy a létrehozott változók véletlenül se írják felül az azonos nevű globális változókat. Ez megmenti Önt, amikor feltételezi, hogy a $lang az oldal aktuális nyelve, és nem veszi észre, hogy a foreach $langs as $lang felülírta az adott változót.

A foreach ciklus is nagyon elegánsan és gazdaságosan írható meg az n:attribútummal:

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

Tudtad, hogy az n:attribútumokhoz a inner- előtagot is be lehet illeszteni? Most akkor csak az elem belső része fog ismétlődni a ciklusban:

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

Tehát valami ilyesmit ír ki:

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

{else}

A foreach ciklushoz választható egy opcionális {else} záradék, amelynek szövege akkor jelenik meg, ha a megadott tömb üres:

<ul>
	{foreach $people as $person}
		<li>{$person->name}</li>
	{else}
		<li><em>Sorry, no users in this list</em></li>
	{/foreach}
</ul>

$iterator

A foreach cikluson belül a $iterator változót inicializáljuk. Az aktuális ciklusra vonatkozó fontos információkat tárolja.

  • $iterator->first – ez az első iteráció?
  • $iterator->last – ez az utolsó iteráció?
  • $iterator->counter – iterációs számláló, 1-től kezdődik.
  • $iterator->counter0 – iterációs számláló, 0-ról indul.
  • $iterator->odd – ez az iteráció páratlan?
  • $iterator->even – ez az iteráció páros?
  • $iterator->parent – az aktuális iterátort körülvevő iterátor.
  • $iterator->nextValue – a ciklus következő eleme
  • $iterator->nextKey – a ciklus következő elemének kulcsa.
{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 láta okos és a $iterator->last nemcsak tömbök esetén működik, hanem akkor is, ha a ciklus egy általános iterátoron fut át, ahol az elemek száma nem ismert előre.

{first} {last} {sep}

Ezek a címkék a {foreach} cikluson belül használhatók. A {first} tartalma az első menetben kerül megjelenítésre. A {last} tartalma renderelésre kerül … kitalálod? Igen, az utolsó lépésnél. Ezek valójában a {if $iterator->first} és a {if $iterator->last} rövidítései.

A címkék n:attribútumként is leírhatók:

{foreach $rows as $row}
	{first}<h1>List of names</h1>{/first}

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

	<hr n:last>
{/foreach}

A {sep} tartalma akkor kerül megjelenítésre, ha az iteráció nem az utolsó, így alkalmas olyan elhatárolójelek, mint például a felsorolt elemek közötti vesszők kiírására:

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

Ez elég praktikus, nem igaz?

{iterateWhile}

Egyszerűsíti a lineáris adatok csoportosítását a foreach ciklusban történő iteráció során azáltal, hogy az iterációt egy beágyazott ciklusban hajtja végre, amíg a feltétel teljesül. Olvassa el az utasításokat a szakácskönyvben.

Elegánsan helyettesítheti a {first} és a {last} címet 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}

{for}

A ciklust pontosan ugyanúgy írjuk le, mint a PHP-ben:

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

A címkét n:attribútumként is írhatjuk:

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

{while}

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

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

Vagy n:attribútumként:

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

A végtagban lévő feltétellel rendelkező változat megfelel a do-while ciklusnak a PHP-ban:

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

{continueIf} {skipIf} {breakIf}

Vannak speciális címkék, amelyekkel bármely ciklus vezérlésére használhatod – {continueIf ?} és {breakIf ?}, amelyek a feltételek teljesülése esetén a következő iterációra ugranak, illetve befejezik a kört:

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

A {skipIf} címke nagyon hasonlít a {continueIf} címkéjéhez, de nem növeli a számlálót. Így nem keletkeznek lyukak a számozásban, ha a $iterator->counter kiírásával néhány elemet kihagyunk. A {else} záradék is megjelenik, ha minden elemet kihagyunk.

<ul>
	{foreach $people as $person}
		{skipIf $person->age < 18}
		<li>{$iterator->counter}. {$person->name}</li>
	{else}
		<li><em>Sorry, no adult users in this list</em></li>
	{/foreach}
</ul>

{exitIf}

Befejezi egy sablon vagy blokk megjelenítését, ha egy feltétel teljesül (azaz „korai kilépés“).

{exitIf !$messages}

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

Beleértve a sablonokat

{include 'file.latte'}

Lásd még {include block}

A {include} címke betölti és megjeleníti a megadott sablont. Kedvenc PHP nyelvünkön ez így hangzik:

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

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

A beillesztett sablonhoz a következő módon adhat át változókat:

{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 tartalom szűrőkkel módosítható. A következő példa eltávolít minden HTML-t és beállítja az esetet:

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

sablon öröklés nem vesz részt ebben alapértelmezés szerint. Bár blokkcímkéket adhat hozzá a bevont sablonokhoz, ezek nem fogják helyettesíteni a megfelelő blokkokat abban a sablonban, amelybe bevonták őket. Gondoljon az inklúziókra úgy, mint az oldalak vagy modulok független és árnyékolt részeire. Ez a viselkedés a with blocks módosítóval módosítható:

{include 'template.latte' with blocks}

A címkében megadott fájlnév és a lemezen lévő fájl közötti kapcsolat a betöltő függvénye.

{sandbox}

Ha egy végfelhasználó által létrehozott sablont vesz fel, fontolja meg a sandboxolást (további információ a sandbox dokumentáció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 alkalmazhassunk a sablon egy részére. Például alkalmazhat egy csíkszűrőt a felesleges szóközök eltávolítására:

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

Kivételkezelés

{try}

Ez a címke rendkívül megkönnyíti a robusztus sablonok készítését.

Ha a {try} blokk renderelése közben kivétel lép fel, az egész blokk elvetésre kerül, és a renderelés utána folytatódik:

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

A {else} opcionális záradék tartalma csak akkor kerül renderelésre, ha kivétel történik:

{try}
	<ul>
		{foreach $twitter->loadTweets() as $tweet}
  			<li>{$tweet->text}</li>
		{/foreach}
	</ul>
	{else}
	<p>Sorry, the tweets could not be loaded.</p>
{/try}

A címke n:attribútumként is írható:

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

Lehetőség van saját kivételkezelő definiálására is, pl. naplózáshoz:

{rollback}

A {try} blokk manuálisan is megállítható és kihagyható a {rollback} segítségével. Így nem kell előre ellenőrizni az összes bemeneti adatot, és csak a renderelés során lehet eldönteni, hogy van-e értelme renderelni az objektumot.

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

Változók

{var} {default}

A sablonban új változókat hozunk létre a {var} címkével:

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

{* Többszörös nyilatkozat *}
{var $name = 'John Smith', $age = 27}

A {default} címke hasonlóan működik, azzal a különbséggel, hogy csak akkor hoz létre változókat, ha azok nem léteznek:

{default $lang = 'cs'}

változók típusait is megadhatja. Ezek egyelőre tájékoztató jellegűek, és a Latte nem ellenőrzi őket.

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

{parameters}

Ahogyan egy függvény deklarálja a paramétereit, úgy egy sablon is deklarálhatja a változókat az elején:

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

A $a és $b változók alapértelmezett érték nélkül automatikusan a null alapértelmezett értéket kapják. A deklarált típusok továbbra is tájékoztató jellegűek, és a Latte nem ellenőrzi őket.

A deklarált változókon kívül más nem kerül át a sablonba. Ez egy különbség a {default} címkéhez képest.

{capture}

A {capture} címke használatával a kimenetet egy változóba rögzítheti:

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

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

A címke n:attribútumként is írható, mint bármelyik páros címke:

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

A HTML kimenet a $var változóban tárolódik Latte\Runtime\Html objektumként, hogy elkerülje a nem kívánt escapinget nyomtatáskor.

Egyéb

{contentType}

A címkével megadhatja, hogy a sablon milyen típusú tartalmat képvisel. A lehetőségek a következők:

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

Használata azért fontos, mert ez állítja be a kontextusfüggő escapinget, és csak így tud a Latte helyesen menekülni. Például a {contentType xml} XML módba kapcsol, a {contentType text} pedig teljesen kikapcsolja az escapinget.

Ha a paraméter egy teljes értékű MIME-típus, például application/xml, akkor 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}

Megadja azt a helyet, ahol a kód végrehajtása megszakad. Hibakeresési célokra szolgál, hogy a programozó ellenőrizze a futási környezetet, és biztosítsa, hogy a kód az elvárásoknak megfelelően fut. Támogatja az Xdebugot. Ezenkívül megadható egy feltétel, amikor a kódnak meg kell törnie.

{debugbreak}                {* megszakítja a programot *}

{debugbreak $counter == 1}  {* megszakítja a programot, ha a feltétel teljesül *}

{do}

Végrehajtja a PHP-kódot, és nem ír ki semmit. A többi címkéhez hasonlóan a PHP-kód is egyetlen kifejezés, lásd a PHP korlátait.

{do $num++}

{dump}

Egy változó vagy az aktuális kontextus kiürítése.

{dump $név} {* a $név változó kiírása *}

{dump}       {* dumps az összes definiált változót *}

Tracy csomagot igényli.

{php}

Lehetővé teszi bármilyen PHP kód futtatását. A címkét a RawPhpExtension kiterjesztés használatával kell aktiválni.

{spaceless}

Eltávolítja a felesleges szóközöket. Hasonló a szóköz nélküli szűrőhöz.

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

Kimenetek:

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

A címke n:attribútumként is írható:

{syntax}

A latte címkéket nem kell csak szimpla szögletes zárójelek közé zárni. Választhat más elválasztójelet is, akár futás közben is. Erre szolgál a {syntax…}, ahol a paraméter lehet:

  • double: {{...}}
  • off: teljesen kikapcsolja a Latte címkéket

Az n:attribútum jelölés használatával csak egy JavaScript blokk esetében tilthatjuk le a Latte-et:

<script n:syntax="off">
	var obj = {var: 123}; // this isn't a tag any more
</script>

A Latte nagyon kényelmesen használható JavaScript-en belül, csak kerüljük az olyan konstrukciókat, mint ebben a példában, ahol a betű közvetlenül a { után következik, lásd: Latte JavaScripten vagy CSS-en belül.

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

{trace}

Dob egy Latte\RuntimeException kivételt, amelynek stack trace-je a sablonok szellemében van. Így függvények és metódusok hívása helyett blokkok hívását és sablonok beillesztését foglalja magában. Ha a dobott kivételek egyértelmű megjelenítésére szolgáló eszközt, például a Tracy-t használja, akkor jól láthatóvá válik a hívási verem, beleértve az összes átadott argumentumot is.

HTML-tag-segédprogramok

n:class

A n:class segítségével nagyon könnyen létrehozható a class HTML-attribútum pontosan a kívánt módon.

Példa: Az aktív elemnek a active osztállyal kell rendelkeznie:

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

Továbbá az első elemnek a first és a main osztályokkal kell rendelkeznie:

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

És minden elemnek a list-item osztállyal kell rendelkeznie:

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

Elképesztően egyszerű, nem igaz?

n:attr

A n:attr attribútum tetszőleges HTML-attribútumokat generálhat, ugyanolyan eleganciával, mint az 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 megjeleníti pl:

<input type="checkbox">

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

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

n:tag

A n:tag attribútum dinamikusan megváltoztathatja egy HTML-elem nevét.

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

Ha a $heading === null, a <h1> címke változatlanul kiírásra kerül. Ellenkező esetben az elem neve a változó értékére változik, így a $heading === 'h3' esetében azt írja ki:

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

Mivel a Latte egy biztonságos templating rendszer, ellenőrzi, hogy az új tag neve érvényes-e, és nem tartalmaz-e nem kívánt vagy rosszindulatú értékeket.

n:ifcontent

Megakadályozza, hogy egy üres HTML-elem kiírásra kerüljön, azaz egy olyan elem, amely csak szóközöket tartalmaz.

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

A $error változó értékeitől függően ez kiíródik:

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

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

Fordítás

Ahhoz, hogy a fordítási címkék működjenek, be kell állítania a fordítót. Használhatja a translate szűrőt a fordításhoz.

{_...}

Lefordítja az értékeket más nyelvekre.

<a href="basket">{_'Basket'}</a>
<span>{_$item}</span>

A fordítónak más paraméterek is átadhatók:

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

{translate}

Překládá části šablony:

<h1>{translate}Order{/translate}</h1>

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

attribútumként is írható, hogy lefordítsuk az elem belsejét:

<h1 n:translate>Order</h1>