Syntaxe

Syntax Latte est né des besoins pratiques des concepteurs de sites Web. Nous étions à la recherche de la syntaxe la plus conviviale, avec laquelle vous pouvez écrire de manière élégante des constructions qui représentent autrement un véritable défi. En même temps, toutes les expressions sont écrites exactement de la même manière qu'en PHP, de sorte que vous n'avez pas à apprendre un nouveau langage. Il suffit de tirer le meilleur parti de ce que l'on connaît déjà.

Vous trouverez ci-dessous un modèle minimal qui illustre quelques éléments de base : balises, n:attributes, commentaires et filtres.

{* ceci est un commentaire *}
<ul n:if="$items">                {* n:if est n:atribut *}
{foreach $items as $item}         {* tag représentant la boucle foreach *}
	<li>{$item|capitalize}</li>   {* qui imprime une variable avec un filtre *}
{/foreach}                        {* fin du cycle *}

Examinons de plus près ces éléments importants et comment ils peuvent vous aider à construire un modèle incroyable.

Marqueurs

Un modèle contient des balises qui contrôlent la logique du modèle (par exemple, les boucles foreach) ou les expressions de sortie. Les deux utilisent le même délimiteur { ... }, il n'est donc pas nécessaire de se demander quel délimiteur utiliser dans chaque situation, contrairement à d'autres systèmes. Si le caractère { est suivi d'un guillemet ou d'un espace, Latte ne le considère pas comme le début d'une balise, permettant ainsi l'utilisation sans problème de constructions JavaScript, JSON ou CSS dans les modèles.

Voir l'aperçu de toutes les balises. En outre, vous pouvez également créer des balises personnalisées.

Latte comprend le PHP

Vous pouvez utiliser des expressions PHP que vous connaissez bien à l'intérieur des balises :

De plus, Latte ajoute plusieurs extensions à la syntaxe PHP.

n:attributs

Chaque balise de paire, telle que {if} … {/if}, opérant sur un seul élément HTML peut être écrite en notation n:attribut. Par exemple, {foreach} dans l'exemple ci-dessus pourrait également être écrit de cette façon :

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

La fonctionnalité correspond alors à l'élément HTML dans lequel elle est écrite :

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

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

Imprimés :

<p>I</p>
<p>♥</p>
<p>Latte</p>

En utilisant le préfixe inner-, nous pouvons modifier le comportement de sorte que la fonctionnalité s'applique uniquement au corps de l'élément :

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

Imprimés :

<div>
	<p>I</p>
	<hr>
	<p>♥</p>
	<hr>
	<p>Latte</p>
	<hr>
</div>

Ou en utilisant le préfixe tag- la fonctionnalité est appliquée sur les balises HTML uniquement :

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

Selon la valeur de la variable $url, ceci s'imprimera :

// when $url is empty
<p>Title</p>

// when $url equals 'https://nette.org'
<p><a href="https://nette.org">Title</a></p>

Cependant, les attributs n:ne sont pas seulement un raccourci pour les balises de paire, il existe également des attributs n:purs, par exemple le meilleur ami du codeur, n:class.

Filtres

Voir le résumé des filtres standard.

Latte permet d'appeler les filtres en utilisant la notation du signe pipe (l'espace précédent est autorisé) :

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

Les filtres peuvent être enchaînés, dans ce cas ils s'appliquent dans l'ordre de gauche à droite :

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

Les paramètres sont placé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 être appliqués sur une expression :

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

Sur le bloc :

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

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

<h1>{='  Hello world  '|trim}<h1>

Commentaires

Les commentaires sont écrits de cette façon et n'apparaissent pas dans la sortie :

{* ceci est un commentaire en Latte *}

Les commentaires PHP fonctionnent à l'intérieur des balises :

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

Le sucre syntaxique

Chaînes de caractères sans guillemets

Les guillemets peuvent être omis pour les chaînes de caractères simples :

as in PHP:   {var $arr = ['hello', 'btn--default', '€']}

abbreviated: {var $arr = [hello, btn--default, €]}

Les chaînes de caractères simples sont celles qui sont composées uniquement de lettres, de chiffres, de traits de soulignement, de traits d'union et de points. Elles ne doivent pas commencer par un chiffre et ne doivent pas commencer ou finir par un trait d'union. Elle ne doit pas être composée uniquement de lettres majuscules et de traits de soulignement, car elle est alors considérée comme une constante (par exemple PHP_VERSION). Et il ne doit pas entrer en collision avec les mots-clés and, array, clone, default, false, in, instanceof, new, null, or, return, true, xor.

Opérateur ternaire court

Si la troisième valeur de l'opérateur ternaire est vide, elle peut être omise :

as in PHP:   {$stock ? 'In stock' : ''}

abbreviated: {$stock ? 'In stock'}

La notation moderne des clés dans le tableau

Les clés d'un tableau peuvent être écrites de la même manière que les paramètres nommés lors de l'appel de fonctions :

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

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

Filtres

Les filtres peuvent être utilisés pour n'importe quelle expression, il suffit de mettre le tout entre parenthèses :

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

Opérateur in

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

{* comme in_array($item, $items, true) *}
{if $item in $items}
	...
{/if}

Chaînage optionnel avec l'opérateur indéfini-sûr

L'opérateur undefined-safe ??-> est similaire à l'opérateur nullsafe ?->, mais ne génère pas d'erreur si une variable, une propriété ou un index n'existe pas du tout.

{$order??->id}

C'est une façon de dire que lorsque $order est défini et n'est pas nul, $order->id sera calculé, mais que lorsque $order est nul ou n'existe pas, on arrête ce qu'on fait et on renvoie simplement null.

Vous pourriez vous retrouver à utiliser ?-> pour remplacer beaucoup de code qui effectue des vérifications répétitives de nullité :

{$user??->address??->street}
// roughly means isset($user) && isset($user->address) ? $user->address->street : null

Une fenêtre dans l'histoire

Latte a proposé un certain nombre de bonbons syntaxiques au cours de son histoire, qui sont apparus dans PHP lui-même quelques années plus tard. Par exemple, en Latte, il était possible d'écrire les tableaux en tant que [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. Latte a également introduit l'opérateur d'expansion de tableau (expand) $arr, qui est l'équivalent de l'opérateur ...$arr de PHP.

Limitations de PHP dans Latte

Seules les expressions PHP peuvent être écrites dans Latte. En d'autres termes, vous ne pouvez pas déclarer de classes ni utiliser de structures de contrôle, telles que if, foreach, switch, return, try, throw et autres, au lieu desquelles Latte propose ses balises. Vous ne pouvez pas non plus utiliser d'attributs, de backticks ou de constantes magiques, car cela n'aurait aucun sens. Vous ne pouvez même pas utiliser echo, include, require, exit, eval, unset, car ce ne sont pas des fonctions, mais des constructions spéciales du langage PHP, et donc pas des expressions.

Toutefois, vous pouvez contourner ces limitations en activant l'extension RawPhpExtension, qui vous permet d'utiliser n'importe quel code PHP dans la balise {php ...}, sous la responsabilité de l'auteur du modèle.