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 :
- variables
- chaînes (y compris HEREDOC et NOWDOC), tableaux, nombres, etc.
- opérateurs
- appels de fonctions et de méthodes (qui peuvent être limités par le sandbox)
- match
- fonctions anonymes
- callbacks
- commentaires multilignes
/* ... */
- etc…
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.