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:

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.

versione: 3.0