<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.hyla-project.org/index.php/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Hyla project - Tag - modèle</title>
  <link>http://blog.hyla-project.org/index.php/</link>
  <atom:link href="http://blog.hyla-project.org/index.php/feed/tag/mod%C3%A8le/rss2" rel="self" type="application/rss+xml"/>
  <description>Blog du projet Hyla</description>
  <language>fr</language>
  <pubDate>Fri, 08 Jul 2011 07:17:07 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Hyla_Tpl : Un nouveau moteur de template, successeur de celui de la phpLib</title>
    <link>http://blog.hyla-project.org/index.php/post/2009/10/23/Un-nouveau-moteur-de-template%2C-successeur-de-celui-de-la-phpLib-pour-Hyla</link>
    <guid isPermaLink="false">urn:md5:51b950b770b99d256361838fa3633c81</guid>
    <pubDate>Fri, 23 Oct 2009 14:16:00 +0200</pubDate>
    <dc:creator>hugo</dc:creator>
        <category>Outils</category>
        <category>gabarit</category><category>gpl</category><category>hyla</category><category>Hyla_Tpl</category><category>libre</category><category>modèle</category><category>php</category><category>phplib</category><category>Planet-Libre</category><category>template</category><category>tpl</category>    
    <description>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;
Pour les besoins de la nouvelle version du gestionnaire de fichiers en ligne &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.hyla-project.org/&quot;&gt;Hyla&lt;/a&gt;, j'ai cherché des solutions pour remplacer le veillissant moteur de &lt;a hreflang=&quot;fr&quot; href=&quot;http://fr.wikipedia.org/wiki/Template&quot;&gt;template&lt;/a&gt; (de gabarit ou de modèle en bon français) de la &lt;a hreflang=&quot;en&quot; href=&quot;http://sourceforge.net/projects/phplib/&quot;&gt;PhpLib&lt;/a&gt; qui lui à rendu, tout de même, de bons services et ce, depuis les toutes premières version de &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.hyla-project.org/&quot;&gt;Hyla&lt;/a&gt;...
&lt;/p&gt;
&lt;p&gt;Le moteur de la PhpLib dispose de nombreux avantages, simplicité des modèles : pas de code (foreach,
if, etc...) respectant ainsi la logique qui veut que les graphistes ne
touchent pas une brindille de code, les blocs sont en fait des
commentaires, ils apparaissent donc cachés aux graphistes travaillant sur le modèle.&lt;/p&gt;
&lt;p&gt;Mais ce moteur de template souffre de 2 grosses lacunes : &lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Sa complexité de mise en oeuvre du côté php, on arrive très vite à du code relativement lourd : il est très verbeux.&lt;/li&gt;
&lt;li&gt;Plus aucun support depuis bien longtemps, il lui manque donc des fonctionnalités qui sont, pourtant,  devenues courantes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Mais pourquoi réécrire un nouveau moteur de modèle alors qu'il en existe beaucoup qui fonctionnent parfaitement bien ?
&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Je souhaite garder un maximum de compatibilité avec les modèles existants déjà dans &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.hyla-project.org/&quot;&gt;Hyla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Aucun des moteurs de gabarits que j'ai vu ne me convient, en général, ils sont beaucoup trop lourd pour ce qu'Hyla en fera.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
En gros, garder la simplicité de la vue avec quelques nouveautés et améliorer le contrôleur.&lt;/p&gt;    &lt;h2&gt;Les modèles&lt;/h2&gt;
&lt;h3&gt;Nouveautés pour les variables&lt;/h3&gt;
&lt;p&gt;Pour le moteur de modèle de la phpLib, tout ce qui est entre 2 accolades (avec des caractères valides) est une variable, ainsi, {TOTO} et {ma_variable} sont des variables, Hyla apporte une petite différence, ainsi, est considéré comme variable tout ce qui est entre accolades et commence par un caractère dollar $ : « {$toto} » et « {$ma_variable} » sont des variables mais ce n'est pas tout, Hyla apporte 5 nouveaux concepts au sujet des variables :
&lt;/p&gt;
&lt;h4&gt;1. Tableaux et objets dans les variables&lt;/h4&gt;
&lt;p&gt;
Il est possible de spécifier des tableaux ou des objets aux variables depuis le code php à l'aide de la fonction setVar, on y accède dans le gabarit de la manière suivante :&amp;nbsp; « {$user.name} », on accède au contenu des tableaux et des objets de la même manière (avec le point : .) cachant ainsi l'implémentation à la vue.
&lt;/p&gt;
&lt;p&gt;&lt;ins&gt;Exemple :&lt;/ins&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Code php :&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;$user = array('name' =&amp;gt; 'leonardo', 'age' =&amp;gt; 67);&lt;br /&gt;$tpl-&amp;gt;setVar('user', $user);&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Dans le gabarit :&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&amp;lt;strong&amp;gt;{$user.name}&amp;lt;/strong&amp;gt;&lt;br /&gt;&amp;lt;em&amp;gt;{$user.age}&amp;lt;/em&amp;gt;&lt;/pre&gt;
&lt;h4&gt;2. Les fonctions appliquées aux variables&lt;/h4&gt;
&lt;p&gt;
Avant affichage de la variable dans le modèle, il est possible
d'envoyer son contenu dans des fonctions.&lt;/p&gt;
&lt;p&gt;&lt;ins&gt;Exemple :&lt;/ins&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Dans le gabarit :&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&amp;lt;strong&amp;gt;{$user.name|toupper}&amp;lt;/strong&amp;gt;&lt;/pre&gt;&lt;p&gt;Dans l'exemple ci-dessous, le contenu de la variable sera envoyé à la fonction toupper qui se chargera de mettre tous les caractères en majuscules.&lt;/p&gt;
&lt;h4&gt;3. Les fonctions simples&lt;/h4&gt;
&lt;p&gt;
Un autre type de variable permet d'appeler une
fonction directement, son utilisation est simple :
« {!NOM_DE_LA_FONCTION:PARAMETRE} », exemple : « {!include:fichier.tpl} »
inclura le fichier nommé fichier.tpl à la place du bloc lui même,
voilà, c'est aussi simple que cela...&lt;/p&gt;
&lt;h4&gt;4. La traduction&lt;/h4&gt;
&lt;p&gt;
Les variables à traduire sous la forme « {_i speak english} » (commençant
par un _). Hyla récuperera le contenu de la variable (« i speak english
») et l'enverra à une fonction définie afin de procéder à une
traduction : « {_i speak english} » sera ainsi remplacée par « je parle
français » , il est même possible de cumuler la traduction et les
fonctions, ainsi, l'exemple suivant « {_i speak english|trim|toupper} »
retournera « JE PARLE FRANÇAIS »&lt;/p&gt;
&lt;h4&gt;5. Les commentaires&lt;/h4&gt;
&lt;p&gt;Il est possible de placer des commentaires dans les gabarits cette manière : « {#Voici un commentaire très intéressant !} ».&lt;/p&gt;
&lt;p&gt;Pourquoi ce nommage ? J'ai essayé de rester logique, le « $ » utilisé pour les variables dans bash ou encore php, le « _ » fait référence à la fonction gettext permettant la localisation d'applications, le « ! » qui ordonne l'exécution d'une fonction et enfin le « # » utilisé dans beaucoup de langage pour indiquer que la ligne courante est un commentaire.&lt;/p&gt;
&lt;h3&gt;Nouveautés pour les blocs&lt;/h3&gt;
&lt;p&gt;Concernant les blocs, une grosse nouveauté fait son apparition : le bloc ELSE qui sera affiché uniquement si le bloc du même nom ne s'affiche pas.&lt;br /&gt;Le gros avantage d'utiliser les blocs ELSE est que vous gagnez en lisibilité dans le code car justement, il y a moins de code...&lt;/p&gt;
&lt;p&gt;
Le reste étant compatible avec les anciens modèles de la phpLib, un exemple vaut mieux que ...blablabla, voici :&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&amp;lt;table&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;Name&amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;!-- BEGIN line --&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;{$user|ucfirst}&amp;gt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;!-- ELSE line --&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td&amp;gt;{_No data !}&amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;!-- END line --&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;{!include:toto.tpl}&lt;/pre&gt;
&lt;p&gt;
Comme vous le voyez, le principe des blocs est le même :
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Le bloc line possède un bloc &lt;strong&gt;ELSE&lt;/strong&gt; : si line n'est pas appelé, le contenu du bloc else sera alors affiché&lt;/li&gt;
&lt;li&gt;Le contenu de la variable $user sera remplacée par le retour à l'appel de la fonction ucfirst (il est possible de mettre autant de fonction que l'on veut, ex: « {$user|strtolower|ucfirst|escape}) »&lt;/li&gt;
&lt;li&gt;« {_No data !} » sera remplacé par « Pas de données ! »&lt;/li&gt;
&lt;li&gt;Le contenu du fichier toto.tpl sera ajouté à la fin du modèle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Bien entendu, il est possible d'imbriquer une multitudes de blocs les uns dans les autres... &lt;/p&gt;
&lt;p&gt;Il est possible de travailler simultanémnent avec plusieurs fichiers de gabarits, de plusieurs manières :&lt;br /&gt;&lt;br /&gt;- Un appel à setCurrentFile permet de spécifier le fichier gabarit courant, notez que le dernier fichier déclaré grâce à la méthode importFile est désigné fichier courant&lt;br /&gt;- Utilisez la syntaxe suivante : « identifiant_du_fichier:nom_du_bloc » dans l'appel à la méthode render&lt;/p&gt;
&lt;h2&gt;Côté php&lt;/h2&gt;
&lt;p&gt;
Et voici ce que cela donne du côté du code php :
&lt;/p&gt;
&lt;pre&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;require 'tpl.class.php';&lt;br /&gt;&lt;br /&gt;$t = new Tpl();&lt;br /&gt;$t-&amp;gt;importFile('tata.tpl');&lt;br /&gt;&lt;br /&gt;$data = array('pif', 'paf', 'pouf');&lt;br /&gt;&lt;br /&gt;foreach ($data as $name) {&lt;br /&gt;  $t-&amp;gt;setVar('user', $name);&lt;br /&gt;  $t-&amp;gt;render('line');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;echo $t-&amp;gt;render();&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;/pre&gt;
&lt;p&gt;Vous remarquerez qu'il n'est pas utile de déclarer à l'avance les blocs et c'est une très bonne chose, on gagne entre autre en simplicité !&lt;/p&gt;
&lt;h2&gt;Et les performances ?&lt;/h2&gt;
&lt;p&gt;C'est bien gentil de rajouter toutes ces fonctionnalités mais si c'est pour que ce soit plus lent que l'original, c'est pas terrible...&lt;br /&gt;Ce nouveau moteur est &lt;strong&gt;plus de &lt;ins&gt;10 fois plus rapide&lt;/ins&gt; que celui de la phpLib&lt;/strong&gt; (ce dernier étant considéré comme le plus rapide des moteurs « non compilés »)  et &lt;strong&gt;jusqu'à &lt;ins&gt;20 fois plus rapide&lt;/ins&gt;&lt;/strong&gt; en utilisant les spécificités du nouveau moteur (notamment les fonctions).&lt;br /&gt;Le pic d'occupation mémoire est moindre à rendu final identique.&lt;/p&gt;
&lt;p&gt;Vous êtes donc gagnant sur toute la ligne en utilisant ce nouveau moteur de modèle si vous utilisez celui de la PhpLib.&lt;/p&gt;
&lt;h2&gt;API&lt;/h2&gt;
&lt;p&gt;Le constructeur n'attends qu'un paramètre qui est le dossier oû sont stockés les gabarits, par défaut, c'est le dossier courant.&lt;/p&gt;
&lt;p&gt;Voici les méthodes publiques, classées par catégories avec la liste des arguments qu'elles contiennent.&lt;/p&gt;
&lt;h3&gt;Gestion des fichiers&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;&lt;em&gt;importFile&lt;/em&gt; : Importe un fichier de modèles&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Id du fichier&lt;/li&gt;
&lt;li&gt;Nom du fichier&lt;/li&gt;
&lt;li&gt;Le chemin du fichier si il n'est pas inclu dans le chemin défini dans le constructeur&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;setCurrentFile&lt;/em&gt; : Si vous travaillez avec plusieurs modèles, il peut être utile de spécifier celui courant&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Le nouveau fichier courant&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Gestion des variables&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;&lt;em&gt;setVar&lt;/em&gt; : Déclare le contenu d'une variable&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Le nom de la variable&lt;/li&gt;
&lt;li&gt;La valeur de la variable&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;setVars&lt;/em&gt; : Déclare le contenu de plusieurs variables à l'aide d'un tableau&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Tableau de variable sous la forme : array('var1' =&amp;gt; 'value1', 'var2' =&amp;gt; 'value2')&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;removeUnknowVar&lt;/em&gt; : Spécifie si vous désirez voir les variables sans valeur du modèles s'afficher ou non&lt;br /&gt;&lt;ol&gt;&lt;li&gt;true ou false&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Gestion des blocs&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;&lt;em&gt;render&lt;/em&gt; : Procède au rendu d'un bloc et retourne ce dernier&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Le nom du bloc voulu&lt;/li&gt;
&lt;li&gt;Tableau de variable (attention, paramètre peut être amené à disparaitre dans les futures version)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Gestion des fonctions&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;&lt;em&gt;registerFunction&lt;/em&gt; : Ajoute une fonction utilisateur&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Le nom de la fonction qui sera utilisé dans le modèle&lt;/li&gt;
&lt;li&gt;Le nom de la fonction&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;getFunctionList&lt;/em&gt; : Renvoie la liste des fontions&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Si true, renvoie également la liste des fonctions utilisateurs (créées avec registerFunction)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Divers&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;&lt;em&gt;setL10nCallback&lt;/em&gt; : Spécifie la fonction à appeler à chaque fois que le moteur trouve une variable du type {_XXX}&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Spécifie la fonction de callback pour la traduction&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Téléchargement&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Le code source est bien sûr libre et est sous license GPL.&lt;/p&gt;
&lt;p&gt;Pour le téléchargement, téléchargez l'annexe de ce billet, il inclu la classe Hyla_Tpl, une version autonome (standalone si vous préférez, c'est à dire indépendante de Hyla, le gestionnaire de fichiers) ainsi qu'un fichier php et ces gabarits d'exemples.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attention, cliquez sur le lien suivant pour télécharger la toute &lt;/strong&gt;&lt;a style=&quot;font-weight: bold;&quot; href=&quot;http://blog.hyla-project.org/public/src/hyla_tpl-latest.zip&quot;&gt;dernière version de Hyla_Tpl&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;</description>
    
          <enclosure url="http://blog.hyla-project.org/public/src/hyla_tpl-0.4.zip"
      length="13583" type="application/zip" />
    
    
      </item>
    
</channel>
</rss>
