Tutoriel Twig
Tutoriel Twig
Ce tutoriel a pour but de vous apprendre le moteur de templates Twig, qui est intégré dans
Symfony depuis la version 2, du framework PHP.
Commentez
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
I - À propos..................................................................................................................................................................3
II - Avantages de Twig.................................................................................................................................................3
III - Le langage Twig....................................................................................................................................................4
III-A - Affichage des données................................................................................................................................ 4
III-B - Concaténation.............................................................................................................................................. 5
III-C - Les variables................................................................................................................................................6
III-D - Condition IF : {% if … %} … {% endif %}................................................................................................... 7
III-E - La boucle FOR: {% for … %} {% endfor %}................................................................................................8
III-F - Commentaire: {# … #}................................................................................................................................. 9
III-G - Les filtres..................................................................................................................................................... 9
III-H - Les fonctions..............................................................................................................................................10
III-I - Les macros.................................................................................................................................................. 10
III-J - Named Arguments......................................................................................................................................11
III-K - Les tags ou actions....................................................................................................................................11
III-L - Include de template (Symfony).................................................................................................................. 11
III-M - Render controller (Symfony)..................................................................................................................... 12
III-N - Personnaliser les templates: héritage, block…......................................................................................... 12
III-O - Les liens (Symfony)................................................................................................................................... 14
III-P - L'inclusion de feuilles de style et de JavaScripts avec Twig (Symfony).................................................... 14
III-Q - Vérification de la syntaxe.......................................................................................................................... 14
III-R - Les formats de template (Symfony).......................................................................................................... 15
III-S - créer un filtre (Symfony)............................................................................................................................ 15
III-T - Math............................................................................................................................................................16
III-U - Coding Standards...................................................................................................................................... 16
IV - Remerciements................................................................................................................................................... 17
-2-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
I - À propos
Twig est un moteur de templates qui a été créé par SensioLabs, les créateurs de Symfony.
On le retrouve nativement dans les frameworks Symfony et Drupal8, mais il peut être installé sur la majorité des
frameworks ainsi que dans un environnement PHP.
Dans ce tutoriel pas de long discours explicatif. J'ai choisi de présenter un exemple Twig et son équivalent en PHP.
Parfois aucune explication, en lisant l'exemple du code, on comprend le fonctionnement.
Même si ce tutoriel est orienté Symfony, il peut être valable pour apprendre Twig de façon
générale.
II - Avantages de Twig
Mais aussi :
A.
Bien souvent, afficher une donnée brute ne suffit pas. On veut lui appliquer un traitement logique avant de l'afficher
(une conversion, un calcul…).
Twig permet de définir en dehors de la page web des filtres que l'on pourra appliquer à la donnée.
B.
Un block menu, un block recherche, un block contenu… le tout défini dans un template lui-même héritable.
C.
On a souvent besoin de boucles, de conditions… à la construction d'une page web et pour cela, on utilise PHP. Votre
page devient vite illisible, peu maintenable, sujette à de nombreuses erreurs.
Twig par son langage est moins invasif que PHP et se substitue à celui-ci.
TWIG PHP
{% for value in items if <?php foreach
[Link] %} ($items as $value):
<img src="{{ [Link] }}"/> if ($[Link]) {?>
{% endfor %} <img
src="<?php echo $[Link];?>"/>
<?php } endforeach;?>
D.
-3-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
La conversion Twig/PHP ne se fait qu'une seule fois au premier appel, ensuite il est mis en cache pour les autres
appels (et donc finalement, c'est aussi rapide qu'en PHP).
E.
Twig apporte de nouvelles fonctionnalités: les macros, les filtres, les blocks, l'héritage de templates…
F.
Avec Twig, plus de sécurité avec l'échappement des variables qui est activé par défaut.
TWIG coucou
<b>{{ 'coucou' }}</b>
TWIG <h1>coucou</h1>
{% set
data = '<h1>coucou</h1>' %}
{{ data }}
Pour la sécurité, l'échappement est activé par défaut. Les balises ne sont pas interprétées.
L'échappement convertit la donnée en code HTML avant l'affichage.
TWIG coucou
{% set
data = '<h1>coucou</h1>' %}
{{ data|raw }}
TWIG <h1>coucou</h1>
{% set
data = '<h1>coucou</h1>' %}
{{ data|e }}
TWIG PHP
{{ [Link] }} <?php
{{ [Link] }} echo $produit->getNom();
echo $produit-
>getCategorie()->getNom();
-4-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
PHP
?>
TWIG PHP
{{ produit["nom"] }} ou {{ <?php
[Link] }} echo $produit["nom"];
?>
TWIG PHP
{% set animal = 'oiseaux' %} <?php
{{ "il y a des #{animal} sur le toit" }} $animal = 'oiseaux';
echo sprintf('Il y a des %s sur le toit',
{{ 14752 / 22 = #{14752 / 22} }} $animal);
L'affichage de données avec suppression d'espace entre deux balises à gauche ou à droite ou les deux :
supprimer les espaces à gauche puis des deux côtés avec le caractère '-' :
III-B - Concaténation
TWIG PHP
{{ "Description du produit:" ~ <?php
[Link] }}
echo "Description du produit:"
.
$produit->getDescription();
?>
TWIG PHP
{% set texte = greeting ~ <?php
name|lower %}
{{ texte }} $texte = $greeting . strtolower($name);
echo $texte;
?>
TWIG PHP
{{ (greeting ~ name)|lower }} <?php
-5-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
TWIG
{% set pi = 3.14 %}
parameters,yml [Link]
parameters: twig:
webmaster: dark-vador globals:
webmaster:
%webmaster%
TWIG Résultat à l'affichage
{{ webmaster }} dark-vador
La variable globale webmaster sera accessible dans tous les templates Twig.
Cas particulier : une variable nommée avec un caractère spécial. ('-'…). L'attribut d'un objet ([Link]-produit) ou
la clé d'un tableau article['info-produit'] :
-6-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
à savoir :
TWIG
{{ attribute(object, method) }}
{{ attribute(object, method, arguments) }}
{{ attribute(array, item) }}
{{ attribute(object, method) is defined? 'Method exists': 'Method does not exist' }}
[Link]
and, or, not, is defined, starts with, ends with, matches, in, empty
TWIG
{% if produits is empty %}
il n'y a plus de produit
{% endif %}
- regular expressions:
{% if phone matches '/^[\\d\\.]+$/' %}
format telephone ok
{% endif %}
{% if 5 not in [1, 2, 3] %}
5 non présent
{% endif %}
mais aussi :
TWIG
{{ article is null? 'yes': 'no' }} // affiche yes ou no
[Link]
-7-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
TWIG
- affiche 0123456789
{% for i in 0..9 %} // pareil que {% for i in range(0, 9) %}
{{ i }}
{% endfor %}
- clés et valeurs:
{% for key, value in table %}
{{ key }} {{ value }}
{% endfor %}
- bascule:
{% for i in 0..10 %}
<div class="{{ cycle(['fond-noir', 'fond-blanc'], i) }}"> // fond-noir / fond-
blanc / …
</div>
{% endfor %}
TWIG
{{ [Link] }} // Numéro de l'itération courante en commençant par 1
{{ loop.index0 }} // Numéro de l'itération courante en commençant par 0
{{ [Link] }} // Nombre itérations restantes avant la fin en commençant par
1
{{ loop.revindex0 }} // Nombre itérations restantes avant la fin en commençant par
0
{{ [Link] }} // La première itération? True ou false
{{ [Link] }} // La dernière itération? True ou false
{{ [Link] }} // Nombre total d'itérations
TWIG
{% for produit in produits %}
<span class="{% if [Link] is even %}fond-noir{% else %}fond-blanc{% endif %}">
{{ produit }}
</span>
{% endfor %}
-8-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
III-F - Commentaire: {# … #}
TWIG
{# mon commentaire #}
On peut appliquer des filtres sur une variable à afficher, sur une variable d'une condition IF ou d'une boucle FOR…
Le filtre length
TWIG PHP
{% for <?php
i in 0..produits|length %} for
($i=0; $i<count($produits); $i++) {
{% endfor %}
}
?>
TWIG PHP
{{ "les fleurs du mal"|trim|upper }} <?php
echo
strtoupper(trim("les fleurs du mal"));
?>
TWIG
{% filter upper %}
à savoir:
[Link]
TWIG
abs, batch, capitalize, convert_encoding, date, date_modify, default, escape, first, format,
join, json_encode, keys, last, length, lower, merge,
nl2br, number_format, raw, replace, reverse, round, slice, sort, split, striptags, title, trim,
upper, url_encode
-9-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
Une fonction effectue un traitement (contrairement à un filtre qui est destiné à faire une conversion) :
TWIG
- la fonction dump: affiche tout le détail d'un objet ou d'un tableau
{{ dump(produit) }}
TWIG
attribute, block, constant, cycle, date, dump, include, max, min, parent, random, range, source,
template_from_string
[Link]
Les macros sont comme des fonctions, mais composées de fragments HTML réutilisables.
Dans un template, on regroupe toutes les macros que l'on pourra importer dans un autre template afin d'être utilisées.
Prenons pour exemple un template [Link] qui va contenir plusieurs macros. Une macro pour la balise input
et une qui affiche une liste d'article.
[Link]
{% macro input(name, value, type, size) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{
size|default(20) }}" />
{% endmacro %}
Son utilisation : soit on importe toutes les macros, soit on choisit celle que l'on veut importer :
<p>{{ <p>{{
[Link]('livre', 'saint-exupery') }}</p>
input_field('livre', 'saint-exupery') }}</p>
- 10 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
Une macro dans la page même de son utilisation, pour cela on utilise _self. Mais on perd sa
réutisabilité.
Donner des noms aux arguments pour une meilleure compréhension et de pouvoir cibler un argument.
Des exemples :
TWIG
- au lieu de ... range(1, 10, 2) :
{% for i in range(low=1, high=10, step=2) %}
{{ i }},
{% endfor %}
- l'argument ciblé est timezone parmi les autres arguments (format, date...)
{{ "now" | date(timezone="Europe/Paris") }} //
{{ data|convert_encoding(from='iso-2022-jp', to='UTF-8') }}
{% … %} Les commandes de base Twig pour faire des actions comme: for, if, set…
TWIG
autoescape, block, do, embed, extends, filter, flush, for, from, if, import, include, macro,
sandbox, set, spaceless, use, verbatim
[Link]
[Link]
<ul>
{% for item in items %}
{% include
"AcmeDemoBundle:dossier:render_item.[Link]" with {'item':
item} only %}
{% endfor %}
</ul>
Mais aussi :
- 11 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
TWIG
- Un include avec une condition:
{% include isValid ? '[Link]' : '[Link],twig' %}
- Si la page de l'include n'existe pas, alors il n'y aura pas d'erreur. Rien ne se passe.
{% include "[Link]" ignore missing %}
Faire appel à une action du contrôleur qui renvoie un rendu qui va être inclus.
TWIG
{{ render(controller('AcmeDemoBundle:Article:recentArticles', { 'max': 3 })) }}
Pour personnaliser les templates, Twig propose un système de blocks et d'héritage de templates.
[Link]
<html>
<head>...</head>
<body>
<div class="head"> {% block header %} header {% endblock %} </div>
<div class="sidebar"> {% block recherche %}{% endblock %} </div>
<div class="content"> {% block contenu %}{% endblock %} </div>
<div class="footer"> {% block footer %} footer {% endblock %} </div>
</body>
</html>
[Link] [Link]
{% extends "::[Link]" %} {% extends "::[Link]" %}
* Toutes les pages web 'client' * Toutes les pages web 'produit'
{% extends "AcmeDemoBundle::[Link]"
{% extends
%} "AcmeDemoBundle::[Link]" %}
- 12 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
Les avantages :
• finalement, pour créer une page web "client" ou "produit", on hérite de son layout et on ajoute son propre
contenu et… c'est tout ;
• si vous voulez modifier le header (de toutes les pages), il suffit de ne le modifier qu'à un seul endroit c'est-à-
dire dans la base.
Le fait de ne pas
mentionner un block
parent a pour résultat
que le contenu est
tout de même inclus
automatiquement par
héritage.
Identique TWIG header
recherche client
contenu client
{% extends "AcmeDemoBundle::[Link]" %}
footer
{% block header %} {{
parent() }} {% endblock %}
{% block
recherche %} {{
parent() }} {% endblock%}
{% block
contenu %} contenu
client {% endblock %}
{% block footer %} {{
parent() }} {% endblock %}
{% block
recherche %}{% endblock%}
{% block
contenu %} contenu
client {% endblock %}
Le fait de mentionner
un block et qu'il soit
vide a pour résultat que
- 13 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
{{parent() }} <br/>
un texte en
dessous
{% endblock%}
{% block
contenu %} contenu
client {% endblock %}
Pour information, dans cette partie "personnalisation, héritage…" seule la façon d'écrire
l'extends est liée à Symfony: {% extends "AcmeDemoBundle::[Link]" %}.
TWIG
- vers fichiers assets :
<img src="{{ asset('images/[Link]') }}" />
- Vers url / :
<a href="{{ path('_welcome') }}">Home</a>
[Link]
Avec les commandes Symfony, on peut vérifier la syntaxe Twig à plusieurs niveaux: template, dossier, bundle.
- Par template :
php app/console twig:lint src/Acme/ArticleBundle/Resources/views/Article/[Link]
- Par dossier :
php app/console twig:lint src/Acme/ArticleBundle/Resources/views
- 14 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
- Par bundle :
php app/console twig:lint @AcmeArticleBundle
Les formats de template permettent de rendre en HTML, mais aussi en XML ou PDF.
[Link]
src/AppBundle/Twig/[Link]
// src/AppBundle/Twig/[Link]
namespace AppBundle\Twig;
public function
priceFilter($number, $decimals = 0, $decPoint = '.', $thousandsSep = ',')
{
$price = number_format($number, $decimals, $decPoint, $thousandsSep);
$price = '$'.$price;
return $price;
}
[Link]
app.twig_extension:
class: AppBundle\Twig\AppExtension
tags:
- { name: [Link] }
TWIG $5500,25
{{ '5500'|price }}
- 15 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
III-T - Math
TWIG
+ - * / : les bases
** : puissance
{{ 2 ** 3 }} retourne 8
Toujours un et un seul espace entre les balises, les données… (sauf pour les filtres) :
TWIG
{{ foo }}
{# comment #}
{% if foo %}{% endif %}
{{ 1 + 2 }}
{{ foo ~ bar }}
{{ true ? true : false }}
TWIG
{{ [1, 2, 3] }}
{{ {'foo': 'bar'} }}
TWIG
{{ 1 + (2 * 3) }}
TWIG
{{ foo|upper|lower }}
TWIG
{% block foo %}
{% if true %}
true
{% endif %}
{% endblock %}
- 16 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]
Apprendre à exploiter le moteur de templates Twig dans Symfony par iner dukoid
IV - Remerciements
Je tiens à remercier Francis Walter pour sa relecture technique, Claude Leloup pour sa relecture orthographique
et Guillaume SIGUI pour son encadrement.
- 17 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par
les droits d'auteur. Copyright ® 2016 iner dukoid. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.
[Link]