Paso de variables entre plantillas

Esta guía explica cómo se pasan variables entre plantillas en Latte usando varias etiquetas como {include}, {import}, {embed}, {layout}, {sandbox}, y otras. También aprenderá cómo trabajar con variables en las etiquetas {block} y {define}, y el propósito de la etiqueta {parameters}.

Tipos de variables

Las variables en Latte pueden dividirse en tres categorías en función de cómo y dónde se definen:

Variables de entrada son aquellas que se pasan a la plantilla desde fuera, por ejemplo, desde un script PHP o usando una etiqueta como {include}.

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

Variables de entorno son variables existentes en la ubicación de una etiqueta específica. Estas incluyen todas las variables de entrada y otras variables creadas usando etiquetas como {var}, {default}, o dentro de un bucle {foreach}.

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

Variables explícitas son las que se especifican directamente en una 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 pueden personalizarse o ampliarse en plantillas heredadas. Las variables circundantes definidas antes del bloque están disponibles dentro del bloque, pero cualquier cambio en las variables se refleja sólo dentro de ese bloque.

{var $foo = 'original'}
{block example}
	{var $foo = 'modified'}
{/block}

{$foo}    // outputs: original

{define}

La etiqueta {define} se utiliza para crear bloques que sólo se renderizan cuando se invocan mediante {include}. Las variables disponibles dentro de estos bloques dependen de si se especifican parámetros en la definición. Si se especifican parámetros, sólo se puede acceder a ellos. Si no, todas las variables de entrada de la plantilla en la que se definen los bloques son accesibles.

{define hello}
	{* has access to all input variables of the template *}
{/define}

{define hello $name}
	{* has access only to the $name parameter *}
{/define}

{parameters}

La etiqueta {parameters} se utiliza para declarar explícitamente las variables de entrada esperadas al principio de la plantilla. De este modo, puede documentar fácilmente las variables esperadas y sus tipos de datos. También es posible definir valores por defecto.

{parameters int $age, string $name = 'unknown'}
<p>Age: {$age}, Name: {$name}</p>

{include file}

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

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

{include block}

Al insertar un bloque definido en la misma plantilla, se le pasan todas las variables circundantes y definidas explícitamente:

{define blockName}
	<p>Name: {$name}, Age: {$age}</p>
{/define}

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

En este ejemplo, las variables $name y $age se pasan al bloque blockName. El mismo comportamiento se aplica a {include parent}.

Al insertar un bloque desde otra plantilla, sólo se pasan las variables de entrada y las definidas explícitamente. Las variables circundantes no están disponibles automáticamente.

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

{layout} o {extends}

Estas etiquetas definen un diseño al que se pasan las variables de entrada de la plantilla hija y las variables creadas en el código antes de los bloques:

{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 en la plantilla. A diferencia de {include}, sólo se pasan variables declaradas explícitamente:

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

En este ejemplo, la plantilla menu.latte sólo tiene acceso a la variable $items.

Por el contrario, los bloques dentro de {embed} tienen acceso a todas las variables circundantes:

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

{import}

La etiqueta {import} se utiliza para cargar bloques de otras plantillas. Tanto las variables de entrada como las declaradas explícitamente se pasan a los bloques importados.

{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