Templating simple en PHP5

Voici une classe très simple qui vous permet de manipuler des templates HTML en PHP. Ce développement à uniquement pour vocation de démontrer que la mise en place d’un système de templating « maison » est facilement possible, et cela, en utilisant les fonctionnalités de PHP. Bien sur, en aucun cas, elle va vous proposer autant d’implémentations que Smarty (par exemple), mais il est possible de profiter de toute la puissance de PHP. Libre à vous d’améliorer ce genre de développement.

Voici cette classe en question :

if (isset($_GET['source'])) {
    highlight_file(__FILE__);
    die;
}
/*
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
*
*  @author            CERDAN Yohann <cerdanyohann@yahoo.fr>
*  @copyright      (c) 2009  CERDAN Yohann, All rights reserved
*  @ version         13:04 21/07/2009
*/
class Template {
    private $vars;  // Holds all the template variables
    private $file;  // the file name you want to load
    /**
          * Class constructor
          *
          * @param $file string the file name you want to load
          *
          * @return void
          */
    function Template($file)
    {
        $this->file = $file;
    }
    /**
          * Set a template variable
          *
          * @param $name string the name of the variable
          * @param $value string the value of the variable
          *
          * @return void
          */
    function assign($name, $value)
    {
        $this->vars[$name] = $value;
    }
    /**
          * Open, parse, and return the template file
          *
          * @return string the content of the template file
          */
    function fetch()
    {
        if (!$this->file) {
            echo 'Error : you must specifiy a template file';
            return;
        }
        extract($this->vars);           // Extract the vars to local namespace
        ob_start();                     // Start output buffering
        include($this->file);           // Include the file
        $contents = ob_get_contents();  // Get the contents of the buffer
        ob_end_clean();                 // End buffering and discard
        return $contents;               // Return the contents
    }
}

Elle s’utilise très simplement à la manière de Smarty (on envoie les variables au template) :

require_once('Template.class.php');
$tpl = new Template('index.tpl'); // this is the outer template
$users = array();
$users []= array ('name'=>'CERDAN Yohann', 'email'=>'test@yahoo.fr');
$users []= array ('name'=>'CERDAN Yohann', 'email'=>'test@yahoo.fr');
$users []= array ('name'=>'CERDAN Yohann', 'email'=>'test@yahoo.fr');
$users []= array ('name'=>'CERDAN Yohann', 'email'=>'test@yahoo.fr');
$users []= array ('name'=>'CERDAN Yohann', 'email'=>'test@yahoo.fr');
$users []= array ('name'=>'DOE John', 'email'=>'johndoe@yahoo.fr');
$users []= array ('name'=>'DOE John', 'email'=>'johndoe@yahoo.fr');
$users []= array ('name'=>'DOE John', 'email'=>'johndoe@yahoo.fr');
$users []= array ('name'=>'DOE John', 'email'=>'johndoe@yahoo.fr');
$users []= array ('name'=>'DOE John', 'email'=>'johndoe@yahoo.fr');
$users []= array ('name'=>'DOE John', 'email'=>'johndoe@yahoo.fr');
$tpl->assign('users_list', $users);
$tpl->assign('users_count', count($users));
echo $tpl->fetch();

Enfin, voici le template HTML correspondant :

There is <?php echo $users_count;?> in this list : <br /><br />
<table cellpadding="3" border="0" cellspacing="1" bgcolor="#CCCCCC">
    <tr>
        <td bgcolor="#F0F0F0">Name</td>
        <td bgcolor="#F0F0F0">Email</td>
    </tr>
<?php foreach($users_list as $user): ?>
    <tr>
        <td bgcolor="#FFFFFF"><?php echo $user['name'];?></td>
        <td bgcolor="#FFFFFF"><a href="mailto:<?php echo $user['email'];?>"><?php echo $user['email'];?></a></td>
    </tr>
<?php endforeach; ?>
</table>

Il y a simplement à appeler les objets PHP directement dans le fichier de template. La syntaxe PHP $<?= est faite pour cela, et elle est au moins aussi simple que le {$} de Smarty. Le rendu final de cet appel est visible ici : démonstration du templating.

Comme amélioration on pourrait imaginer la mise ne place d’un système de cache. Pour cela, la mise en place de APC n’est pas chose complexe.

Télécharger la classe Template.class.php

Télécharger le fichier "Template.class.php"

comments powered by Disqus