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 *}
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:
- variabile
- șiruri de caractere (inclusiv HEREDOC și NOWDOC), matrice, numere etc.
- operatori
- apeluri de funcții și metode (care pot fi restricționate de sandbox)
- potrivire
- funcții anonime
- callback-uri
- comentarii pe mai multe rânduri
/* ... */
- etc…
Î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>
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}
Încatenarea opțională cu operatorul sigur împotriva definițiilor
Operatorul undefined-safe ??->
este similar cu operatorul nullsafe ?->
, dar nu generează
o eroare dacă o variabilă, o proprietate sau un index nu există deloc.
{$order??->id}
acesta este un mod de a spune că, atunci când $order
este definit și nu este nul, $order->id
va
fi calculat, dar când $order
este nul sau nu există, ne oprim din ceea ce facem și returnăm pur și
simplu null.
S-ar putea să folosiți ?->
pentru a înlocui o mulțime de coduri care efectuează verificări repetitive
ale nulității:
{$user??->address??->street}
// roughly means isset($user) && isset($user->address) ? $user->address->street : null
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.
Limitări ale PHP în Latte
În Latte pot fi scrise numai expresii PHP. Adică, 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 folosi atribute, backticks sau constante magice, deoarece nu ar avea sens. Nu puteți
folosi nici măcar echo
, include
, require
, , exit
, eval
,
unset
, pentru că acestea nu sunt funcții, ci construcții speciale ale limbajului PHP, și deci nu sunt
expresii.
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.