Paso de variables entre plantillas

Esta guía te explicará cómo se pasan las variables entre plantillas en Latte usando diferentes etiquetas como {include}, {import}, {embed}, {layout}, {sandbox} y otras. También aprenderás cómo trabajar con variables en las etiquetas {block} y {define}, y para qué sirve la etiqueta {parameters}.

Tipos de variables

Las variables en Latte se pueden dividir en tres categorías según cómo y dónde se definen:

Variables de entrada: Son aquellas que se pasan a la plantilla desde el exterior, por ejemplo, desde un script PHP o mediante una etiqueta como {include}.

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

Variables de entorno: Son las variables que existen en el lugar donde se utiliza una etiqueta específica. Incluyen todas las variables de entrada y otras variables creadas mediante etiquetas como {var}, {default} o dentro de un bucle {foreach}.

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

Variables explícitas: Son aquellas que se especifican directamente dentro de la etiqueta y se envían a la plantilla de destino.

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

{block}

La etiqueta {block} se utiliza para definir bloques de código reutilizables que se pueden personalizar o ampliar en plantillas heredadas. Las variables de entorno definidas antes del bloque están disponibles dentro del bloque, pero cualquier modificación de estas variables solo tendrá efecto dentro del ámbito de ese bloque.

{var $foo = 'původní'}
{block example}
	{var $foo = 'změněný'}
{/block}

{$foo}    // imprime: `původní`

{define}

La etiqueta {define} sirve para crear bloques que se renderizan solo cuando son llamados mediante {include}. Las variables disponibles dentro de estos bloques dependen de si se especifican parámetros en su definición. Si se especifican parámetros, solo tienen acceso a dichos parámetros. Si no se especifican parámetros, tienen acceso a todas las variables de entrada de la plantilla donde se define el bloque.

{define hello}
	{* tiene acceso a todas las variables de entrada de la plantilla *}
{/define}

{define hello $name}
	{* solo tiene acceso al parámetro `$name` *}
{/define}

{parameters}

La etiqueta {parameters} sirve para declarar explícitamente las variables de entrada esperadas al principio de la plantilla. De esta manera, se pueden documentar fácilmente las variables esperadas y sus tipos de datos. También es posible definir valores predeterminados.

{parameters int $age, string $name = 'neznámé'}
<p>Edad: {$age}, Nombre: {$name}</p>

{include file}

La etiqueta {include file} sirve para insertar una plantilla completa. A esta plantilla se le pasan tanto las variables de entrada de la plantilla donde se usa la etiqueta, como las variables definidas explícitamente en la propia etiqueta {include}. Sin embargo, la plantilla de destino puede limitar el alcance de las variables disponibles usando {parameters}.

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

{include block}

Cuando insertas un bloque definido en la misma plantilla, se le pasan todas las variables de entorno y las definidas explícitamente:

{define blockName}
	<p>Nombre: {$name}, Edad: {$age}</p>
{/define}

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

En este ejemplo, las variables $name y $age se pasan al bloque blockName. De la misma manera se comporta {include parent}.

Al insertar un bloque desde otra plantilla (usando {include block from 'file.latte'}), solo se pasan las variables de entrada de la plantilla actual y las definidas explícitamente en la etiqueta {include}. Las variables de entorno no están disponibles automáticamente.

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

{layout} o {extends}

Estas etiquetas definen el layout (plantilla padre), al que se pasan las variables de entrada de la plantilla hija y, además, las variables creadas en el código de la plantilla hija antes de los bloques {block}:

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

Plantilla layout.latte:

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

{embed}

La etiqueta {embed} es similar a la etiqueta {include}, pero permite incrustar bloques definidos dentro de ella en la plantilla de destino. A diferencia de {include file}, solo se pasan las variables declaradas explícitamente en la etiqueta {embed}:

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

En este ejemplo, la plantilla menu.latte solo tiene acceso a la variable $items.

Por el contrario, los bloques {block} definidos dentro de {embed} tienen acceso a todas las variables de entorno del lugar donde se usa {embed}:

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

{import}

La etiqueta {import} se utiliza para importar bloques desde otras plantillas. A los bloques importados se les pasan tanto las variables de entrada de la plantilla actual como las declaradas explícitamente en la etiqueta {import}.

{import 'buttons.latte'}

{sandbox}

La etiqueta {sandbox} aísla la plantilla para un procesamiento seguro. Las variables se pasan exclusivamente de forma explícita.

{sandbox 'secure.latte', data: $secureData}
versión: 3.0