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 <?=$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"><?=$user['name'];?></td>
<td bgcolor="#FFFFFF"><a href="mailto:<?=$user['email'];?>"><?=$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
Template.class.php (1,9 KiB, 178 hits)
Changelog
[21/07/2009]
- Release initiale







22 juillet 2009 - 11 h 27 min
Ca a l’air sympa tout ça. Merci pour le partage. Un truc quand m^me, ce genre de truc « », suis pas fan.
Bon, je t’ai foutu du coup dans mes flux Rss pour la peine /D
22 juillet 2009 - 12 h 17 min
Merci à toi
22 juillet 2009 - 14 h 26 min
Un truc quand m^me ?=$users_count; erf suis pas fan de ça
22 juillet 2009 - 14 h 55 min
Avec le recule, je trouve cela assez propre. Et le rapport simplicité/performance est plus important qu’avec un langage de tags.
C’est la syntaxe même de PHP, on peut le retrouver aussi dans des frameworks comme Zend_Framework.
22 juillet 2009 - 20 h 34 min
?= est un short tag donc reste un tag mais ça, tu l’as compris
.
La syntaxe est valable mais je préfère un ?php echo pour la comprehension. Puis ca casse pas les poignets, tu sais? /D
22 juillet 2009 - 22 h 27 min
Pas faux, comme d’habitude à chaque développeur ses habitudes
25 juillet 2009 - 16 h 58 min
le problème surtout avec les short tags, c’est qu’ils sont désactivés dans la configuration par défaut de PHP. Ce qui fait que le code ne sera pas portable en fonction de la configuration du serveur.
De plus avec PHP 6, les short tags ne seront plus.
25 juillet 2009 - 17 h 52 min
Pas faux, surtout pour le PHP6
4 août 2009 - 15 h 03 min
J’ai presque la même !
Je vais ajouter l’utilisation du extract qui simplifie ensuite l’écriture des templates.
l’utilisation des méthodes magiques de PHP peut permettre de s’affranchir de la méthode « assign »
vars[$name] = $value;
}
private function __get($name) {
return $this->vars[$name];
}
?>
Ainsi tu peux faire :
$tpl->users_list = $users;
4 août 2009 - 15 h 18 min
Bonne idée, pourquoi ne pas utiliser pleinement les possibilités de PHP5