Ayant utilisé Smarty mais détesté pour son côté trop usine à gaz pour ensuite avoir essayé le vieux Fast Template, trop basique à mon gôut, puis enfin trouvé la classe template de PHPBB3 qui me semble être un bon compromis, j'ai voulu tenter de faire ma propre classe template.
Bon alors comparé aux systèmes que j'ai cité c'est quand même du bricolage, car je n'ai pas trop de connaissances dans les regex et je n'ai même pas eu le courage d'étudié le fonctionnement de ces classes. Je l'ai donc codé de la façon qui me semblait naturelle et avec les conaissances que j'avais...
Mais bon je suis quand même content de cette modeste classe qui pour l'instant sait faire :
- la gestion des variables basiques
- la gestion des block avec variante first et last row
- la gestion de contenu optionnel
- Mise en cache
A mon avis c'est loin d'être optimisé, le parssage d'un block passe par 2 méthodes car je n'ai pas réussi à faire autrement, mais je pense ou du moins j'espère que ce n'est pas du trop mauvais travail.
En tous cas ça répond à mon besoin qui était d'avoir un système de template basique.
J'espère avoir des avis constructifs
Classe + exemple :
<?php
/*
Classe Simple TPL
*/
class simple_tpl{
public $html; // input + output
public $cache_file; // nom du fichier cache
public $dir_cache; // repertoire du cache
public $dir_tpl; // repertoire des templates
protected $temp; // variable contenu temporaire
protected $a_temp; // tableau contenu temporaire
protected $incrementation; // variable contenant les tours de boucle ( utilisee dans prepare_block )
protected $cache; // true ou false si cache de la page existe
protected $cache_time; // duree du cache
public function __construct($dir_tpl, $dir_cache){
// construction de l'objet ( @ param source HTML )
$this->initialise_temp();
$this->cache_time = time()-300;
$this->is_in_cache = $this->is_in_cache();
$this->dir_tpl = $dir_tpl;
$this->dir_cache = $dir_cache;
$this->incrementation = 0;
}
public function define_tpl($html_source){
$this->html = file_get_contents($this->dir_tpl.$html_source);
$this->cache_file = md5($html_source); // le nom du fichier cache est un hash md5 basé sur son url
}
private function is_in_cache(){
if(file_exists($this->dir_cache.$this->cache_file.'.html') && filemtime($this->dir_cache.$this->cache_file.'.html') > $this->cache_time){
return true;
}
return false;
}
private function initialise_temp(){
$this->temp = array();
}
public function parse_array($var){
// parssage array ( @param : array variables )
if($this->is_in_cache == false){
foreach($var as $k=>$v){
$recherche[] = '#{'.$k.'}#Us';
$remplace[] = $v;
}
$this->html = preg_replace($recherche, $remplace, $this->html);
}
}
public function prepare_block($nom, $var){
// preparation block ( @param : nom du block, array variables )
if($this->is_in_cache == false){
if($this->incrementation == 0){
// définition de $temp si on est au premier tour de boucle
$this->temp['element'] = '';
$this->temp['first'] = '';
$this->temp['last'] = '';
}
$this->incrementation++;
preg_match('#{BEGIN BLOCK '.$nom.'}(.*){END BLOCK '.$nom.'}#Us', $this->html, $matches);
$contenu_block = $matches[1];
if(preg_match('#{FIRST}(.*){END FIRST}#Us', $this->html, $matches)){
// recherche si il existe une balise FIRST
// stock first dans $temp
$this->temp['first'] = $matches[1];
// supprime toute la partie FIRST
$contenu_block = preg_replace('#'.$matches[0].'#Us', '', $contenu_block);
}
if(preg_match('#{LAST}(.*){END LAST}#Us', $this->html, $matches)){
// recherche si il existe une balise FIRST
// stock last dans $temp
$this->temp['last'] = $matches[1];
// supprime toute la partie FIRST
$contenu_block = preg_replace('#'.$matches[0].'#Us', '', $contenu_block);
}
foreach($var as $k=>$v){
$recherche[] = '#{'.$nom.'.'.$k.'}#Us';
$remplace[] = $v;
}
// remplacement du tableau recherche par le tableau des valeurs dans $temp
$this->temp['element'] .= preg_replace($recherche, $remplace, $contenu_block);
}
}
public function parse_block($nom){
// parssage block ( @param : nom du block )
if($this->is_in_cache == false){
// parssage
$this->html = preg_replace('#{BEGIN BLOCK '.$nom.'}(.*){END BLOCK '.$nom.'}#Us', $this->temp['first'].$this->temp['element'].$this->temp['last'], $this->html);
// initialisation de $temp pour réutilisation
$this->initialise_temp();
}
}
public function parse_optional($nom, $affiche){
// parssage optional ( @param : nom, mode( 0 = retirer, 1 = afficher ) )
if($this->is_in_cache == false){
if($affiche == false){
// ne sera pas affiché
$this->html = preg_replace('#{BEGIN OPTIONAL '.$nom.'}(.*){END OPTIONAL '.$nom.'}#Us', '', $this->html);
}
else{
// sera affiché
$this->html = preg_replace('#{BEGIN OPTIONAL '.$nom.'}#Us', '', $this->html);
$this->html = preg_replace('#{END OPTIONAL '.$nom.'}#Us', '', $this->html);
}
}
}
public function display(){
// affichage
// si il existe un fichier cache on l'affiche et on sort de la fonction
if($this->is_in_cache == true){ readfile($this->dir_cache.$this->cache_file.'.html'); return; }
// sinon on affiche le résultat du parssage et on le met en cache
echo $this->html;
file_put_contents($this->dir_cache.$this->cache_file.'.html', $this->html);
}
}
/*
Exemple d'utilisation de la classe Simple TPL
*/
// construction de l'objet ( @ param source HTML )
$tpl = new simple_tpl('./template/', './cache/');
// fichier à parser
$tpl->define_tpl('test.html');
// parssage array ( @param : array variables )
$var = array(
'TEXTE_1' => 'Ceci est la valeur de ma première variable.',
'TEXTE_2' => 'Ceci est la valeur de ma seconde variable.',
);
$tpl->parse_array($var);
// preparation block ( @param : nom du block, array variables )
for($i=1; $i<6; $i++){
$var = array(
'ELEMENT' => 'Element '.$i
);
$tpl->prepare_block('MA_LISTE', $var);
}
// parssage block ( @param : nom du block )
$tpl->parse_block('MA_LISTE');
// parssage optional ( @param : nom, mode( false = retirer, true = afficher ) )
if(date('H:m:s') < '12:00:00'){
$optional_1 = true;
$optional_2 = false;
}
else{
$optional_1 = false;
$optional_2 = true;
}
$tpl->parse_optional('AVANT_12H', $optional_1);
$tpl->parse_optional('APRES_12H', $optional_2);
// affichage
$tpl->display();
?>
Template HTML de l'exemple :Code : Tout sélectionner
<p>{TEXTE_1}</p>
{BEGIN BLOCK MA_LISTE}
{FIRST}<ul>{END FIRST}
<li>{MA_LISTE.ELEMENT}</li>
{LAST}</ul>{END LAST}
{END BLOCK MA_LISTE}
<p>{TEXTE_2}</p>
{BEGIN OPTIONAL AVANT_12H}
<p>Ce texte s'affiche seulement avant 12h00.</p>
{END OPTIONAL AVANT_12H}
{BEGIN OPTIONAL APRES_12H}
<p>Ce texte s'affiche seulement après 12h00.</p>
{END OPTIONAL APRES_12H}
Code : Tout sélectionner
<p>Ceci est la valeur de ma première variable.</p>
<ul>
<li>Element 1</li>
<li>Element 2</li>
<li>Element 3</li>
<li>Element 4</li>
<li>Element 5</li>
</ul>
<p>Ceci est la valeur de ma seconde variable.</p>
<p>Ce texte s'affiche seulement après 12h00.</p>