Comparaison des paradigmes PHPTemplate et Twig
À propos de Twig
Twig est un langage de templates compilé basé sur PHP. Lorsque votre page web est affichée, le moteur Twig prend le template et le transforme en un template PHP « compilé » qui est stocké dans un répertoire protégé à l'adresse sites/default/files/php/twig. La compilation est effectuée une seule fois, les fichiers templates sont mis en cache pour une réutilisation et recompilés lors du vidage du cache Twig.
L’initiative Drupal Twig a la même motivation que celle de Symfony : introduire un moteur moderne, puissant, orienté objet, qui permettra aux développeurs de se concentrer correctement sur Drupal.
1. Docblock
PHPTemplate :
<?php /** * @file * Description du fichier */ ?>
Twig :
{# /** * @file * Description du fichier */ #}
2. Noms des fichiers et fonctions
Fichier PHPTemplate : node--article.tpl.php
Fichier Twig : node--article.html.twig
Fonction PHPTemplate : THEME_node_links()
Fichier Twig : node-links.html.twig
3. Variables
Afficher une variable :
PHPTemplate : <div class="content"><?php print $content; ?></div>
Twig : <div class="content">{{ content }}</div>
Afficher un élément de clé de hachage [1]
PHPTemplate : <?php print $item['#item']['alt']; ?>
Twig : {{ item['#item'].alt }}
Définition d'une variable :
PHPTemplate : <?php $custom_var = $content->comments; ?>
Twig : {% set custom_var = content.comments %}
Définition d'un tableau :
PHPTemplate : <?php $args = array('@author' => $author, '@date' => $created); ?>
Twig : {% set args = {'@author': author, '@date': created} %}
4. Conditions
PHPTemplate : <?php if ($content->comments): endif; ?>
Twig : {% if content.comments %} {% endif %}
PHPTemplate : <?php if (!empty($content->comments)): endif; ?>
Twig : {% if content.comments is not empty %} {% endif %}
PHPTemplate : <?php if (isset($content->comments)): endif; ?>
Twig : {% if content.comments is defined %} {% endif %}
PHPTemplate : <?php if ($count > 0): endif; ?>
Twig : {% if count > 0 %} {% endif %}
5. Structures de contrôle
PHPTemplate : <?php foreach ($users as $user) {} ?>
Twig : {% for user in users %} {% endfor %}
6. Filtres
Caractères spéciaux HTML échappés :
PHPTemplate : <?php print check_plain($title); ?>
Twig[2] : {{ title }}
Valeurs non traitées :
PHPTemplate : <?php print $title; ?>
Twig : {{ title|raw }}
Traduire :
PHPTemplate : <? Php print t ('Accueil'); ?>
Twig : {{ 'Accueil' | t }}
Traduire avec substitutions :
PHPTemplate : <?php print t('Bienvenue, @username', array('@username' => $user->name)); ?>
Twig : {{ 'Bienvenue, @username'|t({ '@username': user.name }) }}
Drupal 8 Twig (avec l’extension trans tag) :
{% set username = user.name %} {% trans %} Bienvenue, {{ username }} {% endtrans %}
Concaténer une liste :
PHPTemplate : <? Php echo implode (',', $usernames); ?>
Twig : {{ usernames | join(', ') }}
Concaténer une liste avec balisage :
Twig : {{ usernames | safe_join(',') }}
L’exemple PHPTemplate nécessite que $usernames soit un tableau de chaînes. Il en est de même pour l’exemple Twig original où « usernames » est un tableau de chaînes. En revanche, l’exemple Drupal 8 Twig requiert un tableau d’objets rendus. C’est une différence fondamentale entre Drupal 8 Twig et le Twig original. Drupal 8 Twig « affiche » à la fois du texte simple et des tableaux rendus.
Un autre aspect de cet exemple est que les trois exemples devraient produire la même sortie, mais ce n’est pas le cas (par défaut). Prenez cet exemple :
{% set numbers = [{'#markup': 'Un'}, {'#markup':'Deux'}, {'#markup':'Trois'}] %} {{ numbers }}
On s’attendrait à ce que les éléments soient affichés séparés par une virgule. Mais la sortie est : UnDeuxTrois
7. Gestion des espaces
Twig offre un contrôle des espaces qui permet de supprimer les espaces utilisés pour structurer le fichier template.
<div class="body"> {{- block.content -}} </div>
Cela équivaut à :
<div class="body">{{ block.content }}</div>
Attention
- L’exemple d’élément de clé de hachage peut changer à l’avenir
- Dans le second exemple, nous montrons comment Twig prend en charge le nettoyage des données. Avant, c’était la responsabilité du template ou de la fonction de prétraitement. Ce dernier changement est très important pour ceux qui espèrent créer un thème PHPTemplate pour Drupal 8 – vous devez nettoyer vos propres données. ↩︎︎