Les moteurs de templates Les principaux moteurs de templates php raintpl smarty twig mustache savant3 talus'tpl...
2/15 Avantages : Utilité des moteurs de templates Séparer le traitement de l'affichage Permettre aux designers de développer rapidement des gabarits sans spécialement connaître le langage utilisé Minimiser le code et le rendre plus clair Inconvénients Un peu plus lent à exécuter (cache obligatoire) Casse la structure xhtml...
3/15 Cas pratique : TWIG (http://twig.sensiolabs.org) initialisation de la librairie (après téléchargment de l'archive) <?php?> require_once("twig/lib/twig/autoloader.php"); Twig_Autoloader::register(); $loader = new Twig_Loader_Filesystem("templates"); $twig = new Twig_Environment($loader, array("cache" => false)); D'autres options disponibles : http://twig.sensiolabs.org /doc/api.html#environment-options
4/15 Twig : démonstration Créez un nouveau fichier templates/demo.html : Démonstration de l'utilisation de {{ moteur_templates }}. Ajouter sous l'initialisation de Twig : echo $twig->render("demo.html", array("moteur_templates" => "Twig")); Résultat : Démonstration de l'utilisation de Twig.
5/15 Twig : les filtres Twig inclut par défaut quelques filtres, vous permettant de modifier un peu l'affichage de vos valeurs : {{ ma_variable le_filtre }} Ou {% filter le_filtre %} Mon texte... {{ ma_variable }} {% endfilter %} D'autres : capitalize date length upper/lower/trim/nl2br http://twig.sensiolabs.org/doc/filters/index.html
6/15 Les conditions dans Twig {% if nb_articles >= 2 %} Il y a {{ nb_articles }} articles sur le blog. {% elseif nb_articles == 1 %} Il n'y a pour l'instant qu'un seul article sur le blog. {% else %} Il n'y a encore aucun article sur ce blog. Reviens plus tard. {% endif %} {% if pseudo is defined %} Vous êtes connecté. {% endif %} {% if pseudo is defined and pseudo is not empty%} Bonjour {{ pseudo }}. {% endif %}
Twig : les tableaux Côté PHP : <?php echo $twig->render("articles.html", array( "articles" => array( array( "titre" => "Titre 1", "url" => "titre-1", "img" => "http://abc.fr/image1.jpg", "tags" => array("tag 1", "Tag 2", "Tag 3") ), array( "titre" => "Titre 2", "url" => "titre-2", "img" => "http://abc.fr/image2.jpg", "tags" => array("tag 4", "Tag 5") ), array( "titre" => "Titre 3", "url" => "titre-3", "img" => "http://abc.fr/image3.jpg", "tags" => array("tag 6", "Tag 7", "Tag 8") ) ) ));?> 7/15
8/15 Twig : les tableaux Côté Twig : {% if articles length > 0 %} {% for each in articles %} <article class="article"> <div class="icone"> <img src="{{ each.img }}" alt="{{ each.img }}"> </div> <div class="content"> <header> <h2><a href="{{ each.url }}">{{ each.titre }}</a></h2> </header> <p> {% for tag in each.tags %} <strong>{{ tag }}</strong> {% endfor %} </p> </div> </article> {% endfor %} {% else %} <b>aucun article pour l'instant.</b> {% endif %}
9/15 Twig : les includes Possibilité d'inclure des templates dans des templates : {% include "menu.html" %}
10/15 Twig : héritage <!DOCTYPE html> <html> <head> {% block head %} <link rel="stylesheet" href="style.css"> <title>{% block title %}{% endblock %} - My Webpage</title> {% endblock %} </head> <body> <div id="content">{% block content %}{% endblock %}</div> <div id="footer"> {% block footer %} Copyright 2011 by <a href="http://domain.invalid/">you</a>. {% endblock %} </div> </body> </html>
11/15 Twig : héritage {% extends "base.html" %} {% block title %}Index{% endblock %} {% block head %} {{ parent() }} <style type="text/css">.important { color: #336699; } </style> {% endblock %} {% block content %} <h1>index</h1> <p class="important"> Welcome to my awesome homepage. </p> {% endblock %}
12/15 Dans un fichier forms.html : Twig : les macros {% macro input(name, value, type, size) %} <input name="{{ name }}" <br="" type="{{ type default('text') }}"> value="{{ value e }}" size="{{ size default(20) }}" /> {% endmacro %} Importation des macros dans un template : {% import "forms.html" as forms %} <p>{{ forms.input('username') }}</p> Une macro en particulier : {% from 'forms.html' import input as input_field %} <dl> <dt>username</dt> <dd>{{ input_field('username') }}</dd> <dt>password</dt> <dd>{{ input_field('password', '', 'password') }}</dd> </dl>
13/15 Twig : les expressions Possibilité d'utiliser des expressions un peu partout : {% set greeting = 'Hello' %} {% set name = 'Fabien' %} {{ greeting ~ name lower }} {# Hello fabien #} {# use parenthesis to change precedence #} {{ (greeting ~ name) lower }} {# hello fabien #} Mais aussi : des opérateurs mathématiques des opérateurs logiques des opérateurs de contenu... http://twig.sensiolabs.org/pdf/twig.pdf
14/15 Comparaisons boucles Résumé (boucles) Test tot. tempstot. mémoiretaille libr. php 5.4.4-14+deb7u52086 μs 40.63 KB 4 KB raintpl 2.7.0 5110 μs 345.8 KB 37 KB twig 1.5.1 19097 μs 844.88 KB 647 KB smarty 3.1.11 20112 μs 1.51 MB 1100 KB
15/15 Comparaisons affectations Résumé (affectation) Test tot. tempstot. mémoiretaille libr. php 5.4.4-14+deb7u52001 μs 12.16 KB 4 KB raintpl 2.7.0 5113 μs 321.86 KB 37 KB twig 1.5.1 17671 μs 844.86 KB 647 KB smarty 3.1.11 20411 μs 1.52 MB 1100 KB