Nette Documentation Preview

syntax
Szintaxis
*********

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

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

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

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


Címkék .[#toc-tags]
===================

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

Lásd az [összes címke áttekintését |tags]. Ezenkívül [egyéni címkéket |extending-latte#tags] is létrehozhat.


A Latte érti a PHP-t .[#toc-latte-understands-php]
==================================================

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

- változók
- karakterláncok (beleértve a HEREDOC és NOWDOC karakterláncokat), tömbök, számok stb.
- [operátorok |https://www.php.net/manual/en/language.operators.php]
- függvény- és metódushívások (amelyeket a [sandbox |sandbox] korlátozhat)
- [mérkőzés |https://www.php.net/manual/en/control-structures.match.php]
- [névtelen függvények |https://www.php.net/manual/en/functions.arrow.php]
- [visszahívások |https://www.php.net/manual/en/functions.first_class_callable_syntax.php]
- többsoros megjegyzések `/* ... */`
- stb...

Ezen kívül a Latte számos [szép kiterjesztést |#Syntactic Sugar] ad a PHP szintaxisához.


n:attribútumok .[#toc-n-attributes]
===================================

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

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

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

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

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

Nyomtatás:

```latte
<p>I</p>
<p>♥</p>
<p>Latte</p>
```

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

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

Nyomtatás:

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

Blokkoláskor:

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

Vagy közvetlenül az értékre (a [`{=expr}` | https://latte.nette.org/hu/tags#printing] taggel):
```latte
<h1>{='  Hello world  '|trim}<h1>
```


Dinamikus HTML címkék .[#toc-dynamic-html-tags]
===============================================

A Latte támogatja a dinamikus HTML címkéket, amelyek akkor hasznosak, ha a címkék nevének rugalmasságára van szükség:

```latte
<h{$level}>Heading</h{$level}>
```

Például a fenti kód képes generálni `<h1>Heading</h1>` vagy `<h2>Heading</h2>` a `$level` változó értékétől függően. A Latte dinamikus HTML-címkéket mindig párosítani kell. Alternatívájuk az [n:tag |tags#n:tag].

Mivel a Latte egy biztonságos templating rendszer, ellenőrzi, hogy a kapott tag neve érvényes-e, és nem tartalmaz-e nem kívánt vagy rosszindulatú értékeket. Azt is biztosítja, hogy a végcímke neve mindig megegyezik a nyitócímke nevével.


Hozzászólások .[#toc-comments]
==============================

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

```latte
{* ez egy komment a Latte nyelven *}
```

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

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


Szintaktikai cukor .[#toc-syntactic-sugar]
==========================================


Idézőjelek nélküli karakterláncok .[#toc-strings-without-quotation-marks]
-------------------------------------------------------------------------

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

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

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

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


Rövid hármas operátor .[#toc-short-ternary-operator]
----------------------------------------------------

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

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

abbreviated: {$stock ? 'In stock'}
```


Modern kulcsjelölés a tömbben .[#toc-modern-key-notation-in-the-array]
----------------------------------------------------------------------

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

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

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


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

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

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


Operátor `in` .[#toc-operator-in]
---------------------------------

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

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


Egy ablak a történelembe .[#toc-a-window-into-history]
------------------------------------------------------

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

Az undefined-safe `??->` operátor, amely hasonló a nullsafe `?->` operátorhoz, de nem okoz hibát, ha a változó nem létezik, történelmi okokból jött létre, és ma már a standard PHP `?->` operátor használatát javasoljuk.


PHP korlátozások a Latte-ban .[#toc-php-limitations-in-latte]
=============================================================

Latte-ban csak PHP-kifejezéseket lehet írni. Vagyis pontosvesszővel végződő utasítások nem használhatók. Nem lehet osztályokat deklarálni vagy [vezérlési struktúrákat |https://www.php.net/manual/en/language.control-structures.php] használni, mint például a `if`, `foreach`, `switch`, `return`, `try`, `throw` és mások, amelyek helyett a Latte kínálja a [címkéket |tags].
Nem használhatsz [attribútumokat |https://www.php.net/manual/en/language.attributes.php], [backtickeket |https://www.php.net/manual/en/language.operators.execution.php] és [varázslatos konstansokat |https://www.php.net/manual/en/language.constants.magic.php] sem.
A `unset`, `echo`, `include`, `require`, `exit`, `eval` nem is használható, mivel ezek nem függvények, hanem speciális PHP nyelvi konstrukciók, tehát nem kifejezések. Csak a többsoros megjegyzések támogatottak `/* ... */`.

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

Szintaxis

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

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

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

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

Címkék

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

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

A Latte érti a PHP-t

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

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

n:attribútumok

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

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

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

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

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

Nyomtatás:

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

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

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

Nyomtatás:

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

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

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

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

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

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

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

Szűrők

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

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

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

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

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

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

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

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

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

Blokkoláskor:

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

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

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

Dinamikus HTML címkék

A Latte támogatja a dinamikus HTML címkéket, amelyek akkor hasznosak, ha a címkék nevének rugalmasságára van szükség:

<h{$level}>Heading</h{$level}>

Például a fenti kód képes generálni <h1>Heading</h1> vagy <h2>Heading</h2> a $level változó értékétől függően. A Latte dinamikus HTML-címkéket mindig párosítani kell. Alternatívájuk az n:tag.

Mivel a Latte egy biztonságos templating rendszer, ellenőrzi, hogy a kapott tag neve érvényes-e, és nem tartalmaz-e nem kívánt vagy rosszindulatú értékeket. Azt is biztosítja, hogy a végcímke neve mindig megegyezik a nyitócímke nevével.

Hozzászólások

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

{* ez egy komment a Latte nyelven *}

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

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

Szintaktikai cukor

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

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

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

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

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

Rövid hármas operátor

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

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

abbreviated: {$stock ? 'In stock'}

Modern kulcsjelölés a tömbben

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

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

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

Szűrők

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

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

Operátor in

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

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

Egy ablak a történelembe

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

Az undefined-safe ??-> operátor, amely hasonló a nullsafe ?-> operátorhoz, de nem okoz hibát, ha a változó nem létezik, történelmi okokból jött létre, és ma már a standard PHP ?-> operátor használatát javasoljuk.

PHP korlátozások a Latte-ban

Latte-ban csak PHP-kifejezéseket lehet írni. Vagyis pontosvesszővel végződő utasítások nem használhatók. Nem lehet osztályokat deklarálni vagy vezérlési struktúrákat használni, mint például a if, foreach, switch, return, try, throw és mások, amelyek helyett a Latte kínálja a címkéket. Nem használhatsz attribútumokat, backtickeket és varázslatos konstansokat sem. A unset, echo, include, require, exit, eval nem is használható, mivel ezek nem függvények, hanem speciális PHP nyelvi konstrukciók, tehát nem kifejezések. Csak a többsoros megjegyzések támogatottak /* ... */.

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