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}