Que pensez vous ma classe template ?

Mammouth du PHP | 531 Messages

14 juin 2009, 23:59

Bonsoir,

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 :wink:


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}
Résultat de l'exemple :

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>

ViPHP
ViPHP | 5924 Messages

15 juin 2009, 00:14

Un seul commentaire :
Un moteur de template qui nécessite un parsage des variables est useless, puisqu'il perd inutilement de la performance. Un bon moteur de template utilise un parsage natif (par php) ou intégré en tant que module, donc codé de manière performante.

Mammouth du PHP | 531 Messages

15 juin 2009, 00:25

Un seul commentaire :
Un moteur de template qui nécessite un parsage des variables est useless, puisqu'il perd inutilement de la performance. Un bon moteur de template utilise un parsage natif (par php) ou intégré en tant que module, donc codé de manière performante.
Je ne te cacherais pas que j'ai pas tout compris à propos du parsage natif : tu peut m'en dire plus ?

Merci d'avance :wink:

ViPHP
ViPHP | 5924 Messages

15 juin 2009, 07:49

Le parsage natif, c'est ça :

Fichier de template :
Voici le texte de mon template, et une variable : <?php echo $variable; ?>.
Ce n'est pas moins lisible.
Ce n'est pas plus compliqué à utiliser pour un graphiste.
C'est beaucoup plus performant (on ne parle pas d'optimiser un " en ' mais de vrai gain de perf ici).

Mammouth du PHP | 531 Messages

15 juin 2009, 08:53

Après on rentre dans un débat mais sache que je suis daccord avec toi en ce qui concerne la lisibilité, et effectivement ce n'est pas plus compliqué.
Donc tu vas me dire pourquoi pondre cette classe si je partage cet avis ? j'ai tout simplement été obligé un jour dans mon ancienne boite quelqun à dit maintenant c'est smarty. Dans celle ou je suis actuellement j'ai pas le choix nomplus, mais on tourne avec Fast template qui est beaucoup simple et raisonnable que smarty et finalement voilà comme on me laisse pas le choix je voulais faire mon propre essais.

Mais mis à part ce débat, si tu as des avis, du point de vu fonctionnement de la classe et code :wink:

Mammouth du PHP | 531 Messages

17 juin 2009, 19:58

J'ai apporté quelques améliorations comme les includes de template, un système de cache basique.
Si quelqun à remarques sur mon code je suis preneur. Je pense notament qu'il y a du travail à faire côté optimisation...
<?php
/*
Classe Simple TPL
Version 0.2 ( 06/09 )
http://supercanard.phpnet.org/simpletpl/
*/

class simple_tpl{
	public $html; // buffer
	public $cache_file; // nom du fichier cache
	public $dir_cache; // repertoire du cache
	public $dir_tpl; // repertoire des templates
	protected $temp; // tableau contenu temporaire
	protected $incrementation; // variable contenant les tours de boucle ( utilisee dans prepare_block )
	protected $cache_time; // duree du cache
	protected $is_in_cache; // page en cache ou non
	
	public function __construct($dir_tpl = './template/', $dir_cache = './cache/'){
	// construction de l'objet ( @ param repertoires template et cache )
		$this->initialise_temp();
		$this->define_cache_time(300);
		$this->dir_tpl = $dir_tpl;
		$this->dir_cache = $dir_cache;
		$this->initialise_incrementation();
		$this->html = '';
	}
	public function define_tpl($html_source){
	// définie la template a parser puis détermine si il existe dans le cache et enfin appelle la méthode d'import des sous templates
		$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
		$this->is_in_cache = $this->is_in_cache();
		$this->import_tpl();
	}
	public function define_cache_time($second = 300){
	// redéfinie la durée du cache
		$this->cache_time = time()-$second;
	}
	
	private function is_in_cache(){
	// test l'existence d'un résultat de parssage dans le 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(){
	// initialise le tableau $temp
		$this->temp = array();
	}
	private function initialise_incrementation(){
	// initialise la variable d'incrementation
		$this->incrementation = 0;
	}
	
