Sintaxă

Sintaxa Latte a apărut din cerințele practice ale webdesignerilor. Am căutat cea mai prietenoasă sintaxă, cu care puteți scrie elegant chiar și construcții care altfel reprezintă o adevărată provocare. În același timp, toate expresiile se scriu exact la fel ca în PHP, așa că nu trebuie să învățați un nou limbaj. Pur și simplu valorificați ceea ce știți deja.

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

{* acesta este un comentariu *}
<ul n:if=$items>                  {* n:if este un n:atribut *}
{foreach $items as $item}         {* tag reprezentând bucla foreach *}
	<li>{$item|capitalize}</li>   {* tag afișând variabila cu filtru *}
{/foreach}                        {* sfârșitul buclei *}
</ul>

Să aruncăm o privire mai atentă la aceste elemente importante și la modul în care vă pot ajuta să creați un șablon uimitor.

Tag-uri

Șablonul conține tag-uri care controlează logica șablonului (de exemplu, bucle foreach) sau afișează expresii. Pentru ambele se folosește un singur delimitator { ... }, astfel încât nu trebuie să vă gândiți ce delimitator să folosiți în ce situație, așa cum se întâmplă în alte sisteme. Dacă după caracterul { urmează ghilimele sau spațiu, Latte nu îl consideră începutul unui tag, datorită căruia puteți folosi fără probleme în șabloane și construcții JavaScript, JSON sau reguli CSS.

Consultați prezentarea generală a tuturor tag-urilor. În plus, puteți crea și propriile tag-uri.

Latte înțelege PHP

În interiorul tag-urilor puteți folosi expresii PHP pe care le cunoașteți bine:

În plus, Latte completează sintaxa PHP cu câteva extensii plăcute.

n:atribute

Toate tag-urile pereche, de exemplu {if} … {/if}, care operează asupra unui singur element HTML, pot fi rescrise sub formă de n:atribute. Astfel ar putea fi scris, de exemplu, și {foreach} din exemplul introductiv:

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

Funcționalitatea se aplică apoi elementului HTML în care este plasat:

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

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

afișează:

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

Folosind prefixul inner-, putem modifica comportamentul astfel încât să se aplice doar părții interioare a elementului:

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

Se va afișa:

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

Sau folosind prefixul tag-, aplicăm funcționalitatea doar asupra tag-urilor HTML în sine:

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

Ceea ce va afișa în funcție de variabila $url:

{* când $url este gol *}
<p>Titlu</p>

{* când $url conține 'https://nette.org' *}
<p><a href="https://nette.org">Titlu</a></p>

Cu toate acestea, n:atributele nu sunt doar o prescurtare pentru tag-urile pereche. Există și n:atribute pure, cum ar fi n:href sau ajutorul extrem de util pentru coderi n:class.

Filtre

Consultați prezentarea generală a filtrelor standard.

Filtrele se scriu după bara verticală (poate fi precedată de un spațiu):

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

Filtrele pot fi înlănțuite și apoi se aplică în ordine de la stânga la dreapta:

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

Parametrii se specifică după numele filtrului, separați prin două puncte sau virgule:

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

Filtrele pot fi aplicate și pe o expresie:

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

Pe un bloc:

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

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

<h1>{='  Salut lume  '|trim}<h1>

Tag-uri HTML dinamice

Latte suportă tag-uri HTML dinamice, care sunt utile când aveți nevoie de flexibilitate în numele tag-urilor:

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

Codul de mai sus poate genera, de exemplu, <h1>Titlu</h1> sau <h2>Titlu</h2> în funcție de valoarea variabilei $level. Tag-urile HTML dinamice în Latte trebuie să fie întotdeauna pereche. Alternativa lor este n:tag.

Deoarece Latte este un sistem de șabloane sigur, verifică dacă numele tag-ului rezultat este valid și nu conține valori nedorite sau dăunătoare. De asemenea, asigură că numele tag-ului de închidere va fi întotdeauna același cu numele tag-ului de deschidere.

Comentarii

Comentariile se scriu în acest mod și nu ajung în ieșire:

{* acesta este un comentariu în Latte *}

În interiorul tag-urilor funcționează comentariile PHP:

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

Zahăr sintactic

Șiruri fără ghilimele

Pentru șirurile simple, se pot omite ghilimelele:

ca în PHP:  {var $arr = ['hello', 'btn--default', '€']}

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

Șirurile simple sunt cele formate exclusiv din litere, cifre, underscore-uri, cratime și puncte. Nu trebuie să înceapă cu o cifră și nu trebuie să înceapă sau să se termine cu o cratimă. Nu trebuie să fie compuse doar din litere mari și underscore-uri, deoarece atunci sunt considerate constante (de ex. PHP_VERSION). Și nu trebuie să intre în conflict cu cuvintele cheie: and, array, clone, default, false, in, instanceof, new, null, or, return, true, xor.

Constante

Deoarece la șirurile simple se pot omite ghilimelele, recomandăm pentru diferențiere să scrieți constantele globale cu un slash la început:

{if \PROJECT_ID === 1} ... {/if}

Această scriere este complet validă în PHP însuși, slash-ul indică faptul că constanta este în namespace-ul global.

Operator ternar prescurtat

Dacă a treia valoare a operatorului ternar este goală, poate fi omisă:

ca în PHP:  {$stock ? 'În stoc' : ''}

prescurtat: {$stock ? 'În stoc'}

Scriere modernă a cheilor în array

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

ca în 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, este suficient să închideți întregul în paranteze:

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

Operatorul in

Operatorul in poate înlocui funcția in_array(). Compararea este întotdeauna strictă:

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

Fereastră istorică

Latte a venit de-a lungul istoriei sale cu o serie întreagă de zahăr sintactic, care după câțiva ani au apărut în PHP însuși. De exemplu, în Latte era posibil să scrieți array-uri ca [1, 2, 3] în loc de array(1, 2, 3) sau să folosiți operatorul nullsafe $obj?->foo cu mult înainte ca acest lucru să fie posibil în PHP însuși. Latte a introdus, de asemenea, operatorul pentru despachetarea array-ului (expand) $arr, care este echivalentul operatorului actual ...$arr din PHP.

Operatorul undefined-safe ??->, care este un echivalent al operatorului nullsafe ?->, dar care nu generează eroare dacă variabila nu există, a apărut din motive istorice și astăzi recomandăm utilizarea operatorului PHP standard ?->.

Limitări PHP în Latte

În Latte se pot scrie doar expresii PHP. Adică nu se pot folosi instrucțiuni terminate cu punct și virgulă. Nu se pot declara clase sau folosi structuri de control, de ex. if, foreach, switch, return, try, throw și altele, în locul cărora Latte oferă tag-urile sale. De asemenea, nu se pot folosi atribute, backticks sau unele constante magice. Nu se pot folosi nici unset, echo, include, require, exit, eval, deoarece nu sunt funcții, ci construcții speciale ale limbajului PHP, și nu sunt deci expresii. Comentariile sunt suportate doar cele pe mai multe linii /* ... */.

Aceste limitări pot fi totuși ocolite activând extensia RawPhpExtension, datorită căreia se poate folosi apoi în tag-ul {php ...} orice cod PHP pe responsabilitatea autorului șablonului.

versiune: 3.0