Le moteur de template de Jelix
Par Laurentj le jeudi, mars 9 2006, 09:51 - Projets - Lien permanent
Ce commentaire gratifiant de Loic sur le moteur de template de Jelix me donne envie de vous en parler un petit peu 
Les avantages d'utilisation d'un système de template dans une application ne sont plus à démontrer. Les principaux arguments des détracteurs des moteurs de templates, sont principalement :
- Pourquoi utiliser un moteur de template, une nouvelle "machine à gaz", alors que finalement, PHP peut être considéré lui même comme un moteur de template.
- Cela nécessite d'apprendre un nouveau langage etc...
Ce en quoi ils n'ont pas tout à fait tord. On pourrait donc utiliser un système reposant uniquement sur des fichiers purement PHP, et ne pas avoir à utiliser ce monstre qu'est Smarty avec ces plus de 2000 lignes de codes à inclure à chaque fois dans ses pages web (4000 si on compte son compilateur de template).
Mais personnellement, il y a des choses qui me gênent dans les templates pures PHP.
- Un template php est consituté essentiellement d'instructions
<?php echo $blabla?>: c'est super lourdingue à écrire, mais aussi à lire. (Sans compter que ça donne du fil à retordre pour les développeurs d'éditeurs HTML wysiwyg, n'est-ce pas Daniel ?
) - Comme c'est du PHP, le développeur peut avoir la tentation d'y faire tout ce qu'il veut, en particulier des traitements métiers, des requêtes SQL etc, ce qui n'est absolument pas le but d'un template (cf le sacro saint découpage du code en couche, pour une meilleure maintenance et une évolution facilitée).
D'un autre coté, si on prend un moteur comme smarty, il est vrai qu'on a une nouvelle syntaxe à apprendre, qu'il est obligé d'embarquer un parser super lourd pour interpréter le contenu du template (bien qu'il se rattrape en gardant dans un cache une version PHP du template). Mais il a un système de plugin intéressant, des fonctionnalités intéressantes qui facilitent le travail et l'écriture des templates.
J'ai donc décidé pour le moteur de Jelix d'avoir le meilleur des deux mondes :
- les instructions, les echos ne sont pas dans un
<?php ...?>mais entre accolades, comme dans la notation smarty : ça fait des templates beaucoup plus léger à lire. - les instructions à l'interieur des accolades : c'est du PHP. Pas de nouveau langage à apprendre. Juste quelques éléments de syntaxe supplémentaires à savoir.
- Le moteur de template vérifie la syntaxe, avec le tokenizer PHP :
- il permet ainsi d'interdire les dérives que j'ai signalé : on ne peut pas tout utiliser de PHP. Seulement principalement les instructions de contrôle, de structure (if, foreach etc..)
- il permet d'utiliser une syntaxe un peu exotique pour certain cas, comme par exemple
{$foo}comme dans smarty, pour faire un echo de $foo, ou encore{@myModule~une.locale@}pour faire un echo d'une chaîne localisée (myModule~une.localeétant la clé de la chaîne ). Et bien sûr, on peut combiner tout ça, faire de la concaténation :{@modul~une.cle.$dynamique@."-".$uneAutreVariable}. - il permet une analyse beaucoup plus rapide que dans Smarty puisque c'est PHP lui même via le tokenizer qui se charge de parser les instructions !
Ce n'est pas tout, comme dans Smarty, on peut ajouter ses propres balises {foo} avec un système de plugin carrément analogue, utiliser des modificateurs (j'adore cette réutilisation du principe du pipe des shells unix) et les templates sont "compilés" sous forme de fichier pur PHP et mis en cache pour que le moteur évite d'avoir à faire l'analyse à chaque utilisation d'un même template. Le tout en moins de 450 lignes de code. Pour en savoir plus, lire la doc.
Le moteur de template de Jelix a quelque dépendance avec le framework (normal..). Et je n'ai pas le temps pour le moment d'en faire un moteur "standalone", même si c'est tout à fait envisageable. Par exemple : j'ai pu l'adapter facilement pour une version experimentale de Copix 2.3 et ça fonctionne à merveille. Un jour, si j'ai le temps, je ferais une release de cette adaptation... (quoique, j'hésite... eh eh, coucou l'équipe Copix !
).
Update : le moteur de template jTpl existe maintenant en version standalone.
Commentaires
Hello
Salut Laurent
Ca a l'air sympa. Je suis un grand fan de smarty, mais si je peux trouver un truc avec quasimment la meme syntaxe en plus léger
C'est dépendant du reste de Jelix?
Zut, j'ai oublié un truc. Dans smarty le systeme de compilation des templates et cache est super bien foutu: on peut faire des groupes de templates, assigner divers temps de vie pour un cache, controller tout ca via diverses fonctions, etc. Tu as ca dans jelix? Si oui je switche c'est sur
ça à l'air pas mal à utiliser, mais je pense que Jelix s'adressant à des développeurs experimentés, tu devrais proposer quelque chose de plus simple et surtout je pense de plus léger, par exemple comme Savant (en version non compilée), évitant ainsi une étape de plus en analyse.
Il y a aussi au moins une fonction PHP très utile dans un template: sprintf(), pour insérer des variables dans une chaine localisée
Concernant la lisibilité, il est clair que c'est mieux les accolades!
Et oui, du joli travail. Je l'ai bidouillé pour un usage perso très facilement.
Alors, pour les dépendances, il n'y a pas énormément de chose.
Pour la classe jTpl, il faut intégrer le mécanisme de verification d'obsolescence de cache, qui est pour le moment dans une classe externe jIncluder (car elle sert pour d'autres classes). Bref, deux, trois tests à ajouter.
Dans jTpl et la classe jTplCompiler, qui analyse le template et converti en fichier pur PHP :
@..@)Sinon Mat, non, il n'y a pas de gestion de cache de contenu final, car ça c'est fait dans une autre classe, jZone. jZone dans Jelix permet de gérer une "zone" d'une page, et on n'est pas obligé de s'appuyer sur un template dans une jZone. C'est pourquoi le système de cache de contenu est placé à ce niveau, et non plus bas dans jTpl.
Et pour l'instant, le cache de contenu dans jZone n'est pas basé sur du timeout. Par contre, comme dans Smarty, une zone peut avoir différents caches en fonction de paramètres ( un cache d'une zone de news selon un l'id d'une news par exemple). Et tu peux effacer tout les caches d'une zone ou seulement un cache precis (le cache de la news 5 par ex).
Cependant, dans l'hypothèse de faire un jTpl standalone, ce ne serait pas trés compliqué de migrer les quelques lignes de code de jZone dans jTpl, et d'améliorer les possibilités de gestion du cache de contenu. Je suis sûr qu'on resterait gagnant au niveau légerté face à Smarty.
marko,
Je n'ai pas fait Jelix pour être utilisé par des newbies en php (pareil pour Copix du reste), même si j'essaie de simplifier au maximum les choses, pour être accessible au plus grand nombre. Jelix ne fait pas que du simple MVC, il gère beaucoup de choses à coté (localisation, url automatique, modularisation etc...)
l'idée est de fournir un maximum d'outils (non obligatoires) pour une meilleure productivité. Alors oui, cela impose quelques contraintes (ça ne s'apprend pas du jour au lendemain), mais il est difficile d'avoir le beurre et l'argent du beurre. Avec beaucoup de framework qui semblent plus facile d'utilisation, on arrive vite à des limitations quand on développe une vraie application, bien complexe (pas un simple gestionnaire de news), comme on trouve souvent en entreprise.
Copix est né de ces difficultés rencontrés, répond à des problèmatiques réèlles, vécues. Jelix fait de même. (pour rappel, Jelix est à l'origine un fork de Copix, même si en beaucoup de point, ils ne se ressemblent plus du tout).
Maintenant, toute contribution est accueilli à bras ouvert,
en particulier toute idée qui permettrait de faciliter l'utilisation du framework (sans pour autant sacrifier les fonctionnalités offertes).
C'est justement utilisé par la classe jLocale sur laquelle s'appuie jTpl pour récupérer les chaînes localisées. Par contre, pour éviter une trop grand lourdeur dans la syntaxe, il ne faut plus utiliser la notation
{@..@}mais utiliser un plugin spécifique{jurl "la.cle",array(paramètres...)}