	private function import_tpl(){
	// Importe les sous templates dans la template définie par define_tpl()
		if(preg_match_all('#{IMPORT (.*)}#Us', $this->html, $matches)){
			foreach($matches[1] as $k=>$tpl){
				$this->temp['import'] = file_get_contents($this->dir_tpl.$tpl);
				$this->html = preg_replace('#'.$matches[0][$k].'#Us', $this->temp['import'], $this->html);
			}
		}
	// html+content
	}
	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){
			// initialisation 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
			if(isset($recherche) > 0)
				$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 et $incrementation pour réutilisation
			$this->initialise_temp();
			$this->initialise_incrementation();
		}
	}
	
	public function parse_optional($nom, $show = true){
	// parssage optional ( @param : nom, mode( 0 = retirer, 1 = afficher ) )
		if($this->is_in_cache == false){
			if($show == 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){ echo file_get_contents($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);
	}
}
?>

Exemples d'utilisation :

Code : Tout sélectionner

<p>{PRENOM} est agé de {AGE} ans.</p> {BEGIN BLOCK LISTE} {FIRST}<ul>{END FIRST} <li>Elément {LISTE.VALEUR_I}</li> {LAST}</ul>{END LAST} {END BLOCK LISTE} {BEGIN OPTIONAL OPTION_1} <p>Ce contenu peut être affiché oui retiré.</p> {END OPTIONAL OPTION_1} {BEGIN OPTIONAL OPTION_2} <p>Ce contenu peut être affiché oui retiré.</p> {END OPTIONAL OPTION_2}
<?php
header('Content-type: text/html; charset=UTF-8');
// Pour commencer
include_once('simple_tpl.class.php');
$tpl = new simple_tpl('template/', 'cache/');
$tpl->define_tpl('exemple.html');
// Variables
$var = array(
    'PRENOM' => 'Toto',
    'AGE' => 23,
);
$tpl->parse_array($var);
// Block
for($i=0; $i<6; $i++){
    $var = array(
        'VALEUR_I' => $i,
    );
    $tpl->prepare_block('LISTE', $var);
}
$tpl->parse_block('LISTE');
// Optional
$tpl->parse_optional('OPTION_1', true);
$tpl->parse_optional('OPTION_2', false);
// Affichage
$tpl->display(); 
?>
Autre exemple :

Code : Tout sélectionner

<p>Le contenu ci-dessous est le résultat de l'import template ( include ).</p> {IMPORT exemple2.inc.html}

Code : Tout sélectionner

{BEGIN OPTIONAL OPTION_1} <p>Ce contenu peut être affiché oui retiré.</p> {END OPTIONAL OPTION_1} {BEGIN OPTIONAL OPTION_2} <p>Ce contenu peut être affiché oui retiré.</p> {END OPTIONAL OPTION_2}
<?php
header('Content-type: text/html; charset=UTF-8');
include_once('simple_tpl.class.php');
$tpl = new simple_tpl(); // Instanciation de l'objet avec paramètres dir_tpl et dir_cache par défaut
$tpl->define_cache_time(0); // Désactivation du cache
$tpl->define_tpl('exemple2.html');
$tpl->parse_optional('OPTION_1'); // Optional avec paramètre show par défaut
$tpl->parse_optional('OPTION_2', false);
$tpl->display();
?>

ViPHP
ViPHP | 3300 Messages

17 juin 2009, 21:15

le plus optimisé c'est de ne pas faire de php

HTML 4 ftw!
Fait du php depuis que ca existe ou presque :)

ViPHP
ViPHP | 4674 Messages

24 juin 2009, 12:40

Hey :-),

HTML 5 mon gars, t'es has been avec HTML 4 ;-).

Plus sérieusement, le code ne casse pas trois pattes à un canard. Il est pas trop mal foutu mais sans plus. Ce qui est important, c'est si ton « langage » permet de faire plus de choses que ce que PHP propose, et plus simplement. L'exemple que tu nous fournis est plus verbeux, moins lisible, moins puissant et plus lent que PHP. On peut comprendre qu'il soit plus lent s'il apporte une plus-value, mais ce n'est pas le cas. Donc avant de juger la qualité du code, je juge son utilité :-).
Petite parenthèse, si ton langage n'est pas reconnu par les colorisateurs syntaxiques, il sera peu utilisable par les novices et donc ne rencontrera pas une grande sympathie. C'est un point à ne pas oublier.

Pour ma part, je pense qu'il y a beaucoup plus de choses à chercher et à trouver du côté de la construction et élaboration de layout plutôt que de la façon d'écrire les données dans la page. Comprendre, un bon gestionnaire de vue partielle, vue complète, vue répétée, vue partagée etc., plutôt que d'inventer un n-ème « langage » bâtard peu expressif et lourdingue que tout le monde va devoir apprendre car il ne correspond à rien et est trop limité.

