Nette Documentation Preview

syntax
Sintaxa
*******

.[perex]
Syntax Latte s-a născut din cerințele practice ale designerilor web. Căutam o sintaxă cât mai ușor de utilizat, cu ajutorul căreia să puteți scrie elegant construcții care altfel reprezintă o adevărată provocare.
În același timp, toate expresiile sunt scrise exact la fel ca în PHP, astfel încât nu trebuie să învățați un nou limbaj. Pur și simplu profitați la maximum de ceea ce știți deja.

Mai jos este prezentat un șablon minimal care ilustrează câteva elemente de bază: tag-uri, n:attributes, comentarii și filtre.

```latte
{* acesta este un comentariu *}
<ul n:if="$items">                {* n:if este n:atribut *}
{foreach $items as $item}         {* tag reprezentând bucla foreach *}
	<li>{$item|capitalize}</li>   {* tag care tipărește o variabilă cu un filtru *}
{/foreach}                        {* sfârșit de ciclu *}
</ul>
```

Să analizăm mai îndeaproape aceste elemente importante și modul în care acestea vă pot ajuta să construiți un șablon incredibil.


Etichete .[#toc-tags]
=====================

Un șablon conține etichete care controlează logica șablonului (de exemplu, buclele *foreach*) sau expresiile de ieșire. Pentru ambele, se utilizează un singur delimitator `{ ... }`, astfel încât nu trebuie să vă gândiți ce delimitator să folosiți în fiecare situație, ca în cazul altor sisteme.
Dacă caracterul `{` este urmat de un ghilimele sau de un spațiu, Latte nu îl consideră ca fiind începutul unei etichete, astfel încât puteți folosi construcții JavaScript, JSON sau reguli CSS în șabloanele dvs. fără probleme.

Vedeți [prezentarea generală a tuturor etichetelor |tags]. În plus, puteți crea, de asemenea, [tag-uri personalizate |extending-latte#tags].


Latte înțelege PHP .[#toc-latte-understands-php]
================================================

Puteți utiliza expresii PHP pe care le cunoașteți bine în interiorul etichetelor:

- variabile
- șiruri de caractere (inclusiv HEREDOC și NOWDOC), matrice, numere etc.
- [operatori |https://www.php.net/manual/en/language.operators.php]
- apeluri de funcții și metode (care pot fi restricționate de [sandbox |sandbox])
- [potrivire |https://www.php.net/manual/en/control-structures.match.php]
- [funcții anonime |https://www.php.net/manual/en/functions.arrow.php]
- [callback-uri |https://www.php.net/manual/en/functions.first_class_callable_syntax.php]
- comentarii pe mai multe rânduri `/* ... */`
- etc...

În plus, Latte adaugă câteva [extensii frumoase |#Syntactic Sugar] la sintaxa PHP.


n:atribute .[#toc-n-attributes]
===============================

Fiecare etichetă pereche, cum ar fi `{if} … {/if}`, care acționează asupra unui singur element HTML poate fi scrisă în notația [n:attribute |#n:attribute]. De exemplu, `{foreach}` din exemplul de mai sus poate fi scris și în acest fel:

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

Funcționalitatea corespunde apoi elementului HTML în care este scrisă:

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

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

Imprimă:

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

Prin utilizarea prefixului `inner-` putem modifica comportamentul astfel încât funcționalitatea să se aplice doar corpului elementului:

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

Imprimă:

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

Sau prin utilizarea prefixului `tag-`, funcționalitatea se aplică numai la etichetele HTML:

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

În funcție de valoarea variabilei `$url`, se va imprima:

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

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

Cu toate acestea, n:attributes nu sunt doar o prescurtare pentru etichetele pereche, ci există și unele atribute n:pure, de exemplu, cel mai bun prieten al programatorului, [n:class |tags#n:class].


Filtre .[#toc-filters]
======================

A se vedea rezumatul [filtrelor standard |filters].

Latte permite apelarea filtrelor utilizând notația semnului pipe (este permisă folosirea unui spațiu înainte):

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

Filtrele pot fi înlănțuite, caz în care se aplică în ordine de la stânga la dreapta:

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

Parametrii se pun după numele filtrului, separați prin două puncte sau virgulă:

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

Filtrele pot fi aplicate pe expresie:

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

Pe bloc:

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

Sau direct pe valoare (în combinație cu [`{=expr}` | https://latte.nette.org/ro/tags#printing] tag):
```latte
<h1>{='  Hello world  '|trim}<h1>
```


Etichete HTML dinamice .[#toc-dynamic-html-tags]
================================================

Latte acceptă etichete HTML dinamice, care sunt utile atunci când aveți nevoie de flexibilitate în ceea ce privește numele etichetelor:

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

De exemplu, codul de mai sus poate genera `<h1>Heading</h1>` sau `<h2>Heading</h2>` în funcție de valoarea variabilei `$level`. Etichetele HTML dinamice din Latte trebuie să fie întotdeauna asociate. Alternativa lor este [n:tag |tags#n:tag].

Deoarece Latte este un sistem securizat de creare de șabloane, acesta verifică dacă numele tag-ului rezultat este valid și nu conține valori nedorite sau rău intenționate. De asemenea, se asigură că numele tag-ului final este întotdeauna același cu numele tag-ului de deschidere.


Comentarii .[#toc-comments]
===========================

Comentariile sunt scrise în acest mod și nu se introduc în text:

```latte
{* acest lucru este un comentariu în Latte *}}
```

Comentariile PHP funcționează în interiorul etichetelor:

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


Zahăr sintactic .[#toc-syntactic-sugar]
=======================================


Șiruri de caractere fără ghilimele .[#toc-strings-without-quotation-marks]
--------------------------------------------------------------------------

Ghilimelele pot fi omise în cazul șirurilor de caractere simple:

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

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

Șirurile de caractere simple sunt cele care sunt alcătuite exclusiv din litere, cifre, liniuțe, sublinieri, cratime și puncte. Ele nu trebuie să înceapă cu o cifră și nu trebuie să înceapă sau să se termine cu o cratimă.
Nu trebuie să fie compuse numai din litere majuscule și liniuțe de subliniere, pentru că atunci este considerată o constantă (de exemplu, `PHP_VERSION`).
Și nu trebuie să intre în coliziune cu cuvintele-cheie `and`, `array`, `clone`, `default`, `false`, `in`, `instanceof`, `new`, `null`, `or`, `return`, `true`, `xor`.


Operator ternar scurt .[#toc-short-ternary-operator]
----------------------------------------------------

În cazul în care a treia valoare a operatorului ternar este goală, aceasta poate fi omisă:

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

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


Notarea modernă a cheilor în matrice .[#toc-modern-key-notation-in-the-array]
-----------------------------------------------------------------------------

Cheile din array pot fi scrise în mod similar cu parametrii numiți la apelarea funcțiilor:

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

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


Filtre .[#toc-filters]
----------------------

Filtrele pot fi utilizate pentru orice expresie, trebuie doar să le includeți între paranteze:

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


Operator `in` .[#toc-operator-in]
---------------------------------

Operatorul `in` poate fi utilizat pentru a înlocui funcția `in_array()`. Comparația este întotdeauna strictă:

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


O fereastră în istorie .[#toc-a-window-into-history]
----------------------------------------------------

Latte a venit cu o serie de bomboane sintactice de-a lungul istoriei sale, care au apărut în PHP însuși câțiva ani mai târziu. De exemplu, în Latte era posibil să se scrie array-uri ca `[1, 2, 3]` în loc de `array(1, 2, 3)` sau de a utiliza operatorul nullsafe `$obj?->foo` cu mult înainte ca acest lucru să fie posibil în PHP. Latte a introdus, de asemenea, operatorul de expansiune a tablourilor `(expand) $arr`, care este echivalentul operatorului `...$arr` de astăzi din PHP.

Operatorul undefined-safe `??->`, care este similar cu operatorul nullsafe `?->`, dar care nu generează o eroare dacă variabila nu există, a fost creat din motive istorice, iar astăzi recomandăm utilizarea operatorului standard PHP `?->`.


Limitări ale PHP în Latte .[#toc-php-limitations-in-latte]
==========================================================

În Latte pot fi scrise numai expresii PHP. Adică, nu pot fi folosite expresii care se termină cu punct și virgulă. Nu puteți declara clase sau utiliza [structuri de control |https://www.php.net/manual/en/language.control-structures.php], cum ar fi `if`, `foreach`, `switch`, `return`, `try`, `throw` și altele, în locul cărora Latte oferă [etichetele |tags] sale.
De asemenea, nu puteți utiliza [atribute |https://www.php.net/manual/en/language.attributes.php], [backticks |https://www.php.net/manual/en/language.operators.execution.php] sau [constante magice |https://www.php.net/manual/en/language.constants.magic.php].
Nu puteți folosi nici măcar `unset`, `echo`, , `include`, `require`, , `exit`, `eval`, deoarece acestea nu sunt funcții, ci construcții speciale ale limbajului PHP și, prin urmare, nu sunt expresii. Sunt acceptate doar comentariile pe mai multe rânduri `/* ... */`.

Cu toate acestea, puteți ocoli aceste limitări prin activarea extensiei [RawPhpExtension |develop#RawPhpExtension], care vă permite să utilizați orice cod PHP în tag-ul `{php ...}` pe răspunderea autorului șablonului.

Sintaxa

Syntax Latte s-a născut din cerințele practice ale designerilor web. Căutam o sintaxă cât mai ușor de utilizat, cu ajutorul căreia să puteți scrie elegant construcții care altfel reprezintă o adevărată provocare. În același timp, toate expresiile sunt scrise exact la fel ca în PHP, astfel încât nu trebuie să învățați un nou limbaj. Pur și simplu profitați la maximum de ceea ce știți deja.

Mai jos este prezentat un șablon minimal care ilustrează câteva elemente de bază: tag-uri, n:attributes, comentarii și filtre.

{* acesta este un comentariu *}
<ul n:if="$items">                {* n:if este n:atribut *}
{foreach $items as $item}         {* tag reprezentând bucla foreach *}
	<li>{$item|capitalize}</li>   {* tag care tipărește o variabilă cu un filtru *}
{/foreach}                        {* sfârșit de ciclu *}
</ul>

Să analizăm mai îndeaproape aceste elemente importante și modul în care acestea vă pot ajuta să construiți un șablon incredibil.

Etichete

Un șablon conține etichete care controlează logica șablonului (de exemplu, buclele foreach) sau expresiile de ieșire. Pentru ambele, se utilizează un singur delimitator { ... }, astfel încât nu trebuie să vă gândiți ce delimitator să folosiți în fiecare situație, ca în cazul altor sisteme. Dacă caracterul { este urmat de un ghilimele sau de un spațiu, Latte nu îl consideră ca fiind începutul unei etichete, astfel încât puteți folosi construcții JavaScript, JSON sau reguli CSS în șabloanele dvs. fără probleme.

Vedeți prezentarea generală a tuturor etichetelor. În plus, puteți crea, de asemenea, tag-uri personalizate.

Latte înțelege PHP

Puteți utiliza expresii PHP pe care le cunoașteți bine în interiorul etichetelor:

În plus, Latte adaugă câteva extensii frumoase la sintaxa PHP.

n:atribute

Fiecare etichetă pereche, cum ar fi {if} … {/if}, care acționează asupra unui singur element HTML poate fi scrisă în notația n:attribute. De exemplu, {foreach} din exemplul de mai sus poate fi scris și în acest fel:

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

Funcționalitatea corespunde apoi elementului HTML în care este scrisă:

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

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

Imprimă:

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

Prin utilizarea prefixului inner- putem modifica comportamentul astfel încât funcționalitatea să se aplice doar corpului elementului:

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

Imprimă:

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

Sau prin utilizarea prefixului tag-, funcționalitatea se aplică numai la etichetele HTML:

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

În funcție de valoarea variabilei $url, se va imprima:

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

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

Cu toate acestea, n:attributes nu sunt doar o prescurtare pentru etichetele pereche, ci există și unele atribute n:pure, de exemplu, cel mai bun prieten al programatorului, n:class.

Filtre

A se vedea rezumatul filtrelor standard.

Latte permite apelarea filtrelor utilizând notația semnului pipe (este permisă folosirea unui spațiu înainte):

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

Filtrele pot fi înlănțuite, caz în care se aplică în ordine de la stânga la dreapta:

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

Parametrii se pun după numele filtrului, separați prin două puncte sau virgulă:

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

Filtrele pot fi aplicate pe expresie:

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

Pe bloc:

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

Sau direct pe valoare (în combinație cu {=expr} tag):

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

Etichete HTML dinamice

Latte acceptă etichete HTML dinamice, care sunt utile atunci când aveți nevoie de flexibilitate în ceea ce privește numele etichetelor:

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

De exemplu, codul de mai sus poate genera <h1>Heading</h1> sau <h2>Heading</h2> în funcție de valoarea variabilei $level. Etichetele HTML dinamice din Latte trebuie să fie întotdeauna asociate. Alternativa lor este n:tag.

Deoarece Latte este un sistem securizat de creare de șabloane, acesta verifică dacă numele tag-ului rezultat este valid și nu conține valori nedorite sau rău intenționate. De asemenea, se asigură că numele tag-ului final este întotdeauna același cu numele tag-ului de deschidere.

Comentarii

Comentariile sunt scrise în acest mod și nu se introduc în text:

{* acest lucru este un comentariu în Latte *}}

Comentariile PHP funcționează în interiorul etichetelor:

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

Zahăr sintactic

Șiruri de caractere fără ghilimele

Ghilimelele pot fi omise în cazul șirurilor de caractere simple:

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

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

Șirurile de caractere simple sunt cele care sunt alcătuite exclusiv din litere, cifre, liniuțe, sublinieri, cratime și puncte. Ele nu trebuie să înceapă cu o cifră și nu trebuie să înceapă sau să se termine cu o cratimă. Nu trebuie să fie compuse numai din litere majuscule și liniuțe de subliniere, pentru că atunci este considerată o constantă (de exemplu, PHP_VERSION). Și nu trebuie să intre în coliziune cu cuvintele-cheie and, array, clone, default, false, in, instanceof, new, null, or, return, true, xor.

Operator ternar scurt

În cazul în care a treia valoare a operatorului ternar este goală, aceasta poate fi omisă:

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

abbreviated: {$stock ? 'In stock'}

Notarea modernă a cheilor în matrice

Cheile din array pot fi scrise în mod similar cu parametrii numiți la apelarea funcțiilor:

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

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

Filtre

Filtrele pot fi utilizate pentru orice expresie, trebuie doar să le includeți între paranteze:

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

Operator in

Operatorul in poate fi utilizat pentru a înlocui funcția in_array(). Comparația este întotdeauna strictă:

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

O fereastră în istorie

Latte a venit cu o serie de bomboane sintactice de-a lungul istoriei sale, care au apărut în PHP însuși câțiva ani mai târziu. De exemplu, în Latte era posibil să se scrie array-uri ca [1, 2, 3] în loc de array(1, 2, 3) sau de a utiliza operatorul nullsafe $obj?->foo cu mult înainte ca acest lucru să fie posibil în PHP. Latte a introdus, de asemenea, operatorul de expansiune a tablourilor (expand) $arr, care este echivalentul operatorului ...$arr de astăzi din PHP.

Operatorul undefined-safe ??->, care este similar cu operatorul nullsafe ?->, dar care nu generează o eroare dacă variabila nu există, a fost creat din motive istorice, iar astăzi recomandăm utilizarea operatorului standard PHP ?->.

Limitări ale PHP în Latte

În Latte pot fi scrise numai expresii PHP. Adică, nu pot fi folosite expresii care se termină cu punct și virgulă. Nu puteți declara clase sau utiliza structuri de control, cum ar fi if, foreach, switch, return, try, throw și altele, în locul cărora Latte oferă etichetele sale. De asemenea, nu puteți utiliza atribute, backticks sau constante magice. Nu puteți folosi nici măcar unset, echo, , include, require, , exit, eval, deoarece acestea nu sunt funcții, ci construcții speciale ale limbajului PHP și, prin urmare, nu sunt expresii. Sunt acceptate doar comentariile pe mai multe rânduri /* ... */.

Cu toate acestea, puteți ocoli aceste limitări prin activarea extensiei RawPhpExtension, care vă permite să utilizați orice cod PHP în tag-ul {php ...} pe răspunderea autorului șablonului.