Sintassi
Syntax Latte è nata dalle esigenze pratiche dei web designer. Eravamo alla ricerca della sintassi più facile da usare, con la quale è possibile scrivere in modo elegante costrutti che altrimenti sarebbero una vera sfida. Allo stesso tempo, tutte le espressioni sono scritte esattamente come in PHP, quindi non è necessario imparare un nuovo linguaggio. È sufficiente sfruttare al meglio ciò che già si conosce.
Di seguito è riportato un modello minimale che illustra alcuni elementi di base: tag, n:attributi, commenti e filtri.
{* questo è un commento *}
<ul n:if="$items"> {* n:if è n:atribut *}
{foreach $items as $item} {* tag che rappresenta il ciclo foreach *}
<li>{$item|capitalize}</li> {* tag che stampa una variabile con un filtro *}
{/foreach} {* fine del ciclo *}
</ul>
Diamo un'occhiata più da vicino a questi importanti elementi e a come possono aiutare a costruire un template incredibile.
Tag
Un modello contiene tag che controllano la logica del modello (per esempio, i cicli foreach) o le espressioni di
output. Per entrambi viene usato un unico delimitatore { ... }
, in modo da non dover pensare a quale delimitatore
usare in quale situazione, come avviene con altri sistemi. Se il carattere {
è seguito da una virgoletta o da uno
spazio, Latte non lo considera l'inizio di un tag, per cui si possono usare costrutti JavaScript, JSON o regole CSS nei template
senza problemi.
Vedere la panoramica di tutti i tag. Inoltre, è possibile creare tag personalizzati.
Latte capisce il PHP
È possibile utilizzare espressioni PHP che si conoscono bene all'interno dei tag:
- variabili
- stringhe (compresi HEREDOC e NOWDOC), array, numeri, ecc.
- operatori
- chiamate a funzioni e metodi (che possono essere limitate dalla sandbox)
- corrispondenza
- funzioni anonime
- callback
- commenti multilinea
/* ... */
- ecc.
Inoltre, Latte aggiunge diverse estensioni alla sintassi di PHP.
n:attributi
Ogni tag di coppia, come {if} … {/if}
, che opera su un singolo elemento HTML può essere scritto in notazione n:attributi. Per esempio, {foreach}
nell'esempio precedente potrebbe essere scritto anche
in questo modo:
<ul n:if="$items">
<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>
La funzionalità corrisponde quindi all'elemento HTML in cui è scritta:
{var $items = ['I', '♥', 'Latte']}
<p n:foreach="$items as $item">{$item}</p>
Stampe:
<p>I</p>
<p>♥</p>
<p>Latte</p>
Utilizzando il prefisso inner-
possiamo alterare il comportamento in modo che la funzionalità si applichi solo al
corpo dell'elemento:
<div n:inner-foreach="$items as $item">
<p>{$item}</p>
<hr>
</div>
Stampe:
<div>
<p>I</p>
<hr>
<p>♥</p>
<hr>
<p>Latte</p>
<hr>
</div>
Oppure utilizzando il prefisso tag-
la funzionalità viene applicata solo ai tag HTML:
<p><a href={$url} n:tag-if="$url">Title</a></p>
A seconda del valore della variabile $url
verrà stampato:
// when $url is empty
<p>Title</p>
// when $url equals 'https://nette.org'
<p><a href="https://nette.org">Title</a></p>
Tuttavia, gli attributi n:non sono solo una scorciatoia per i tag di coppia, ma esistono anche alcuni attributi n:puri, come ad esempio il migliore amico del codificatore n:class.
Filtri
Vedere il riepilogo dei filtri standard.
Latte consente di chiamare i filtri utilizzando la notazione del segno di pipe (è consentito lo spazio precedente):
<h1>{$heading|upper}</h1>
I filtri possono essere concatenati, in tal caso si applicano in ordine da sinistra a destra:
<h1>{$heading|lower|capitalize}</h1>
I parametri vengono inseriti dopo il nome del filtro, separati da due punti o da una virgola:
<h1>{$heading|truncate:20,''}</h1>
I filtri possono essere applicati alle espressioni:
{var $name = ($title|upper) . ($subtitle|lower)}
Su blocco:
<h1>{block |lower}{$heading}{/block}</h1>
O direttamente sul valore (in combinazione con {=expr}
):
<h1>{=' Hello world '|trim}<h1>
Tag HTML dinamici
Latte supporta i tag HTML dinamici, utili quando si ha bisogno di flessibilità nei nomi dei tag:
<h{$level}>Heading</h{$level}>
Ad esempio, il codice qui sopra può generare <h1>Heading</h1>
o
<h2>Heading</h2>
a seconda del valore della variabile $level
. I tag HTML dinamici in Latte
devono sempre essere accoppiati. L'alternativa è il n:tag.
Poiché Latte è un sistema di template sicuro, controlla che il nome del tag risultante sia valido e non contenga valori indesiderati o dannosi. Inoltre, garantisce che il nome del tag finale sia sempre uguale a quello del tag di apertura.
Commenti
I commenti sono scritti in questo modo e non vengono inseriti nell'output:
{Questo è un commento in Latte.}
I commenti PHP funzionano all'interno dei tag:
{include 'file.info', /* value: 123 */}
Zucchero sintattico
Stringhe senza virgolette
Le virgolette possono essere omesse per le stringhe semplici:
as in PHP: {var $arr = ['hello', 'btn--default', '€']}
abbreviated: {var $arr = [hello, btn--default, €]}
Le stringhe semplici sono quelle composte esclusivamente da lettere, cifre, trattini bassi, trattini e punti. Non devono
iniziare con una cifra e non devono iniziare o terminare con un trattino. Non deve essere composta solo da lettere maiuscole e
trattini bassi, perché in tal caso viene considerata una costante (ad esempio PHP_VERSION
). E non deve collidere con
le parole chiave and
, array
, clone
, default
, false
,
in
, instanceof
, new
, null
, or
, return
,
true
, xor
.
Operatore ternario breve
Se il terzo valore dell'operatore ternario è vuoto, può essere omesso:
as in PHP: {$stock ? 'In stock' : ''}
abbreviated: {$stock ? 'In stock'}
Notazione moderna della chiave nell'array
Le chiavi dell'array possono essere scritte in modo simile ai parametri denominati quando si chiamano le funzioni:
as in PHP: {var $arr = ['one' => 'item 1', 'two' => 'item 2']}
modern: {var $arr = [one: 'item 1', two: 'item 2']}
Filtri
I filtri possono essere utilizzati per qualsiasi espressione, basta racchiudere il tutto tra parentesi:
{var $content = ($text|truncate: 30|upper)}
Operatore in
L'operatore in
può essere utilizzato per sostituire la funzione in_array()
. Il confronto è sempre
rigoroso:
{* come in_array($item, $items, true) *}
{if $item in $items}
...
{/if}
Una finestra nella storia
Nel corso della sua storia, Latte ha inventato una serie di caramelle sintattiche che sono apparse in PHP qualche anno dopo.
Per esempio, in Latte era possibile scrivere gli array come [1, 2, 3]
invece di array(1, 2, 3)
o usare
l'operatore nullsafe $obj?->foo
molto prima che fosse possibile in PHP. Latte ha anche introdotto l'operatore di
espansione degli array (expand) $arr
, che è l'equivalente dell'odierno operatore ...$arr
di PHP.
L'operatore undefined-safe ??->
, che è simile all'operatore nullsafe ?->
, ma non solleva un
errore se la variabile non esiste, è stato creato per ragioni storiche e oggi si consiglia di utilizzare l'operatore standard di
PHP ?->
.
Limitazioni di PHP in Latte
In Latte si possono scrivere solo espressioni PHP. Cioè, non si possono usare affermazioni che terminano con un punto e
virgola. Non si possono dichiarare classi o usare strutture di controllo, come if
,
foreach
, switch
, return
, try
, throw
e altre, al posto delle quali
Latte offre i suoi tag. Non è inoltre possibile utilizzare attributi, backtick o altre costanti magiche. Non si possono nemmeno usare
unset
, echo
, include
, require
, exit
, eval
, perché
non sono funzioni, ma costrutti speciali del linguaggio PHP e quindi non espressioni. Sono supportati solo i commenti a più
righe /* ... */
.
Tuttavia, è possibile aggirare queste limitazioni attivando l'estensione RawPhpExtension, che consente di utilizzare qualsiasi codice PHP nel tag
{php ...}
sotto la responsabilità dell'autore del template.