Ne prend pas tout pour toi, mais j'exprime simplement mon opinion :-). Tu as de l'énergie, il faut juste la canaliser dans la bonne voie !
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Mammouth du PHP | 531 Messages

24 juin 2009, 13:43

Oula doucement le HTML 5, IE 6 à encore des parts de marchés :lol:

Merci pour ta rep HyWan
Non mais je le prends pas mal, je sais de toute façon très bien qu'un système de template est vraiment optionnel, mais bon c'était surtout pour essayer de faire ma propre classe qui pourrait éventuellement remplacer une que je suis plus ou moins obligé d'utiliser. Et je préfère le code maison plutôt que les libs qui viennent de droite à gauche.

Depuis je l'ai quand même amélioré et débogué, la méthode prepare_block() à été optimisée, elle gère les includes et devrais bientôt gérer les else block. 9a sera de toute façon toujours moins puissant que PHP ;)

Hop je recolle pour finir la version corrigée.
J'ai même fait une doc d'utilisation dabord pour moi même au cas ou j'oubli comment l'utiliser, enfin ça m'étonnerais quand même... : http://supercanard.phpnet.org/simpletpl ... ation.html
class simple_tpl{
	public $html; // buffer
	public $cache_file; // nom du fichier cache
	public $dir_cache; // repertoire du cache
	public $dir_tpl; // repertoire des templates
	protected $temp; // tableau contenu temporaire
	protected $incrementation; // variable contenant les tours de boucle ( utilisee dans prepare_block )
	protected $cache_time; // duree du cache
	protected $is_in_cache; // page en cache ou non
	protected $cache_etat; // on ou off
	
	public function __construct($dir_tpl = './template/', $dir_cache = './cache/'){
	// construction de l'objet ( @ param repertoires template et cache )
		$this->initialise_temp();
		$this->define_cache_time(300);
		$this->dir_tpl = $dir_tpl;
		$this->dir_cache = $dir_cache;
		$this->initialise_incrementation();
		$this->html = '';
	}
	
	public function define_tpl($html_source){
	// définie la template a parser puis détermine si il existe dans le cache et enfin appelle la méthode d'import des sous templates
		$this->html .= file_get_contents($this->dir_tpl.$html_source);
		$this->cache_file = md5($html_source).'.html'; // le nom du fichier cache est un hash md5 basé sur son url
		$this->is_in_cache = $this->is_in_cache();
		$this->import_tpl();
	}
	public function define_cache_time($second){
	// redéfinie la durée du cache et son état
		$this->cache_time = time()-$second;
		$this->cache_etat = true;
		if($second == 0){
			$this->cache_etat = false;
		}
	}
	
	private function is_in_cache(){
	// test l'existence d'un résultat de parssage dans le cache
		if(file_exists($this->dir_cache.$this->cache_file) && filemtime($this->dir_cache.$this->cache_file) > $this->cache_time){
			return true;
		}
		return false;
	}
	private function initialise_temp(){
	// initialise le tableau $temp
		$this->temp = array();
	}
	private function initialise_incrementation(){
	// initialise la variable d'incrementation
		$this->incrementation = 0;
	}
	
