A consommer avec modération Ratatouille, et un ptit Pastis
Parce que la taille fait toute la différence.
Miam

Utilisation des Templates

J'aime pas trop les spaghetti

La version traditionnelle d'une page php, c'est du genre (ceci est une caricature, je suis tout à fait convaincu que vous faites mieux)

<html>
<head><title>test idiot</title></head>
<body>
<h1>Je sais compter</h1>
<table>
<?php
for($i=1;$i<20;$i++){
 echo "<tr><td>$i * $i </td><td>".$i*$i."</td></tr>";
}
?>
</table>
<?php
echo "et voilà!<br>";
?>
</body>
</html>

La logique et le code HTML sont mélangés (c'est un des avantages de php qu'ils disent). Et c'est parfois ennuyeux!. Vouloir changer tout le HTML d'un coup, pour faire évoluer l'aspect du site, demande un petit peu de travail puisqu'il faut découper le fichier html trouvé sur la toile pour le faire entrer dans le code php.
Ou bien, si un graphiste et un codeur travaillent en même temps sur un site, il faut de temps en temps intégrer le travail de l'un et le travail de l'autre. Et prier pour que l'éditeur intelligent du graphiste ne réécrive pas des parties du code php.

Une version alternative pour arriver à un résultat équivalent est l'utilisation de templates. J'utilise Fast Templates, parce que cela me convient (et que je l'utilise en Perl aussi). Libre à vous d'essayer les autres solutions qui font plus de choses et bien plus vite.

Principe des templates: la séparation du code et de la logique

Deux types de fichiers sont nécessaires pour bâtir une page, le template qui contient le html, avec des variables notées {VARIABLE} et des blocs logiques, entre <!-- BEGIN DYNAMIC BLOCK: un_nom --> et <!-- END DYNAMIC BLOCK: un_nom --> . L'autre fichier, le script, en php, choisit le bon template, remplit les variables et ajoute une ou plusieurs fois des blocs logiques et construit une page utile.

Installation de FT

Vous allez sur la page, vous chargez le .tgz et vous décompressez le tout sur votre disque dur favori. C'est en php3, et donc faut faire les corrections indiquées sur le site pour que cela marche avec php4 et str_replace.
J'ai fait quelques modifications supplémentaires:

La version est . Emmerdez pas l'auteur original de FT si y'a des problèmes avec cette version, hein, courrielez-moi à la place. Ou mieux, lisez le code et corrigez les. Si j'y suis arrivé...

Et n'oubliez pas de commencer par lire le manuel, cela aide fortement à comprendre la suite

Premier essai

Refaisons l'exemple idiot précédent avec un template. On a DEUX fichiers maintenant, le template mult.tmpl

<html>
<head><title>test idiot</title></head>
<body>
<h1> je sais compter</h1>
<table>
<!-- BEGIN DYNAMIC BLOCK: ligne -->
<tr>
<td>{valeur} *  {valeur}</td>
<td>{carre}</td>
</tr>
<!-- END DYNAMIC BLOCK: ligne -->
</table>
Et voilà!
</body>
</html>

Vous remarquez que le BEGIN DYNAMIC BLOCK est en commentaire, ce qui ne devrait pas gêner votre validation html.

La logique en php;

<?php
include("class.FastTemplate.php3");
$tpl = new  FastTemplate("tmpl/"); // tmpl/ est le repertoire ou j'ai stocke mes templates
$tpl->define(array('principal'    => "mult.tmpl")); // mon template principal
$tpl->define_dynamic( "ligne" , "principal" ); // je dis qu'il y a un bloc logique dans le template
for($i=1;$i<20;$i++){
	 $tpl->assign("valeur",$i);
	 $tpl->assign("carre",$i*$i);
	 // le . veut dire ajouter a la suite de l'existant
	 $tpl->parse_dynamic(".ligne");
}
$tpl->parse('PAGE', "principal");
$tpl->FastPrint("PAGE");
?>

Comme vous l'aurez sans doute noté, mon html est moche. Normal.
Comme j'utilise des templates, j'envoie à mon graphiste favori les fichier template, qui me le rend magnifique. Pendant ce temps, je continue à pisser du code php. L'intégration consiste à remplacer dans le répertoire tmpl/ mon template par le sien. Intégration facile, travail en équipe, deux problèmes résolus.

Generation de pages statiques

La page obtenue, à est purement statique: vous pouvez la regarder 1000 fois, ce sera la même, sauf si le serveur est en panne. Je pourrai la faire directement en html, mais si je veux faire la même chose en allant de 1 a 100000, y'a un intérêt certain à le faire en php... Donc cela serait très utile de pouvoir sauvegarder le résultat final dans un fichier html. Sûr que je peux faire Save as avec mon mozilla favori, mais quand le site comporte 400 pages, c'est fatiguant (mais faisable, avec un aspirateur de site genre wget/curl ou Web Downloader)
Avec un site architecturé autour de l'utilisation de templates, y'a une autre solution: on modifie légèrement le code php d'affichage du template:

 $tpl->parse('PAGE', "principal");
 $tpl->FastPrint("PAGE");

est remplacé par

if($fp=fopen("home.html","w")){
    $tpl->parse('PAGE', "principal");
    fwrite($fp,$tpl->fetch("PAGE"));
    fclose($fp);
    echo "<a href=\"home.html\">home.html créé</a>";
}

Et voila. Le fichier statique home.html est créé !

Quelques applications de plus

Entête et pieds de page

Admettons que dans vos templates, vous voulez inclure automatiquement un entête et un pied de page.

D'abord les deux micro-templates

<meta name="Author" content="Jane Doe" />
<div class="pdp">© 2002</div>

les variables {ENTETE} et un {PIED_DE_PAGE} rajoutés dans vos templates principaux, au bon endroit; et le code php qui va bien

// on charge plusieurs fichiers de template
$tpl->define(
	array(
		entete	  => "entete.tmpl",
		principal => "mult2.tmpl",
		pdp	  => "pdp.tmpl"
	)
);
// du code au milieu si on veut
$tpl->parse(ENTETE, "entete"); // on met le contenu du template entete dans la variable ENTETE
$tpl->parse(PIED_DE_PAGE, "pdp"); // on met le contenu du template pdp dans la variable PIED_DE_PAGE
$tpl->parse('PAGE', "principal"); // on remplace la variable ENTETE par sa valeur.
// l'affichage

Multiples réponses dans un même fichier

Vous voulez avoir une même page qui affiche une forme et éventuellement les erreurs.

<!-- BEGIN DYNAMIC BLOCK: err_pw -->
<div class="error">Votre mot de passe est trop court !</div>
<!-- END DYNAMIC BLOCK: err_pw -->
<!-- BEGIN DYNAMIC BLOCK: err_login -->
<div class="error">Cet identifiant est d&eacute;j&agrave; utilis&eacute; !</div>
<!-- END DYNAMIC BLOCK: err_login -->

et le squelette de code php qui s'en sert:

// code de validation de la form
// if (mot de passe trop court)
 $tpl->parse_dynamic("err_pw");
// if (login deja utilise
 $tpl->parse_dynamic("err_login");
// ...
// des erreurs ? on reaffiche le template
 $tpl->parse('PAGE', "forme");
// sinon on affiche la page suivante
 $tpl->parse('PAGE', "bienvenue");
// et on affiche la page
$tpl->FastPrint("PAGE");

Vous avez besoin de ma version modifié de FT pour cet exemple.

Multilinguisme

Comment rendre rapidement un site dynamique multilingue:

  1. ajouter une option lg= dans chaque url de votre site
  2. ajouter un test de l'option avec une langue par défaut
    la page d'accueil est une page html statique avec les classiques html.fr et html.en qui propose de choisir la langue préferée pour la suite de la navigation, avec une préselection basee sur la configuration du navigateur)
  3. simplement rajouter le $lg dans $tpl = new FastTemplate("tmpl/$lg");

Ensuite, il ne vous reste seulement à rajouter les templates traduits dans le répertoire correspondant...

En utilisant le même principe, on peut faire des skins, mais tout le monde sait bien que les CSS sont plus indiquées pour cela

Conclusion

J'aime bien les templates. Et pour faire un moteur de joueb, c'est bien utile ! Essayez, vous verrez, c'est très possible que vous aimiez.

Références

v 1.0.2 23/06/2002

A propos Ce que je disais les semaines précédentes Réagissez
Site tournant au diesel
Joueb francophone S pion