Ratatouille, et un ptit Pastis Parce que la taille fait toute la différence. |
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.
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.
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 là. 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
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.
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éé !
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
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éjà utilisé !</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.
Comment rendre rapidement un site dynamique multilingue:
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
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.
v 1.0.2 23/06/2002