	private function import_tpl(){
	// Importe les sous templates dans la template définie par define_tpl()
		if(preg_match_all('#{IMPORT (.*)}#Us', $this->html, $matches)){
			foreach($matches[1] as $k=>$tpl){
				$this->temp['import'] = file_get_contents($this->dir_tpl.$tpl);
				$this->html = preg_replace('#'.$matches[0][$k].'#Us', $this->temp['import'], $this->html);
			}
		}
	}
	private function _parse_optional(){
	// parssage des optional version 0.2.1
		$this->html = preg_replace('#{BEGIN OPTIONAL (.*)}#Us', '', $this->html);
		$this->html = preg_replace('#{END OPTIONAL (.*)}#Us', '', $this->html);
	}
	private function parse_elseblock($name, $show){
	// parssage des elseblock
		echo $show;
		if($show == true){
		// Affiche elseblock
			if(preg_match('#{ELSE '.$name.'}(.*){END ELSE '.$name.'}#Us', $this->html, $matches)){
				echo 'affiche elseblock';
			}
		}
		if($show == false){
		// Retire elseblock
			if(preg_match('#{ELSE '.$name.'}(.*){END ELSE '.$name.'}#Us', $this->html, $matches)){
				echo 'retire elseblock';
			}
		}
	}
	
	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){
			// Premier tour de boucle = initialisation + recherche des balises
				$this->temp['element'] = '';
				$this->temp['first'] = '';
				$this->temp['last'] = '';
				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);
				}
				// ligne contenant le subject à remplacer à chaque appel de prepare_block dans une boucle
				$this->temp['ligne'] = $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, $this->temp['ligne']);
			$this->incrementation++;
		}
	}
	public function parse_block($nom){
	// parssage block ( @param : nom du block )
		if($this->is_in_cache == false){
			if(!isset($this->temp['element'])){
			// Si pas d'éléments on remplace par null et on cherche à afficher le elseblock
				$this->temp['remplace'] = '';
				$this->parse_elseblock($nom, true);
			}
			else{
				$this->temp['remplace'] = $this->temp['first'].$this->temp['element'].$this->temp['last'];
				$this->parse_elseblock($nom, false);
			}
			$this->html = preg_replace('#{BEGIN BLOCK '.$nom.'}(.*){END BLOCK '.$nom.'}#Us', $this->temp['remplace'], $this->html);
			// initialisation de $temp et $incrementation pour réutilisation
			$this->initialise_temp();
			$this->initialise_incrementation();
		}
	}
	public function parse_optional($nom, $show = true){
	// Dépréciée depuis la 0.2.1
	// parssage optional ( @param : nom, mode( 0 = retirer, 1 = afficher ) )
		if($this->is_in_cache == false){
			if($show == 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 unset_optional($nom){
	// Elimine un optional ( remplace parse_optional() )
		if($this->is_in_cache == false){
			$this->html = preg_replace('#{BEGIN OPTIONAL '.$nom.'}(.*){END OPTIONAL '.$nom.'}#Us', '', $this->html);
		}
	}
	public function fetch(){
	// Parse les optional, retourne le résultat final et écrit le fichier dans le cache
		$this->_parse_optional();
		// si il existe un fichier cache on retourne son contenu
		if($this->is_in_cache == true){ return file_get_contents($this->dir_cache.$this->cache_file); }
		// sinon on retourne le résultat du parssage et on le met en cache si $cache_etat est true
		if($this->cache_etat == true){
			file_put_contents($this->dir_cache.$this->cache_file, $this->html);
		}
		return $this->html;
	}
	public function display(){
	// affichage
		echo $this->fetch();
	}
}

Eléphant du PHP | 111 Messages

15 juil. 2009, 09:40

Salut supercanard,

moi je pose la question comme ça mais, si ta boîte t'oblige à utiliser des moteurs de templates, pourquoi tu ne leur expliques pas que php est déjà un moteur de templates naturel ...?

Sinon, tes propriétés ne doivent pas être publiques, notamment $cache_file et $dir_cache. Il faudrait des setters, qui vérifient l'existence du répertoire et celle du fichier, et mettre les deux membres en private.

Essaie de commenter avec les règles générales de commentaires php (phpdocumentor, par exemple). Si tu postes ta classe ici, c'est que tu n'as rien contre le fait qu'elle soit utilisée par d'autres, donc il faut qu'elle soit documentée, sinon personne ne l'utilisera. Et elle sera plus facile à lire sur les forums ^^.

Pourquoi as tu utilisé des membres protégés ? Tu as prévu de faire de l'héritage ? Si non, alors passe les également en membres privés.

ViPHP
ViPHP | 5924 Messages

15 juil. 2009, 19:29

Sinon on peut utiliser du PHP2 pour faire les templates :)

ViPHP
ViPHP | 4674 Messages

15 juil. 2009, 19:38

Ahhh, l'époque du Personal Home Page O:).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Mammouth du PHP | 2937 Messages

15 juil. 2009, 21:27

Sinon on peut utiliser du PHP2 pour faire les templates :)
Et les feuilles de style XSLT dans tout ça (surtout s'il y a des données stockées dans des fichiers XML) ? ;)

ViPHP
ViPHP | 5924 Messages

15 juil. 2009, 22:11

Sinon on peut utiliser du PHP2 pour faire les templates :)
Et les feuilles de style XSLT dans tout ça (surtout s'il y a des données stockées dans des fichiers XML) ? ;)
Il faut lire Victor :)
C'était très fortement suggéré par ceci :
Un bon moteur de template utilise un parsage natif (par php) ou intégré en tant que module, donc codé de manière performante.
:)

Eléphant du PHP | 111 Messages

16 juil. 2009, 08:33

et de citer parmi les gros frameworks qui laissent le parsage natif :

- symfony
- hoa ^^
- ...

qui sont autant de frameworks adaptés au web qui pourront servir d'arguments à la non utilisation de systèmes de templates :d