Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

PHP moteur de template... réalité ou fiction ?

Template or not template ?

Je penses que la majorité d'entre-vous ont déjà entendu le mot template, on déjà entendu le mot smarty et ont sûrement entendu parler de FastTemplate et autres trucs du même genre.

Ouais ouais... moi j'connais... ce sont des moteurs de templates !

Et voilà, tout le monde en parles...
Puisque c'est comme ça, voici un exemple tiré d'un moteur archi connu... Smarty ! Entre-nous, il n'est très joli ce code d'ailleurs, mais bon...on va passer là-dessus !
Donc, voilà, le template... Smarty dixit :
<table border="0" width="300">
    <tr>
        <th colspan="2" bgcolor="#d1d1d1">Guestbook Entries (<a href="{$SCRIPT_NAME}?action=add">add</a>)</th>
    </tr>
    {foreach from=$data item="entry"}
        <tr bgcolor="{cycle values="#dedede,#eeeeee" advance=false}">
            <td>{$entry.Name|escape}</td>       
            <td align="right">{$entry.EntryDate|date_format:"%e %b, %Y %H:%M:%S"}</td>       
        </tr>
        <tr>
            <td colspan="2" bgcolor="{cycle values="#dedede,#eeeeee"}">{$entry.Comment|escape}</td>
        </tr>
    {foreachelse}
        <tr>
            <td colspan="2">No records</td>
        </tr>
    {/foreach}
</table>

    {if $error ne ""}
        <tr>
            <td bgcolor="yellow" colspan="2">
                {if $error eq "name_empty"}You must supply a name.
                {elseif $error eq "comment_empty"} You must supply a comment.
                {/if}
            </td>
        </tr>
    {/if}

Et alors quoi ?
Il y a dans cet exemple, autre chose que du HTML .... non ????
Alors pourquoi un nouveau langage s'il en existe déjà un ?

Comment ça, Yves, il existe un autre langage ? A mon avis, t'as encore abusé de boissons alcoolisées et maintenant t'as des vapeurs ?
Non non les p'tits loups, pas d'inquiétude... Papy Yves se porte comme un charme. Donc disais-je, il existe déjà un moteur de template... vous n'avez jamais entendu parler de PHP ?

Hein quoi... non pas PHP quand même ?
Et si... à l'origine, Rasmus Lerdorf n'avait comme seule intention que de séparer son affichage de son code et c'est dans cette optique qu'est né PHP. Si l'outil a évolué pour donner ce qu'on connait aujourd'hui, il n'en reste pas moins que PHP est et restera avant tout un moteur de templates.

Et bang... il y en a qui sont tombés de leur chaise là ?
Allez zou, on arrête les beaux discours, on y va par l'exemple et la pratique.

Notre fichier de code :  page1.php
<?php
$nom = htmlspecialchars( $_POST['nom'] );
require 'affichage/require.php';
?>

Notre gabarit pour la page 1 :  template/gabarit1.php
<?php
<html>
<head>
   <title>Accueil</title>
   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<p>Bonjour <?php echo $nom ?></p>
</body>
</html>
?>

Voilà, et alors... ce n'est pas un langage de gabarit ça, ce n'est pas du template là ?

J'entend déjà les détracteurs hurlant à la mort : "Ouais mais c'est des conneries ça, c'est trop simple !"
Et alors, pourquoi cela devrait-il être plus compliqué... vous voulez un autre exemple peut-être ?
Allons-y !

gabarit/entete.php
<html>
<head>
<title><?php echo $title ?></title>
</head>
<body>

gabarit/pied.php
<p> <?php echo $copy; ?></p>
</body>
</html>

gabarit/accueil.php
<h1><?php echo $title ?></h1>
<p>Ceci est la page d'accueil
On y trouve un tas de blabla...</p>


Et voici enfin la page traitant le code php.
code/accueil.php
<?php
$titre = 'accueil';
$copy = '&copy; 2006 ',(2006<date('Y')) ? '- '.date('Y') : '';
require 'gabarit/entete.php';
require 'gabarit/accueil.php';
require 'gabarit/pied.php';
?>

