Votre avis sur mon système de templates

Comment trouvez-vous le script LambdaTemplates ?

Vous pouvez sélectionner 1 option
 
 
Voir les résultats
Eléphant du PHP | 199 Messages

17 mai 2007, 22:32

Bonjour,

Je viens de terminer mes tests sur mon nouveau système de gestion de templates, que j'ai appelé LambdaTemplates.

C'est mon premier vrai script en PHP5, il s'inscrit dans le cadre d'un ensemble de scripts PHP5 complémentaires que je compte développé après le BAC pour faciliter mes futurs créations de sites web.

Comme c'est un premier essai, il y a surement des imperfections à corriger, c'est pourquoi je vous demande votre avis de programmeurs(euses) avisé(e)s ;)

Les fonctions gérées :
- définition de variables utilisateurs utilisables dans les templates
- conditions if, elseif et else
- includes en cascade (récursivité) dans les templates
- boucles foreach et for

Les trois derniers point peuvent être désactivés pour optimiser le temps de parsing (dans le cas de templates simples).

Le script gère aussi un système de cache avec ou sans compression des données. La compression est réalisée avec la fonction gcompress au niveau 9 et, pour de très gros templates, peut diviser la taille du fichier de cache par 100, sans ralentir excessivement le script (j'ai fait quelques benchmarks pour comparer les temps d'exécution et la configuration "cache activé, compression activée, toutes options activées" se débrouille plutôt bien). Le script permet aussi de récupérer le temps de parsing via une méthode publique.

Le script est disponible ici, avec un fichier d'exemple : http://www.klomac.net/LambdaTemplates.zip

Merci d'avance et bonne continuation à vous :)
Klomac - Blog Lambda

Eléphant du PHP | 199 Messages

19 mai 2007, 14:26

Personne pour tester ? :)
Klomac - Blog Lambda

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

19 mai 2007, 17:32

Comme j'imagine que tu as fait ça par jeu pédagogique (les systèmes de templates sont déjà tellement nombreux qu'il est inutile d'en faire de nouveau), je vais te présenter une méthode de template qu'on oublie beaucoup trop souvent : PHP.
Pas besoin d'aller bien loin pour faire un moteur de template, PHP en est déjà un lui-même. Donc include() fera un très bon analyseur de template :lol: Pour faire «propre», ou plutôt pour s'assurer de ne pas mélanger les contextes d'exécution, on va faire un «wrappeur» de l'include sous forme d'objet, qui ne transmettra au fichier inclus que les variables que l'on aura définies (à coups de set())..

L'exercice n'est pas mauvais pour faire de l'héritage, manipuler les fonctions magiques, et autres joyeusetés de l'objet PHP5.

BasicTemplate
class BasicTemplate {

	private $__vars = array();

    function __construct() {
    }
    
    function __set($varname, $value)
    {
    	$this->__vars[$varname] = $value;
    }
    
    function __get($varname)
    {
    	return $this->__vars[$varname];
    }

	function render($filename, $output = null)
	{
		if ($output !== null) {
			ob_start();
		}
		include $filename;
		if ($output !== null) {
			$contents = ob_get_contents();
			ob_end_clean();
		}
	}

}
Exemple de template :

Code : Tout sélectionner

Mon nom est : <?php echo $nom; ?>. Mes passions : <?php foreach ($passions as $passion): ?> - <?php echo $passion; ?><?php endforeach; ?>
Le code qui va avec :
$tpl = new BasicTemplate;
$tpl->nom = 'Jacques';
$tpl->passions = array('Bière', 'Vaches', 'Pouvoir');
$tpl->render('test.tpl');
On peut bien sûr ajouter la mise en cache et la compression gzip en étendant la classe pour ajouter les 2-3 fonctions qui feront ça, et en surchargeant render().
Ensuite tu peux définir un autre langage de template en étendant à nouveau ta classe, et tu feras la conversion dans ta fonction render() à nouveau surchargée.

Un bon exercice :)

Eléphant du PHP | 199 Messages

20 mai 2007, 12:06

Je suppose qu'avec ce système on optimise le temps d'exécution ?
Klomac - Blog Lambda

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

20 mai 2007, 17:18

Ben on ne peut pas faire plus rapide en fait, la seule méthode plus rapide serait un simple include sans wrapper pour les variables. On ne rajoute pas une surcouche bien souvent inutile.

C'est le système choisi par Joomla par exemple.

Eléphant du PHP | 199 Messages

20 mai 2007, 18:51

Je vais réfléchir un peu à ça ;) Merci ;)
Klomac - Blog Lambda

Eléphant du PHP | 199 Messages

20 mai 2007, 21:44

Cela m'amène à me poser une question : si je crée une méthode 'parseCode' et que j'indique 'parseCode' en fonction de callback à ob_start, ma méthode va-t-elle être appelée ou est-ce que PHP ira chercher une fonction classique appelée 'parseCode' ?
Klomac - Blog Lambda

Mammouth du PHP | 505 Messages

20 mai 2007, 23:30

Si tu veux utiliser une methode pour une fonction de callback, et c'est valable partout en php, il te faut spécifier un tableau avec au choix
- l'instance, et la methode
- le nom de la class, et la methode qui devra etre static

Eléphant du PHP | 199 Messages

21 mai 2007, 20:17

Merci bien :)

Après réflexion je pense que je vais diviser ça en plusieurs classes :
- une classe basique dans l'esprit de ce que naholyr m'a proposé
- une classe à part qui gèrera la mise en cache (ou le renvoi du fichier cache) et la compression gz
- une classe étendue de la première qui sera dite "économique" dans le sens où elle ne proposera que les fonctions de la première mais avec utiliser de la mise en cache et de la compression gz en plus (via l'autre classe)
- une seconde classe étendue qui proposera toutes les fonctionnalités à savoir la gestion d'un langage de templates particulier, la mesure du temps de parsing, la mise en cache et la compression

Ca me permettra de moduler selon mes usages, et puis ça me fera les doigts ^^
Klomac - Blog Lambda

Eléphant du PHP | 199 Messages

26 mai 2007, 21:53

Ainsi fut dit, ainsi fut fait :)

http://www.klomac.net/LambdaSystem.zip

S'il y en a qui ont le courage de lire un peu mon code, j'attends vos avis :)

naholyr je suppose que c'est une ensemble de classes dans cet esprit que tu me conseillais ?

J'avoue que la troisième classe de templates est un peu useless mais bon c'était pour le fun ;)
Klomac - Blog Lambda