Après pleins d'autes zéros qui avaient postés leur classe de template, voici la mienne ! (j'en vois un déjà qui va criser : "php est déjà un système de template, blablabla", mais là c'est pas "inutile" ^^)
Comme vous pouvez le voir, elle ne ressemble à aucune autre, mais en 72 lignes de codes (en enlevant les commentaires), elle gère les variables, blocs, et blocs infinis (sisi, je vous jure).
Quand je dis : "elle ne ressemble à aucune autre", c'est surtout dans son utilisation en fait, qui est atypique. Regardez plutot l'exemple à la fin (désolé, mon anglais est horrible :s) :
<?php
// +----------------------------------------------------------------------+ // | Copyright (c) Savageman 2006 | // +----------------------------------------------------------------------+ // | Classe de gestion des templates. | // | | // | Veuillez me mailer pour toute suggestion ou amélioration à propos de | // | ce script. Merci! | // +----------------------------------------------------------------------+ // | Author : Savageman <savageman86@yahoo.fr> | // | Original : Savageman <savageman86@yahoo.fr> | // | PHP Version : PHP 5 | // | Created on : July 10, 2006 | // | Last modified : July 10, 2006 | // +----------------------------------------------------------------------+
/**
* How does it works ?
*
* 1. Load a template file (by calling the constructor).
* 2. Assign vars to the template (by calling the <replace> method).
* 3. You can make template as a block by calling the <next> method : you will be able to assign others vars to the template (without losing the precedent assignation).
* 4. You can "continuate" (sorry, continue is a reserved keyword :s) which consist in insertion of text at the position of the continuation tag.
* 5. You can assign the continuation tag by calling the <set_continuation> method.
* 6. Once finished, call the <get> method to have the result returned (you can print it or insert it in a new template thanks to the continuation tag).
*
* 7. Hope you enjoy it (-:
*
*/
class Template {
/**
* Publics vars
*/
public $delimitors = array();
public $continuation_tag;
/**
* Privates vars
*/
private $_template; // Original template
private $_current_text; // Current occurence of the parsed template
private $_final_text = array(); // Parsed template
/**
* Constructor
*/
public function __construct($filename = null, $vars = null){ if(!empty($filename)){ $this->load($filename); } if(!empty($vars)){ $this->replace($vars); } returntrue; }
public function set_continuation(){ $this->_final_text[] = $this->get_continuation_tag(); returntrue; }
public function get(){ returnpreg_replace('`\s*'.preg_quote($this->delimitors['begin']).'.*?'.preg_quote($this->delimitors['end']).'`', '', implode("\n", $this->_final_text)); }
/**
* Privates methods
*/
private function callback_var($varname){ return$this->delimitors['begin'].$varname.$this->delimitors['end']; }
private function get_continuation_tag(){ return$this->continuation_tag; } }
/**
* Example
*/
// Main template $main_view = new template('xhtml1.tpl');
$main_view->replace(array('title'=>'Titre de ma page', 'author' => 'Moi :D'));
// Another template $news_view = new template('news.tpl');
$news_view->replace(array('news.titre'=>'titre 1', 'news.texte' => 'texte 1')); $news_view->next(); $news_view->replace(array('news.titre'=>'titre 2', 'news.texte' => 'texte 2')); $news_view->next(); //$news_view->set_continuation(); // Optional (non needed if you have nothing to insert)
// We put the parsed news template in the main template (note that if we set the continuation tag, we should insert other parsed template in the main template) $main_view->continuate($news_view->get());
// Be sure to ALWAYS call the <next> method before to call the <get> method $main_view->next(); echo$main_view->get();
?>
J'attend des remarques et commentaires
[edit] les templates :
xhtml1.tpl :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Bah en fait, une instance, c'est un bloc (ou c'est pas un bloc si tu ne veux pas que ça soit un bloc)
Dans l'exemple, c'est
"$news_view = new template('news.tpl');".
Puis en utilisant next(), tu peux répéter ce template (news.tpl ici) autant de fois que tu veux, mais avec des variables (des valeurs) différentes.
Ensuite, tu le parses et tu l'insères dans un autre (grâce au tag continuation, c'est un peu compliqué à comprendre quand on a pas créé le truc, même si j'ai essayé de l'expliquer en anglais dans les commentaires.
Ca me fait penser : il manque les fichiers .tpl, je vais les rajouter dans mon premier message.
[edit]
Citation : Bison
How does it works ?
Moi je veux juste savoir pourquoi ça "parles anglais" dans ce truc ?
Heu, c'est pour la distibution, l'international, toussa quoi. Mais bon, vu mon niveau d'anglais, je le ferai corriger avant, c'est certain !
J'ai pas dit que ça "parsait" des bloc, mais que ca *gérait* les blocs, c'est assez différent...
Mon script ne parse effetivement que les variables.
Sinon j'ai mis les .tpl, comme ça vous pouvez le tester en live cherz vous (PHP 5 requis)
J'ai testé ....
Mais une classe qui gère uniquement les variables j'ai ça en une trentaine de lignes ( et encore c'est beaucoup )
Jcherche toujours une class Simple Qui montre comment parser des blocs ( pour affichage multiple, ... ) Si quelqu'un pouvait me donner un exemple ou même l'idée ... merci
Je connais ces classes mais le simple est pas inclus là sauf peut-être sur celle de bluestorm
EDIT : Enfin il n'y en a aucune qui soit assez simple a comprendre si on l'a pas codée et qui puisse s'integrer facilement dans ma classe de template ( c'est surtout pour les boucles ( un système de news par ex ) que je bloque )
Oué, bah la mienne est simple, et me permet de gérer efficacement les blocks et variables et d'obtenir une bonne indetation dans le code final (html) : tout ce qu'il y a besoin.
Vu la façon dont c'est géré, ca ne doit franchement pas ralentir le script, et ca permet un certain confort d'utilisation !
J'ai rien d'aute pour toi, désolé...
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.