Syntaxe

La syntaxe de Latte est née des exigences pratiques des webdesigners. Nous avons recherché la syntaxe la plus conviviale, avec laquelle vous pouvez écrire élégamment même des constructions qui représentent autrement un véritable casse-tête. En même temps, toutes les expressions s'écrivent exactement comme en PHP, vous n'avez donc pas besoin d'apprendre un nouveau langage. Vous mettez simplement à profit ce que vous savez déjà.

Ci-dessous se trouve un template minimal qui illustre plusieurs éléments de base : balises, n:attributs, commentaires et filtres.

{* ceci est un commentaire *}
<ul n:if=$items>                  {* n:if est un n:attribut *}
{foreach $items as $item}         {* balise représentant une boucle foreach *}
	<li>{$item|capitalize}</li>   {* balise affichant une variable avec un filtre *}
{/foreach}                        {* fin de la boucle *}
</ul>

Examinons de plus près ces éléments importants et comment ils peuvent vous aider à créer un template incroyable.

Balises

Un template contient des balises qui contrôlent la logique du template (par exemple, les boucles foreach) ou affichent des expressions. Pour les deux, un seul délimiteur { ... } est utilisé, vous n'avez donc pas à réfléchir au délimiteur à utiliser dans quelle situation, comme c'est le cas avec d'autres systèmes. Si un guillemet ou un espace suit le caractère {, Latte ne le considère pas comme le début d'une balise, ce qui vous permet d'utiliser sans problème des constructions JavaScript, JSON ou des règles CSS dans les templates.

Consultez l'aperçu de toutes les balises. De plus, vous pouvez créer vos propres balises personnalisées.

Latte comprend PHP

À l'intérieur des balises, vous pouvez utiliser les expressions PHP que vous connaissez bien :

De plus, Latte complète la syntaxe PHP avec plusieurs extensions agréables.

n:attributs

Toutes les balises paires, par exemple {if} … {/if}, opérant sur un seul élément HTML, peuvent être réécrites sous forme de n:attributs. C'est ainsi que l'on pourrait écrire par exemple le {foreach} de l'exemple initial :

<ul n:if=$items>
	<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>

La fonctionnalité s'applique alors à l'élément HTML dans lequel elle est placée :

{var $items = ['J\'', '♥', 'Latte']}

<p n:foreach="$items as $item">{$item}</p>

affiche :

<p>J'</p>
<p>♥</p>
<p>Latte</p>

À l'aide du préfixe inner-, nous pouvons modifier le comportement pour qu'il ne s'applique qu'à la partie interne de l'élément :

<div n:inner-foreach="$items as $item">
	<p>{$item}</p>
	<hr>
</div>

S'affichera :

<div>
	<p>J'</p>
	<hr>
	<p>♥</p>
	<hr>
	<p>Latte</p>
	<hr>
</div>

Ou à l'aide du préfixe tag-, nous appliquons la fonctionnalité uniquement aux balises HTML elles-mêmes :

<p><a href={$url} n:tag-if="$url">Titre</a></p>

Ce qui affiche en fonction de la variable $url:

{* quand $url est vide *}
<p>Titre</p>

{* quand $url contient 'https://nette.org' *}
<p><a href="https://nette.org">Titre</a></p>

Cependant, les n:attributs ne sont pas seulement un raccourci pour les balises paires. Il existe aussi des n:attributs purs, comme n:href ou l'aide très pratique pour le codeur n:class.

Filtres

Consultez l'aperçu des filtres standard.

Les filtres s'écrivent après une barre verticale (il peut y avoir un espace avant) :

<h1>{$heading|upper}</h1>

Les filtres peuvent être chaînés et sont alors appliqués dans l'ordre de gauche à droite :

<h1>{$heading|lower|capitalize}</h1>

Les paramètres sont spécifiés après le nom du filtre, séparés par des deux-points ou des virgules :

<h1>{$heading|truncate:20,''}</h1>

Les filtres peuvent également être appliqués à une expression :

{var $name = ($title|upper) . ($subtitle|lower)}

Sur un bloc :

<h1>{block |lower}{$heading}{/block}</h1>

Ou directement sur la valeur (en combinaison avec la balise {=expr}):

<h1>{='  Bonjour le monde  '|trim}<h1>

Balises HTML dynamiques

Latte prend en charge les balises HTML dynamiques, qui sont utiles lorsque vous avez besoin de flexibilité dans les noms de balises :

<h{$level}>Titre</h{$level}>

