<?xml version="1.0" encoding="iso-8859-1"?>
<document>
   <titre>L’utilisation des modèles HTML (Template)</titre>
   <contenu>
      <h2>Les modèles HTML (Template)</h2>
       
      <p class="abstract">
         L’HTML est un langage de structuration de l’information et non un langage
         de programmation comme le PHP. 
         L’idée des modèles HTML (<a href="http://fr.wikipedia.org/wiki/Template">Template</a>, Gabarits, Canevas)
         est de séparer ces deux parties afin de bénéficier de tout les avantages d’un découplage fort. Le but de cet article est d’illustrer
         comment fonctionne un système de Gabarit simple.
      </p>

      <p><a href="/articles/TempLight/">Il existe maintenant une nouvelle classe plus puissante</a>.</p>

      <h3>Quand les utiliser ?</h3>
 
      <p>Alors que les feuilles de styles (CSS) permettent de séparer la structure du 
      document et la présentation de ce même document. Les canevas permettent de séparer clairement la
      logique de programmation de la structure HTML.</p>

      <p>Les canevas HTML servent à éviter le mélange sauvage de code HTML et de code applicatif. L’utilisation
      appropriée des gabarits dans votre application garanti un découplage total entre HTML et le langage de programmation.</p>
      
      <h3>Avantages</h3>
      
      <p>Cette façon de procéder permet d’acheminer son application vers 
      <a href="http://fr.wikipedia.org/wiki/MVC">le modèle de type "Modèle, Vue, Contrôle"</a>. Il convient particulierement bien
       aux applications Web car la couche de présentation (Vue) se fait dans un langage différent de celui 
       dévoué à la programmation (Contrôle et Modèle).</p>
      
      <h4>Robustesse</h4>

      <p>La modification de la présentation ne touche pas l’application, et inversement.
      Comme on peut se concentrer sur une plus petite partie du problème, on évite des erreurs.</p>

      <h4>Flexibilité</h4>

      <p>Le graphiste et le programmeur peuvent travailler ensemble sur l’application de manière non concurrente.</p>

      <h4>Clareté &amp; réutilisabilité</h4>

      <p>La séparation fonctionnelle des langages facilite les modifications ultérieurs.</p>

      <h3>Utilisation</h3>

      <p>Durant la réalisation d’un projet il est apparu différents besoins que j’ai pu couvrir avec quatres fonctions primitives.</p>
      
      <ul>
         <li><a href="#simple">Remplacements simples</a> ;</li>
         <li><a href="#iteratif">Remplacements par boucles</a> ;</li>
         <li><a href="#condition">Les conditions</a> ;</li>
         <li><a href="#recursif">Remplacements récursifs</a>.</li>
      </ul>
      
      <h4 id="simple">Remplacements simples</h4>
      
      <p>Imaginez que votre fichier de template se nomme standard.template.html et qu’il contienne
      cette ligne :</p>
<pre>
...
&lt;title&gt;<span class="comment">&lt;!--%titrePage%---&gt;</span>&lt;/title&gt;
...
</pre>
      <p>Aillant programmé le système de template en <a href="http://fr.wikipedia.org/wiki/PHP">PHP</a> le code associé serait :</p>
<pre>
<span class="comment">// construction de l’objet Template</span>
$standardTemplate = new Template('standard.template.html');
<span class="comment">// remplacement</span>
$standardTemplate->replace('titrePage','ma belle page');
<span class="comment">// affichage</span>
echo $standardTemplate->toString();
</pre>
      <p>Ce qui donnerait ceci :</p>
<pre>
...
&lt;title&gt;ma belle page&lt;/title&gt;
...
</pre>

      <h4 id="iteratif">Remplacements par boucle</h4>
      
      <p>Imaginez que votre fichier contienne :</p>
<pre>
...
&lt;select&gt;
<span class="comment">&lt;!--%loop:options%--&gt;</span>
    &lt;option value="<span class="comment">&lt;!--%valeur%--&gt;</span>"&gt;<span class="comment">&lt;!--%texte%--&gt;</span>&lt;/option&gt;
<span class="comment">&lt;!--%endLoop:options%--&gt;</span>
&lt;/select&gt;
...
</pre>
      <p>Le code associé serait :</p>
<pre>
<span class="comment">// construction de l’objet Template</span>
$standardTemplate = new Template('standard.template.html');
<span class="comment">// construction du tableau de valeurs</span>
$optionsArray = array( array('valeur'=&gt;1,'texte'=&gt;'hello'), 
   array('valeur'=&gt;2,'texte'=&gt;'world') );
 <span class="comment">// remplacement par boucle</span>
$standardTemplate-&gt;iterateReplace('options',$optionsArray );
<span class="comment">// affichage</span>
echo $standardTemplate->toString();
</pre>
      <p>Ce qui vous donnerait quelque chose dans le genre :</p>
<pre>
...
&lt;select&gt;
    &lt;option value="1"&gt;hello&lt;/option&gt;
    &lt;option value="2"&gt;world&lt;/option&gt;
&lt;/select&gt;
...
</pre>

<h4 id="condition">Les conditions</h4>

      <p>Reprenons le code HTML ci-dessus et ajoutons lui une condition. Les conditions
      peuvent être evaluées sur des variables passées dans le tableau destiné à 
      une boucle ou à la récursion :</p>
      
<pre>
...
&lt;select&gt;
<span class="comment">&lt;!--%loop:options%--&gt;</span>
    &lt;option 
   <span class="comment"><strong>&lt!--%if:isset($['selected'])%--&gt;</strong></span>selected="selected"<span class="comment">&lt!--%endIf%--&gt;</span> 
   value="<span class="comment">&lt;!--%valeur%--&gt;</span>"&gt;<span class="comment">&lt;!--%texte%--&gt;</span>&lt;/option&gt;
