Système de gabarits (templates)

Gloux est bien fichu, car il sépare entièrement le code PHP applicatif (qui manipule vraiment les données) et le code HTML de présentation (qui ne fait qu'afficher les données et les formulaires).

Pour faire cela, Gloux utilise un système de gabarits, qui sont tous entreposés dans le répertoire /templates/.

limitations de la classes templates

La classe templates d'OOAF est très limitée : elle se contente de faire des substitutions de variables, et de générer des blocs de code. Elle ne permet PAS de gérer des conditions, ou des boucles, directement dans le gabarit. Toutes les conditions et la génération de boucle doit se faire par des appels à la fonction buildTag() dans le script PHP. Cette lacune entraine le fait que les scripts PHP sont hélas rapidement alourdis par du code qui n'est pourtant dédié qu'à l'affichage. La pauvreté de la classe templates entraine l'alourdissement des scripts.

C'est d'autant plus dommage qu'il existe de très bonnes classes de gabarits en LGPL depuis bien longtemps, comme Smarty.

code PHP permettant de manipuler les gabarits

Invocation de l'objet template

On crée un objet gabarit de cette façon :

$template = glouxTemplate::init('Achat de parts sociales', 'partsSociales','www/client/partsSociales/achat.tpl');

  1. Le premier paramètre est le titre du gabarit, il sera certainement affiché lors du rendu.
  2. Le second paramètre est l'id de la partie du code HTML générée. Utile surtout pour les feuilles de style.
  3. Le troisième paramètre est le chemin du gabarit. Il est optionnel. Par défaut, Gloux prend le même nom que le nom de votre script PHP, en remplaçant .php par .tpl.

Intégration de variables

Pour passer une variables au gabarit, rien de plus simple :

$template->ma_variable = 'salut les gars';

Dans le gabarit, la balise <tpl:ma_variable/> sera remplacée par la chaine 'salut les gars'.

Filtrer les variables

Il arrivera tôt ou tard que vous vouliez modifier les variables à afficher. Toute fonction définie dans php peut être utilisée comme filtre de cette façon :

<tpl:date_achat modifier="modifier::shortDate" />

Vous pouvez aussi mettre html="true" si ce que vous sortez est du HTML.

Génération de morceaux de gabarits avec buildTag()

Dans le gabarit, vous pouvez encadrer des morceaux de contenus par un tag tel que :

<tpl:truc> Là on peut mettre un peu, beaucoup de contenu. Des messages, des formulaires, etc ... </tpl:truc>

Par défaut, ce contenu ne sera PAS affiché. Pour en provoquer la génération, il faut absolument appeler la fonction buildTag() :

$template->buildTag('truc');

Grâce à cette fonction, on peut donc faire de l'affichage conditionnel. C'est aussi avec cette fonction que l'on va afficher des listes.

Sachez que l'on peut passer un tableau à buildTag(). Les valeurs du tableau seront toutes substituées dans le morceau de gabarit généré.

Exemple :

code PHP :

$monsieur = array('nom' = 'John', 'prenom' = 'Travolta');
$template->buildTag('truc', $monsieur);

code HTML dans le gabarit :

<tpl:truc>
   Bonjour <tpl:prenom/> <tpl:nom/>, comment allez vous ?
</tpl:truc>

Remarque : un bloc qui ne contient AUCUNE variable sera affiché par défaut, même sans appel à $template->buildTag('montag'). Pour que le tag ne soit pas affiché par défaut s'il ne contient aucune variable, il faut ajouter le paramètre autobuild="false".

<tpl:sortir autobuild="false">
je vais m'afficher que si on appel la fonction buildTag().
</tpl:sortir>

Affichage de listes encore avec buildTag()

Pour afficher des listes, il suffit donc logiquement d'appeler buildTag() pour chaque élément de la liste. Par exemple, pour lister mes amis :

code php :

$amis = $dbClient->query("select nom,prenom from amis order by prenom");
foreach ($amis as $ami)
   $template->buildTag('un_ami',$ami);

code HTML :

La liste de mes amis :
<ul>
<tpl:un_ami>
   <li><tpl:prenom/> <tpl:nom/></li>
</tpl:un_ami>
</ul>

Génération (rendering) du gabarit

Pour que le gabarit soit généré proprement dit (on dit aussi rendu, par analogie avec le verbe anglais "to render"), il suffit simplement de faire l'appel suivant :

$template->build()->send();