Passage de variables d'un modèle à l'autre

Ce guide explique comment les variables sont transmises entre les modèles dans Latte en utilisant diverses balises telles que {include}, {import}, {embed}, {layout}, {sandbox}, et d'autres. Vous apprendrez également à travailler avec des variables dans les balises {block} et {define}, ainsi que l'utilité de la balise {parameters}.

Types de variables

Les variables dans Latte peuvent être divisées en trois catégories en fonction de la manière dont elles sont définies et de l'endroit où elles le sont :

Les variables d'entrée sont celles qui sont transmises au modèle depuis l'extérieur, par exemple, depuis un script PHP ou à l'aide d'une balise comme {include}.

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

Les variables environnantes sont des variables existant à l'emplacement d'une balise spécifique. Elles comprennent toutes les variables d'entrée et les autres variables créées à l'aide de balises telles que {var}, {default}, ou à l'intérieur d'une boucle {foreach}.

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

Les variables explicites sont celles qui sont directement spécifiées dans une balise et envoyées au modèle cible.

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

{block}

La balise {block} est utilisée pour définir des blocs de code réutilisables qui peuvent être personnalisés ou étendus dans des modèles hérités. Les variables environnantes définies avant le bloc sont disponibles à l'intérieur du bloc, mais toute modification des variables n'est répercutée qu'à l'intérieur de ce bloc.

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

{$foo}    // outputs: original

{define}

La balise {define} est utilisée pour créer des blocs qui ne sont rendus que lorsqu'ils sont appelés à l'aide de {include}. Les variables disponibles à l'intérieur de ces blocs dépendent de la présence ou non de paramètres dans la définition. Si des paramètres sont spécifiés, seuls ces paramètres sont accessibles. Dans le cas contraire, toutes les variables d'entrée du modèle dans lequel les blocs sont définis sont accessibles.

{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 balise {parameters} est utilisée pour déclarer explicitement les variables d'entrée attendues au début du modèle. De cette manière, vous pouvez facilement documenter les variables attendues et leurs types de données. Il est également possible de définir des valeurs par défaut.

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

{include file}

La balise {include file} est utilisée pour insérer un modèle entier. Ce modèle est transmis à la fois aux variables d'entrée du modèle dans lequel la balise est utilisée et aux variables explicitement définies. Cependant, le modèle cible peut en limiter la portée en utilisant {parameters}.

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

{include block}

Lors de l'insertion d'un bloc défini dans le même modèle, toutes les variables environnantes et explicitement définies lui sont transmises :

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

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

Dans cet exemple, les variables $name et $age sont transmises au bloc blockName. Le même comportement s'applique à {include parent}.

Lors de l'insertion d'un bloc à partir d'un autre modèle, seules les variables d'entrée et les variables explicitement définies sont transmises. Les variables environnantes ne sont pas automatiquement disponibles.

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

{layout} ou {extends}

Ces balises définissent un modèle auquel sont transmises les variables d'entrée du modèle enfant et les variables créées dans le code avant les blocs :

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

Modèle layout.latte:

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

{embed}

La balise {embed} est similaire à la balise {include} mais permet d'intégrer des blocs dans le modèle. Contrairement à {include}, seules les variables explicitement déclarées sont transmises :

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

Dans cet exemple, le modèle menu.latte n'a accès qu'à la variable $items.

Inversement, les blocs à l'intérieur de {embed} ont accès à toutes les variables environnantes :

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

{import}

La balise {import} est utilisée pour charger des blocs provenant d'autres modèles. Les variables d'entrée et les variables explicitement déclarées sont transmises aux blocs importés.

{import 'buttons.latte'}

{sandbox}

La balise {sandbox} isole le modèle pour un traitement sûr. Les variables sont transmises exclusivement de manière explicite.

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