Le code ci-dessus peut par exemple générer <h1>Titre</h1> ou <h2>Titre</h2> en fonction de la valeur de la variable $level. Les balises HTML dynamiques dans Latte doivent toujours être paires. Leur alternative est n:tag.

Comme Latte est un système de templates sécurisé, il vérifie si le nom de balise résultant est valide et ne contient aucune valeur indésirable ou nuisible. De plus, il garantit que le nom de la balise de fin sera toujours le même que le nom de la balise d'ouverture.

Commentaires

Les commentaires s'écrivent de cette manière et n'apparaissent pas dans la sortie :

{* ceci est un commentaire en Latte *}

À l'intérieur des balises, les commentaires PHP fonctionnent :

{include 'file.info', /* value: 123 */}

Sucre syntaxique

Chaînes sans guillemets

Pour les chaînes simples, on peut omettre les guillemets :

comme en PHP :  {var $arr = ['bonjour', 'btn--default', '€']}

raccourci :    {var $arr = [bonjour, btn--default, €]}

Les chaînes simples sont celles qui sont composées uniquement de lettres, chiffres, traits de soulignement, tirets et points. Elles ne doivent pas commencer par un chiffre et ne doivent pas commencer ou finir par un tiret. Elles ne doivent pas être composées uniquement de majuscules et de traits de soulignement, car elles sont alors considérées comme des constantes (par ex. PHP_VERSION). Et elles ne doivent pas entrer en conflit avec les mots-clés : and, array, clone, default, false, in, instanceof, new, null, or, return, true, xor.

Constantes

Comme il est possible d'omettre les guillemets pour les chaînes simples, nous recommandons d'écrire les constantes globales avec une barre oblique au début pour les distinguer :

{if \PROJECT_ID === 1} ... {/if}

Cette écriture est tout à fait valide en PHP même, la barre oblique indique que la constante est dans l'espace de noms global.

Opérateur ternaire abrégé

Si la troisième valeur de l'opérateur ternaire est vide, on peut l'omettre :

comme en PHP :  {$stock ? 'En stock' : ''}

raccourci :    {$stock ? 'En stock'}

Notation moderne des clés dans un tableau

Les clés dans un tableau peuvent être écrites de manière similaire aux paramètres nommés lors de l'appel de fonctions :

comme en PHP :  {var $arr = ['one' => 'item 1', 'two' => 'item 2']}

moderne :     {var $arr = [one: 'item 1', two: 'item 2']}

Filtres

Les filtres peuvent être utilisés pour n'importe quelle expression, il suffit d'enfermer l'ensemble entre parenthèses :

{var $content = ($text|truncate: 30|upper)}

Opérateur in

L'opérateur in peut remplacer la fonction in_array(). La comparaison est toujours stricte :

{* équivalent de in_array($item, $items, true) *}
{if $item in $items}
	...
{/if}

Fenêtre historique

Latte a introduit au fil de son histoire toute une série de sucres syntaxiques qui sont apparus quelques années plus tard dans PHP même. Par exemple, en Latte, il était possible d'écrire des tableaux comme [1, 2, 3] au lieu de array(1, 2, 3) ou d'utiliser l'opérateur nullsafe $obj?->foo bien avant que cela ne soit possible en PHP même. Latte a également introduit l'opérateur pour déballer un tableau (expand) $arr, qui est l'équivalent de l'opérateur actuel ...$arr de PHP.

L'opérateur Undefined-safe ??->, qui est un équivalent de l'opérateur nullsafe ?->, mais qui ne déclenche pas d'erreur si la variable n'existe pas, a été créé pour des raisons historiques et aujourd'hui nous recommandons d'utiliser l'opérateur PHP standard ?->.

Limitations de PHP dans Latte

En Latte, on ne peut écrire que des expressions PHP. C'est-à-dire qu'on ne peut pas utiliser d'instructions terminées par un point-virgule. On ne peut pas déclarer de classes ou utiliser des structures de contrôle, par ex. if, foreach, switch, return, try, throw et autres, pour lesquelles Latte propose ses balises. On ne peut pas non plus utiliser d'attributs, de backticks ou certaines constantes magiques. On ne peut pas non plus utiliser unset, echo, include, require, exit, eval, car ce ne sont pas des fonctions, mais des constructions spéciales du langage PHP, et ce ne sont donc pas des expressions. Seuls les commentaires multilignes /* ... */ sont pris en charge.

Ces limitations peuvent cependant être contournées en activant l'extension RawPhpExtension, grâce à laquelle on peut ensuite utiliser n'importe quel code PHP dans la balise {php ...} sous la responsabilité de l'auteur du template.

version: 3.0