Sintassi
La sintassi di Latte è nata dalle esigenze pratiche dei web designer. Abbiamo cercato la sintassi più user-friendly, con la quale puoi scrivere elegantemente anche costrutti che altrimenti rappresenterebbero una vera sfida. Allo stesso tempo, tutte le espressioni sono scritte esattamente come in PHP, quindi non devi imparare un nuovo linguaggio. Semplicemente sfrutti ciò che sai già fare.
Di seguito è riportato un template minimo che illustra alcuni elementi di base: tag, n:attributi, commenti e filtri.
{* questo è un commento *}
<ul n:if=$items> {* n:if è un n:attributo *}
{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 aiutarti a creare un template straordinario.
Tag
Il template contiene tag che controllano la logica del template (ad esempio i cicli foreach) o stampano espressioni.
Per entrambi si utilizza un unico delimitatore { ... }
, quindi non devi pensare a quale delimitatore usare in quale
situazione, come accade in altri sistemi. Se il carattere {
è seguito da una virgoletta o da uno spazio, Latte non
lo considera l'inizio di un tag, grazie al quale puoi utilizzare senza problemi anche costrutti JavaScript, JSON o regole CSS nei
template.
Dai un'occhiata alla panoramica di tutti i tag. Inoltre, puoi creare anche tag personalizzati.
Latte capisce PHP
All'interno dei tag puoi utilizzare le espressioni PHP che conosci bene:
- variabili
- stringhe (inclusi HEREDOC e NOWDOC), array, numeri, ecc.
- operatori
- chiamate a funzioni e metodi (che possono essere limitate da sandbox)
- match
- funzioni anonime
- callback
- commenti multiriga
/* ... */
- ecc…
Inoltre, Latte completa la sintassi PHP con alcune piacevoli estensioni.
n:attributi
Tutti i tag accoppiati, ad esempio {if} … {/if}
, che operano su un singolo elemento HTML, possono essere
riscritti sotto forma di n:attributi. In questo modo sarebbe possibile scrivere, ad esempio, anche {foreach}
nell'esempio introduttivo:
<ul n:if=$items>
<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>
La funzionalità si applica quindi all'elemento HTML in cui è posizionata:
{var $items = ['I', '♥', 'Latte']}
<p n:foreach="$items as $item">{$item}</p>
stampa:
<p>I</p>
<p>♥</p>
<p>Latte</p>
Utilizzando il prefisso inner-
possiamo modificare il comportamento in modo che si applichi solo alla parte
interna dell'elemento:
<div n:inner-foreach="$items as $item">
<p>{$item}</p>
<hr>
</div>
Verrà stampato:
<div>
<p>I</p>
<hr>
<p>♥</p>
<hr>
<p>Latte</p>
<hr>
</div>
Oppure, utilizzando il prefisso tag-
, applichiamo la funzionalità solo ai tag HTML stessi:
<p><a href={$url} n:tag-if="$url">Title</a></p>
Che stamperà a seconda della variabile $url
:
{* quando $url è vuoto *}
<p>Title</p>
{* quando $url contiene 'https://nette.org' *}
<p><a href="https://nette.org">Title</a></p>
Tuttavia, gli n:attributi non sono solo una scorciatoia per i tag accoppiati. Esistono anche n:attributi puri, come n:href o l'aiutante molto utile per il codificatore n:class.
Filtri
Dai un'occhiata alla panoramica dei filtri standard.
I filtri vengono scritti dopo una barra verticale (può esserci uno spazio prima):
<h1>{$heading|upper}</h1>
I filtri possono essere concatenati e vengono applicati nell'ordine da sinistra a destra:
<h1>{$heading|lower|capitalize}</h1>
I parametri vengono specificati dopo il nome del filtro, separati da due punti o virgole:
<h1>{$heading|truncate:20,''}</h1>
I filtri possono essere applicati anche a un'espressione:
{var $name = ($title|upper) . ($subtitle|lower)}
A un blocco:
<h1>{block |lower}{$heading}{/block}</h1>
Oppure direttamente al valore (in combinazione con il tag {=expr}
):
<h1>{=' Hello world '|trim}<h1>
Tag HTML dinamici
Latte supporta i tag HTML dinamici, che sono utili quando hai bisogno di flessibilità nei nomi dei tag:
<h{$level}>Heading</h{$level}>
Il codice sopra può ad esempio generare <h1>Heading</h1>
o <h2>Heading</h2>
a seconda del valore della variabile $level
. I tag HTML dinamici in Latte devono essere sempre accoppiati. La loro
alternativa è n:tag.
Poiché Latte è un sistema di templating sicuro, controlla che il nome del tag risultante sia valido e non contenga valori indesiderati o dannosi. Inoltre, garantisce che il nome del tag di chiusura sia sempre lo stesso del nome del tag di apertura.
Commenti
I commenti vengono scritti in questo modo e non vengono inclusi nell'output:
{* questo è un commento in Latte *}
All'interno dei tag funzionano i commenti PHP:
{include 'file.info', /* value: 123 */}
Zucchero sintattico
Stringhe senza virgolette
Per le stringhe semplici è possibile omettere le virgolette:
come in PHP: {var $arr = ['hello', 'btn--default', '€']}
abbreviato: {var $arr = [hello, btn--default, €]}
Le stringhe semplici sono quelle composte esclusivamente da lettere, numeri, trattini bassi, trattini e punti. Non devono
iniziare con un numero e non devono iniziare o finire con un trattino. Non devono essere composte solo da lettere maiuscole e
trattini bassi, perché in tal caso vengono considerate costanti (es. PHP_VERSION
). E non devono entrare in conflitto
con le parole chiave: and
, array
, clone
, default
, false
,
in
, instanceof
, new
, null
, or
, return
,
true
, xor
.
Costanti
Poiché è possibile omettere le virgolette per le stringhe semplici, consigliamo di scrivere le costanti globali con una barra all'inizio per distinguerle:
{if \PROJECT_ID === 1} ... {/if}
Questa scrittura è completamente valida in PHP stesso, la barra indica che la costante si trova nel namespace globale.
Operatore ternario abbreviato
Se il terzo valore dell'operatore ternario è vuoto, può essere omesso:
come in PHP: {$stock ? 'Disponibile' : ''}
abbreviato: {$stock ? 'Disponibile'}
Notazione moderna delle chiavi negli array
Le chiavi negli array possono essere scritte in modo simile ai parametri nominati nella chiamata di funzioni:
come in PHP: {var $arr = ['one' => 'item 1', 'two' => 'item 2']}
moderno: {var $arr = [one: 'item 1', two: 'item 2']}
Filtri
I filtri possono essere utilizzati per qualsiasi espressione, basta racchiudere l'intero costrutto tra parentesi:
{var $content = ($text|truncate: 30|upper)}
Operatore in
L'operatore in
può sostituire la funzione in_array()
. Il confronto è sempre rigoroso:
{* analogo a in_array($item, $items, true) *}
{if $item in $items}
...
{/if}
Finestra storica
Latte ha introdotto nel corso della sua storia una serie di zuccheri sintattici che sono apparsi in PHP stesso dopo alcuni
anni. Ad esempio, in Latte era possibile scrivere array come [1, 2, 3]
invece di array(1, 2, 3)
o utilizzare l'operatore nullsafe $obj?->foo
molto prima che fosse possibile in PHP stesso. Latte ha anche
introdotto l'operatore per l'espansione dell'array (expand) $arr
, che è l'equivalente dell'odierno operatore
...$arr
di PHP.
L'operatore undefined-safe ??->
, che è un analogo dell'operatore nullsafe ?->
, ma non genera
un errore se la variabile non esiste, è nato per ragioni storiche e oggi consigliamo di utilizzare l'operatore PHP standard
?->
.
Limitazioni di PHP in Latte
In Latte è possibile scrivere solo espressioni PHP. Quindi non è possibile utilizzare istruzioni terminate da punto e
virgola. Non è possibile dichiarare classi o utilizzare strutture di controllo, es. if
,
foreach
, switch
, return
, try
, throw
e altre, al posto delle quali
Latte offre i suoi tag. Inoltre, non è possibile utilizzare attributi, backticks o alcune costanti magiche. Non è possibile utilizzare nemmeno
unset
, echo
, include
, require
, exit
, eval
, perché
non sono funzioni, ma costrutti linguistici speciali di PHP, e non sono quindi espressioni. I commenti sono supportati solo
quelli multiriga /* ... */
.
Queste limitazioni possono tuttavia essere aggirate attivando l'estensione RawPhpExtension, grazie alla quale è possibile utilizzare nel
tag {php ...}
qualsiasi codice PHP sotto la responsabilità dell'autore del template.