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 :
- variables
- chaînes de caractères (y compris HEREDOC et NOWDOC), tableaux, nombres, etc.
- opérateurs
- les appels de fonctions et de méthodes (qui peuvent être restreints par la sandbox)
- correspondance
- fonctions anonymes
- les callbacks
- commentaires multi-lignes
/* ... */
- etc…
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.