Problème avec une classe template maison ( boucles / block )
Posté : 13 juin 2009, 12:42
EDIT : plus ou moins résolu
Si quelqun répond au topic je pourrais donner la solution que j'ai trouvé ( qui n'est pas encore satisfaisante mais plus propre déjà )... Je vais pas faire encore un edit de 36 lignes ça commence à être illisible
Bonjour,
J'ai voulu essayer de faire ma propre classe template avec mes modestes connaissances et comme je l'imaginait c'est pas de la tarte. Pour l'instant j'en suis à gérer des variables simples et des blocks.
J'ai quelquechose de pas logique dans ma classe entre la variable qui contient la source html de base et celle qui contient le contenu parsé. Une histoire de concaténation ou d'utilisation de la mauvaise variable.
Je vous laisse regarder le code final, vous vosu apercevrez qu'au niveau du block il y a un joyeux mic-mac.
Je m'y perd un peu, si quelqun pouvait éclairer ma lanterne...
Code PHP :
Code de sortie renvoyé par la méthode tpl_display :
EDIT
J'ai trouvé les 2 erreurs principales et apporté des corrections :
- J'utilisais bizarrement à chaque fois le fichier source, donc je passais un peu dans le vide
- Mais surtout il manquait une variable temporaire dans la méthode tpl_block, et un remplacement de tout le block par le contenu temporaire uniquement à la fin de la boucle.
Seulement communiquer le $i à cette méthode est un peu byzar. Je ne sais pas trop comment faire autrement mais dans l'idée c'est ce que j'ai mis en gras dans le code ( edit : le gras dans le code ça marche pas donc c'est ce qui est entouré par les balises bb ) qu'il faut tourner autrement... mais comment ?
Sinon cette méthode temporaire marche
Si quelqun répond au topic je pourrais donner la solution que j'ai trouvé ( qui n'est pas encore satisfaisante mais plus propre déjà )... Je vais pas faire encore un edit de 36 lignes ça commence à être illisible
Bonjour,
J'ai voulu essayer de faire ma propre classe template avec mes modestes connaissances et comme je l'imaginait c'est pas de la tarte. Pour l'instant j'en suis à gérer des variables simples et des blocks.
J'ai quelquechose de pas logique dans ma classe entre la variable qui contient la source html de base et celle qui contient le contenu parsé. Une histoire de concaténation ou d'utilisation de la mauvaise variable.
Je vous laisse regarder le code final, vous vosu apercevrez qu'au niveau du block il y a un joyeux mic-mac.
Je m'y perd un peu, si quelqun pouvait éclairer ma lanterne...
Code PHP :
<?php
class tpl{
public $html_input;
public $html_output;
public function __construct($html_source){
$this->html_input = file_get_contents($html_source);
$this->html_output = '';
}
public function tpl_array($var){
foreach($var as $k=>$v){
$recherche[] = '#{'.$k.'}#Us';
$remplace[] = $v;
}
$this->html_output .= preg_replace($recherche, $remplace, $this->html_input);
}
public function tpl_block($block, $var){
preg_match('#{BEGIN BLOCK '.$block.'}(.*){END BLOCK '.$block.'}#Us', $this->html_input, $matches);
$contenu_block = $matches[1];
foreach($var as $k=>$v){
$recherche[] = '#{'.$block.'.'.$k.'}#Us';
$remplace[] = $v;
}
$this->html_output .= preg_replace($recherche, $remplace, $contenu_block);
}
public function tpl_display(){
echo $this->html_output;
}
}
// construction de l'objet ( @ param source HTML )
$tpl = new tpl('test.html');
// parssage simple ( @ param array )
$var = array('TEST' => 'test');
$tpl->tpl_array($var);
// parssage block ( @ param nom du block, array )
for($i=0; $i<4; $i++){
$var = array('NUM' => $i);
$tpl->tpl_block('MA_BOUCLE', $var);
}
// affichage
$tpl->tpl_display();
?>
Code HTML du fichier :Code : Tout sélectionner
<p>{TEST}</p>
<ul>
{BEGIN BLOCK MA_BOUCLE}
<li>{MA_BOUCLE.NUM}</li>
{END BLOCK MA_BOUCLE}
</ul>
Code : Tout sélectionner
<p>test</p>
<ul>
{BEGIN BLOCK MA_BOUCLE}
<li>{MA_BOUCLE.NUM}</li>
{END BLOCK MA_BOUCLE}
</ul>
<li>0</li>
<li>1</li>
<li>2</li>
<li>3</li>
EDIT
J'ai trouvé les 2 erreurs principales et apporté des corrections :
- J'utilisais bizarrement à chaque fois le fichier source, donc je passais un peu dans le vide
- Mais surtout il manquait une variable temporaire dans la méthode tpl_block, et un remplacement de tout le block par le contenu temporaire uniquement à la fin de la boucle.
Seulement communiquer le $i à cette méthode est un peu byzar. Je ne sais pas trop comment faire autrement mais dans l'idée c'est ce que j'ai mis en gras dans le code ( edit : le gras dans le code ça marche pas donc c'est ce qui est entouré par les balises bb ) qu'il faut tourner autrement... mais comment ?
Sinon cette méthode temporaire marche
<?php
class tpl{
public $html_input;
public $html_output;
public $html;
public $temp;
public function __construct($html_source){
$this->html_input = file_get_contents($html_source);
$this->html_output = '';
$this->html = file_get_contents($html_source);
$this->temp = '';
}
public function tpl_array($var){
foreach($var as $k=>$v){
$recherche[] = '#{'.$k.'}#Us';
$remplace[] = $v;
}
//$this->html_output .= preg_replace($recherche, $remplace, $this->html_input);
$this->html = preg_replace($recherche, $remplace, $this->html);
}
public function tpl_block($block, $var, [b]$i[/b]){
preg_match('#{BEGIN BLOCK '.$block.'}(.*){END BLOCK '.$block.'}#Us', $this->html_input, $matches);
//print_r($matches);
$contenu_block = $matches[1];
foreach($var as $k=>$v){
$recherche[] = '#{'.$block.'.'.$k.'}#Us';
$remplace[] = $v;
}
$this->temp .= preg_replace($recherche, $remplace, $contenu_block);
[b]if($i == 3)[/b] $this->html = preg_replace('#{BEGIN BLOCK '.$block.'}(.*){END BLOCK '.$block.'}#Us', $this->temp, $this->html);
}
public function tpl_display(){
//echo $this->html_output;
echo $this->html;
}
}
// construction de l'objet ( @ param source HTML )
$tpl = new tpl('test.html');
// parssage simple ( @ param array )
$var = array(
'TEST' => 'test',
'TEST2' => 'test2',
);
$tpl->tpl_array($var);
// parssage block ( @ param nom du block, array )
for($i=0; $i<4; $i++){
$var = array('NUM' => $i);
[b]$tpl->tpl_block('MA_BOUCLE', $var, $i);[/b]
}
// affichage
$tpl->tpl_display();
?>