<span class="comment">&lt;!--%endLoop:options%--&gt;</span>
&lt;/select&gt;
...
</pre>

      <p>Avec le code suivant : </p>

<pre>
<span class="comment">// construction de l’objet Template</span>
$standardTemplate = new Template('standard.template.html');
<span class="comment">// construction du tableau de valeurs</span>
$optionsArray = array( array('valeur'=&gt;1,'texte'=&gt;'hello'), 
   array('valeur'=&gt;2,'texte'=&gt;'world', <strong>'selected'=>true</strong> ) );
 <span class="comment">// remplacement par boucle</span>
$standardTemplate-&gt;iterateReplace('options',$optionsArray );
<span class="comment">// affichage</span>
echo $standardTemplate->toString();
</pre>

      <p>Vous donnerais au final : </p>
<pre>
...
&lt;select&gt;
    &lt;option value="1"&gt;hello&lt;/option&gt;
    &lt;option <strong>selected="selected"</strong> value="2"&gt;world&lt;/option&gt;
&lt;/select&gt;
...
</pre>

<p>Ou plus exactement ceci : </p>

<form>
<select>
    <option value="1">hello</option>
    <option selected="selected" value="2">world</option>
</select>
</form>

<h5>Conditions plus complexes</h5>

<pre>
...
<span class="comment">&lt!--%if:1==0%--&gt;</span>
&lt;p&gt;1 est égal à 0.&lt;/p&gt;
<span class="comment">&lt!--%elseif:1==2%--&gt;</span>
&lt;p&gt;1 est égal à 2.&lt;/p&gt;
<span class="comment">&lt!--%else%--&gt;</span>
&lt;p&gt;0 n’est ni égal à 1, ni égal à 2.&lt;/p&gt;
<span class="comment">&lt!--%endIf%--&gt;</span>
...
</pre>

<p>Ce qui donnerait evidemment :</p>

<pre>
...
&lt;p&gt;0 n’est ni égal à 1, ni égal à 2.&lt;/p&gt;
...
</pre>

      <h4 id="recursif">Remplacements récursifs</h4>
      
      <p>Voici à quoi ressemblerait un code HTML taillé pour la récursion :</p>
<pre>
...
<span class="comment">&lt;!--%recursion:listeImbriquee%--&gt;</span>
&lt;ul>
<span class="comment">&lt!--%loop%--&gt;</span>
&lt;li&gt;<span class="comment">&lt;!--%texte%--&gt;<strong>&lt;!--%recursion%--&gt;</strong></span>&lt/li&gt;
<span class="comment">&lt!--%endLoop%--&gt;</span>
&lt;/ul&gt;
<span class="comment">&lt;!--%endRecursion:listeImbriquee%--&gt;</span>
...
</pre>

      <p>Si le code PHP associé était comme ceci :</p>

<pre>
<span class="comment">// construction de l’objet Template</span>
$standardTemplate = new Template('standard.template.html');
<span class="comment">// construction du tableau de valeurs</span>
$listesArray = 
    array( array('texte'=>'une'), array('texte'=>'belle', 
    array( array('texte'=>'liste', 
    array( array('texte'=>'récursive')))))); 
 <span class="comment">// remplacement par boucle</span>
$standardTemplate-&gt;recursiveReplace('listeImbriquee',$listesArray );
<span class="comment">// affichage</span>
echo $standardTemplate->toString();
</pre>

<p>La structure de la variable listesArray serait alors :</p>

<pre>
Array
(
    [0] => Array
    (
        [texte] => une
    )

    [1] => Array
    (
        [texte] => belle
        [0] => Array
        (
            [0] => Array
            (
                [texte] => liste
                [0] => Array
                (
                    [0] => Array
                    (
                        [texte] => récursive
                    )
                )
            )
        )
    )
)
</pre>

    <p>Et vous en obtiendriez le code HTML suivant :</p>

<pre>
&lt;ul&gt;
&lt;li&gt;une&lt;/li&gt;
&lt;li&gt;belle
&lt;ul&gt;
&lt;li&gt;liste
&lt;ul&gt;
&lt;li&gt;récursive&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</pre>

<p>C’est à dire ceci :</p>

<ul>
<li>une</li>
<li>belle
<ul>
<li>liste
<ul>
<li>récursive</li>
</ul>
</li>
</ul>
</li>
</ul>

<h3>Conclusion</h3>

<p>Avec <a href="template.class.phps">l’implémentation fournie</a>, il est possible de combiner les différentes façons de faire ormis que l’on 
ne peut emboiter plusieurs niveaux de conditions. La classe n’est de loin pas parfaite mais suffit pour des besoins limités. Il existe de nombreuses
autres implémentations plus évoluées. Je vous laisse les découvrir par vous même.</p>

   </contenu>
      
<zone>

       <h3>Liens</h3>
       <ul>
          <li><a href="template.class.phps">Une implémentation de la classe en PHP</a> ;</li>
          <li><a href="../PyTemplate/">Une implémentation de la classe en Python</a> ;</li>
          <li><a href="http://fr.wikipedia.org/wiki/Template">Template selon Wikipedia</a>.</li>
       </ul>
       <dl>
       <dt>Auteur</dt>
       <dd>Batiste Bieler</dd>
       <dt>Licence</dt>
       <dd><a href="http://fr.wikipedia.org/wiki/LGPL">LGPL</a></dd>
       </dl>
      
   </zone>
</document>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          		