Twig
1.5.0 overview
Qu'est-ce-c'est ?
Moteur de template php
flexible
rapide
sécurisé
...
Flexible
Implémenter son propre Lexer et parser
- Lexer
- Analyse syntaxique (la forme)
- Parser
- Analyse semantique (le fond)
➡ Ajout de fonctions, filtres et/ou tags
Rapide
compilation en PHP
Sécurisé
Echappement automatique
Mode "Bac a sable" (sandbox)
Filtrage des tags, functions, filtres, méthodes et propriétés utilisables
...
-
Syntax concise
<?php echo htmlspecialchars(\$var, ENT_QUOTES, 'UTF-8') ?>
vs.
{{ var|escape }}
- Spécialisé templating
- message d'erreur compréhensible
- documenté, testé
La base
{# manipulation des variables #} {% set my_var = 'test' %} <p> {{ my_var }} </p> <hr /> <p> ....
minute papillon...
...on voit que dalle
Coloration Syntaxique
Cf. http://twig.sensiolabs.org/doc/templates.html#ides-integration
Dreamweaver
Cf. http://blog.servergrove.com/2011/03/03/editing-twig-templates-in-dreamweaver/
La base
{{ }}
affiche,
{% %}
évalue,
{# #}
commente
Gestion des espaces
Les filtres (filters)
Représentation variable|nom_du_filtre[(args)]
Filtres disponible
date
,
format
,
replace
,
url_encode
,
json_encode
,
convert_encoding
,
title
,
capitalize
,
nl2br
,
number_format
,
upper
,
lower
,
striptags
,
join
,
reverse
,
length
,
sort
,
default
,
keys
,
escape
,
raw
,
merge
Les fonctions (functions)
Représentation nom_de_la_fonction([args])
Fonctions disponible
range
,
cycle
,
constant
,
random
,
attribute
,
block
,
parent
,
dump
Structures de contrôle
variable "Loop"
loop.index
- Itération courante. (à partir de 1)
loop.index0
- Itération courante. (à partir de 0)
loop.revindex
- N° de l'itération à partir de la fin de la boucle (à partir de 1)
loop.revindex0
- N° de l'itération à partir de la fin de la boucle (à partir de 0)
loop.first
True
si première itérationloop.last
True
si dernière itérationloop.length
- Nombre d'itération de la boucle
loop.parent
- Contexte parent
Manger du DRY
Don't Repeat Yourself
- Inclusion de template
- Héritage
- Réutilisation horizontale : macro, block
Tag include
Le tag include
charge un template ayant accès au contexte courant
Héritage
Tag block
et extends
Macros
Macros
use
quand l'utiliser ? rarement
C'est l'heure du troll
In the edge
Twig pour les dev
- Fontionnement interne
- Twig extension
- Etendre Twig
Fontionnement interne - bootstrap
Twig utilise un objet central appellé "Environment".
Celui contient toute la configuration, ainsi que les extensions.
Pour instancier un Environment
, il faut au préalable instancier
un loader de template Twig_LoaderInterface
.
Les templates peuvent être sur disque, dans un tableau,
dans une string, mais aussi en base de donnée...
(Le dernier n'est pas natif)
Lors d'un rendu de template Twig, Twig va transformer la template twig en class
php. Pour être plus performant, Twig est capable de mettre en cache les templates !
Template - Render
Charger globalement une macro
Il est possible de charger une template pour tout un projet en l'ajoutant
dans l'environement comme une variable globale. Il sera alors possible d'appeler cette
template de n'importe où dans le project. C'est plus propre que d'importer
une template dans le "layout" global de l'application.
En utilisant cette technique pour un ou plusieurs fichiers de macro, on "importe" nos macros
dans toutes les templates.
Et maintenant, dans une template quelconque :
Les extensions
Il est possible d'ajouter de nouvelles fonctionnalitées à Twig grâce à des extensions.
De bases, tous les filtres, tests, functions, tags ... sont des extensions.
Quoi ? | Difficulté ? | Fréquence ? | Exemple ? |
---|---|---|---|
macro | facile | souvent | Génération HTML |
global | facile | souvent | Helper d'objet |
function | facile | souvent | Génération de contenu |
filter | facile | souvent | Transformation de valeur |
tag | dur | rare | DSL language construct |
test | facile | rare | Décission booléenne |
operator | facile | rare | Transformation de valeur |
Les filtres
Functions, Tests, Opérateurs
Même principe que pour les filtres.
Cependant, seule les functions peuvent être dynamiques.
Tag
C'est compliqué!!! C'est rare !!!
Il y a 3 étape pour ajouter un tag :
- Définir une
Token Parser
classe (va analyser la template) - Définir une
Node
classes (va convertir le code twig en code php) - Ajouter le tag
Tag : set (1/2)
{% set var = 'test' %} ... {{ var }}
On définit le Token Parser
Tag : set (2/2)
On définit le Node
On enregistre le tag
Péreniser son extension
Il existe une classe dont votre classe extension doit hériter : Twig_Extension
.
Elle possède plusieurs méthodes que vous pouvez/devez surcharger :
- getFilters
- getFunctions
- getGlobals
- getOperators
- getTests
- getTokenParsers
Toutes ces méthodes doivent retourner un tableau clé valeur.
Péreniser son extension : Exemple - rot13
Des Questions ?