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:
- variabile
- șiruri (inclusiv HEREDOC și NOWDOC), array-uri, numere etc.
- operatori
- apeluri de funcții și metode (care pot fi restricționate prin sandbox)
- match
- funcții anonime
- callback-uri
- comentarii pe mai multe linii
/* ... */
- etc…
Î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.