Franchement, que faut-il de plus ?


Plus fort encore !
On trouve dans des dizaines de questions et d'exemples sur les forums ce genre de syntaxe :

blabla bidule chose {VAR} blabla et pouet pouet
- pourquoi faire ça :
blabla bidule chose {VAR} blabla et pouet pouet
et demander au moteur de parser ?

- alors que la syntaxe que j'emploie est tout aussi simple et le fait directement :
blabla bidule chose <?php echo $var ?> blabla et pouet pouet


- pourquoi faire ça :
<?php
<!-- BEGIN BLOCK -->
blabla bidule chose {VAR}
<!-- END BLOCK -->
?>
et boucler 2 ou 3 fois avec le moteur de templates ?

- alors qu'on pourrait tout aussi bien faire ça :
<?php
for($i = 0; $i < 3; $i++) {
    printf('blabla bidule chose%d', $var);
}
?>

Personnellement, la notion que j'ai de la séparation de l'affichage et du traitement ne signifie pas que l'on doive mettre d'un côté nos pages de scripts PHP et de l'autre nos pages avec le balisage HTML.
Il faut plutôt appréhender la chose sous cet angle :
  • D'un côté, on a les scripts qui manipulent nos données : enregistrement, modification, suppression, traitement, etc...
  • De l'autre côté, tout ce qu'il nous faut pour afficher nos données : cela peut aller des gabarit a du html pur en passant par des scripts PHP ou javascript bref, tout ce qui permet de générer notre affichage dans le navigateur.
Et voilà, je pense que l'on peux avoir des scripts PHP dans les 2 cas, mais qu'il est intéressant de séparer les 2 types de scripts qu'on peut désigner sous les termes, scripts de traitement et scripts d'affichage

Voilà, c'est dans cet esprit que je conçois le gabarit.
On pourrait donner des dizaines d'exemples...

Je suis d'ailleurs occupé sur un complément qui va montrer comment on peut créer son balisage perso simplement et ainsi permettre au designer et au codeur de travailler chacun de leur côté. Un bête script pour convertir et le tour est joué. C'est tellement simple que s'en devient même idiot de ne pas y avoir pensé.


Et voilà, présentation d'un idée de process vraiment simple :
La page avec le code php nommée index.php :
<?php
$titre = 'Le titre de la page';
$message = 'Voici le message a placé dans le gabarit';
require 'gabarit_index.php';
?>

La page avec le code HTML créée par le graphiste et nommée gabarit_index.html :
<?php
<!doctype html public "-//w3c//dtd html 4.0//en">
<html>
<head><title>{titre}</title></head>
<body>
<h1>{titre}</h1>
<p>{message}<p>
</body>
</html>
?>

Sous cette forme, il ne parait pas possible, d'exploiter les deux fichiers ensemble. C'est vrai ! C'est là qu'intervient ce simple petit script php qui va lire les fichiers html créé par le graphiste et convertir le balisage perso en créant un nouveau fichier identique au fichier html mais portant une extension .php

Notre script php nommé convertir_gabarit.php :
<?php
// on récupère le fichier html fait par le graphiste
$gabarit='gabarit_index.html';

// on zappe l'extension html
$recup=substr($gabarit,0,strpos($gabarit,'.'));

// on prépare notre gabarit php
$convertir=$recup.'.php';

// chargement du fichier gabarit
$g = implode('',file($gabarit));
// conversion du code perso fichier
$g = preg_replace('`{([^}]+)}`','<?php echo $$1; ?>',$g);

// Sauvegarde du gabarit convertit
$f = fopen($convertir,'w');
fputs($f,$g);
fclose($f);
?>

Et voilà, un simple appel à ce sript va convertir notre page gabarit_index.html et créer une autre page appellée gabarit_index.php afin de permettre l'usage du code php. Il suffit ensuite de mettre tous les fichiers .php sur votre ftp. Les fichiers d'origine au format .html restent disponibles dans leur mise en page initiale et peuvent être modifié à volonté. A chaque modif, il suffira simple de réécrire le fichier .html en .php pour l'utiliser sur le site.
ADAM Benjamin 2008 | Admin