Passaggio di Variabili tra Template

Questa guida spiega come le variabili vengono passate tra i template in Latte utilizzando vari tag come {include}, {import}, {embed}, {layout}, {sandbox} e altri. Imparerete anche come lavorare con le variabili nei tag {block} e {define}, e a cosa serve il tag {parameters}.

Tipi di Variabili

Le variabili in Latte possono essere divise in tre categorie a seconda di come e dove sono definite:

Variabili di input sono quelle passate al template dall'esterno, ad esempio da uno script PHP o tramite un tag come {include}.

$latte->render('template.latte', ['userName' => 'Jan', 'userAge' => 30]);

Variabili d'ambiente sono variabili esistenti nel punto di un certo tag. Includono tutte le variabili di input e altre variabili create usando tag come {var}, {default} o all'interno di un ciclo {foreach}.

{foreach $users as $user}
	{include 'userBox.latte', user: $user}
{/foreach}

Variabili esplicite sono quelle specificate direttamente all'interno di un tag e inviate al template di destinazione.

{include 'userBox.latte', name: $user->name, age: $user->age}

{block}

Il tag {block} viene utilizzato per definire blocchi di codice riutilizzabili che possono essere personalizzati o estesi nei template ereditati. Le variabili d'ambiente definite prima del blocco sono disponibili all'interno del blocco, ma qualsiasi modifica alle variabili si rifletterà solo all'interno di quel blocco.

{var $foo = 'originale'}
{block example}
	{var $foo = 'modificato'}
{/block}

{$foo}    // stampa: originale

{define}

Il tag {define} serve per creare blocchi che vengono renderizzati solo dopo essere stati chiamati tramite {include}. Le variabili disponibili all'interno di questi blocchi dipendono dal fatto che siano specificati parametri nella definizione. Se sì, hanno accesso solo a questi parametri. Se no, hanno accesso a tutte le variabili di input del template in cui sono definiti i blocchi.

{define hello}
	{* ha accesso a tutte le variabili di input del template *}
{/define}

{define hello $name}
	{* ha accesso solo al parametro $name *}
{/define}

{parameters}

Il tag {parameters} serve per dichiarare esplicitamente le variabili di input attese all'inizio del template. In questo modo è facile documentare le variabili attese e i loro tipi di dati. È anche possibile definire valori predefiniti.

{parameters int $age, string $name = 'sconosciuto'}
<p>Età: {$age}, Nome: {$name}</p>

{include file}

Il tag {include file} serve per inserire un intero template. A questo template vengono passate sia le variabili di input del template in cui viene utilizzato il tag, sia le variabili definite esplicitamente in esso. Il template di destinazione può però limitare lo scope usando {parameters}.

{include 'profile.latte', userId: $user->id}

{include block}

Quando si include un blocco definito nello stesso template, vengono passate ad esso tutte le variabili d'ambiente ed esplicitamente definite:

{define blockName}
	<p>Nome: {$name}, Età: {$age}</p>
{/define}

{var $name = 'Jan', $age = 30}
{include blockName}

In questo esempio, le variabili $name e $age vengono passate al blocco blockName. Allo stesso modo si comporta anche {include parent}.

Quando si include un blocco da un altro template, vengono passate solo le variabili di input ed esplicitamente definite. Le variabili d'ambiente non sono automaticamente disponibili.

{include blockInOtherTemplate, name: $name, age: $age}

{layout} o {extends}

Questi tag definiscono il layout a cui vengono passate le variabili di input del template figlio e inoltre le variabili create nel codice prima dei blocchi:

{layout 'layout.latte'}
{var $seo = 'index, follow'}

Template layout.latte:

<head>
	<meta name="robots" content="{$seo}">
</head>

{embed}

Il tag {embed} è simile al tag {include}, ma consente l'inserimento di blocchi nel template. A differenza di {include}, vengono passate solo le variabili dichiarate esplicitamente:

{embed 'menu.latte', items: $menuItems}
{/embed}

In questo esempio, il template menu.latte ha accesso solo alla variabile $items.

Al contrario, nei blocchi all'interno di {embed} c'è accesso a tutte le variabili d'ambiente:

{var $name = 'Jan'}
{embed 'menu.latte', items: $menuItems}
	{block foo}
		{$name}
	{/block}
{/embed}

{import}

Il tag {import} viene utilizzato per caricare blocchi da altri template. Vengono trasferite sia le variabili di input che quelle dichiarate esplicitamente ai blocchi importati.

{import 'buttons.latte'}

{sandbox}

Il tag {sandbox} isola il template per un'elaborazione sicura. Le variabili vengono passate esclusivamente in modo esplicito.

{sandbox 'secure.latte', data: $secureData}
versione: 3.0