Twig

1.5.0 overview

twig.sensiolabs.org

github.com/fabpot/Twig

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

Mon super titre   

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ération
loop.last
True si dernière itération
loop.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

CHANGELOG

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 ?