Aide - Recherche - Membres - Calendrier
Version complète : Phtpl -- Classe Php
La Communauté TitaXium > Service Communication > Espace Developpement
Antoine_935
Je vous avais dit il y a quelque temps que je travaillais sur mon propre moteur de template.
le voila. je vous invite à m'aider à l'améliorer.
Si, par exemple, vous trouvez une variable superflues, ou que vous trouvez que l'intégration d'une fonction serait utile, n'hésitez pas wink.gif


Cette classe prend en entrée un fichier template avec des balises comme {header}, {content}, etc...
le nom vient de PHTP et TPL (template) => PHTPL
Code
<?php
/*
PHTPL 1.0
---------
Templating class, programmed by Antoine d'Otreppe -- Antoine_935
For further informations, please visit http://www.phtp.be
---
Classe de gestion de template par Antoine d'Otreppe -- Antoine_935
Pour plus d'infos, visitez http://www.phtp.be
*/
class phtpl {
    var $container = FALSE;
    var $rendered = FALSE;
    var $template = FALSE;
    
    function render() {
 $file = fopen($this->template, 'r');
 $this->rendered = fread($file, filesize($this->template));
 fclose($file);
 foreach($this->container as $key=>$value) {
     $this->rendered = str_replace($key, $value, $this->rendered);
 }
 return $this->rendered;
    }
    function setkey($key, $value) {
 $this->container['{'.$key.'}'] = $value;
    }
    function unsetkey($key) {
 unset($this->container['{'.$key.'}']);
    }
    function getkeys() {
 $keys = $this->noextrem(array_keys($this->container));
 return $keys;
    }
    function gatvalues() {
 $values = array_values($this->container);
 return $values;
    }
    function noextrem($array) {
 while(list($key, $item) = each($array)) {
     $array[$key] = substr($item, 1, strlen($item)-2);
 }
 return $array;
    }
    function saveinto($path) {
 if(!$this->rendered) return FALSE;
 if($file = @fopen($path, 'w')) {
     if(@fwrite($file, $this->rendered)) {
   fclose($file);
   return TRUE;
     }
 }
 return FALSE;
    }
    function parse_db($ressource, $html, $reverse = FALSE) {
 $return = "";
 //while($item = pg_fetch_array($ressource)) {
 while($item = mysql_fetch_array($ressource)) {
     $newhtml = $html;
     foreach($item as $key=>$value) {
   $newhtml = str_replace('{'.$key.'}', $value, $newhtml);
     }
     if(!$reverse) $return .= $newhtml;
     else $return = $newhtml . $return;
 }
 return $return;
    }
}
?>
elf
Mais vous avez vraiment la manie de venire juste après mes scripts open source que je diffuse ici et de refaire exactement la même chose!!!

Après le formulaire de contact c'est la classe de gestion de template?
Omsalam
Citation (SeoxyS @ vendredi 23 septembre 2005 à 16h56)
Mais vous avez vraiment la manie de venire juste après mes scripts open source que je diffuse ici et de refaire exactement la même chose!!!

Après le formulaire de contact c'est la classe de gestion de template?
*



Personnelement je pense que tu es loin d'etre une reference, donc "refaire excatement la même chose" n'est pas un très bonne idée.
De plus "open source" tu sait ce que cela veut dire hein ...


Sinon n'etant pas particulierement fan des templates je ne peur pas vraiment te conseillé sur ta class, a part bien sur d'ajouter les boucle c'est le minimun smile.gif

Je voudrais juste te parler justement des moteurs des templates.
Les moteurs de template c'est reinveinté la roue, c'est quelque chose que tu as deja en faite car php est en lui même un moteur de template.
C'est lourd, necessite des ressources, ca complique bien beaucoup je trouve par rapport a ce que l'on obtient.

Enfin bref ce n'est pas pour te decouragé, au contraire je t'invite à poursuivre cette classe pour progressé en php mais c'est juste pour t'informé.

A + smile.gif
Antoine_935
Je ne te permets pas d'insinuer que je fais la meme chose que toi !
j'avais lancé le prototype de mon moteur il y a +/- une semaine, je publie le résultat aujourd'hui pour l'améliorer.

On peut aussi di re que c'est toi qui m'as copié en publiant le tien !
Antoine_935
Citation (Omsalam @ vendredi 23 septembre 2005 à 17h05)
Je voudrais juste te parler justement des moteurs des templates.
Les moteurs de template c'est reinveinté la roue, c'est quelque chose que tu as deja en faite car php est en lui même un moteur de template.
C'est lourd, necessite des ressources, ca complique bien beaucoup je trouve par rapport a ce que l'on obtient.
*


Sorry pour le double post.

C'est en effet un moyen de réinventer la roue, mais ca peut fort simplifier les choses, car cela permet de ne pas devoir insrérer le code dans le template mais plutot le template dans le code (on se comprend, hein :/ )
de plus, il me resservira pour mon projet PHTP.

Mais je suis entièrement d'accord avec toi que c'est gourmand en ressources smile.gif
Digwele
lol ! Qui voudrait copier SeoxyS le plus sérieusement du monre *-) ?
Antoine_935
laugh.gif

de toute facon, mon moteur intègre des fonctions en plus, et je mettrais ma mian a coupe qu'il est plus rapide smile.gif
et je le prouve :

la manière seoxis :
Code
function ParseWithText($text){
foreach($this->parsArr as $key => $value ){
$result = str_replace('<s-'.$key.'-s>', $value, $text);
}
return $text;
}

= une vilaine boucle qui prend du temps.

ma manière :
Code
function render() {
$file = fopen($this->template, 'r');
$html = fread($file, filesize($this->template));
fclose($file);
$this->rendered = strtr($html, $this->container);
return $this->rendered;
}


les trois premières lignes ouvrent et lisent le template, et une seule fonction suffit à tout modifier.
Xtouch
Citation (Digwele @ vendredi 23 septembre 2005 à 18h22)
lol ! Qui voudrait copier SeoxyS le plus sérieusement du monre *-) ?
*

Digwele, une fois de plus, ta remarque est inutile, voire blessante. Toujours envers la même personne. Je ne suis pas pour la lapidation en public, si tu as des différents, tu les règles par message privé. Si cela doit continuer, j'en toucherais un mot à TitaX, ce n'est pas normal de voir de telles remarques plomber l'ambiance.


SeoxyS, Antoine_935 avait en effet demandé de l'aide sur sa classe avant que tu nous parles de la tienne. C'est sa demande d'aide qui a engendré l'ajout de ton script. Alors bon, du calme wink.gif


Et puis personnellement, je ne suis pas contre plusieurs scripts traitants du même sujet, cela permet de comparer les méthodes, et de prendre que le bon dans les scripts wink.gif

edit : je t'ai grillé m0g wink.gif
mOg
Citation (SeoxyS @ vendredi 23 septembre 2005 à 17h56)
Mais vous avez vraiment la manie de venire juste après mes scripts open source que je diffuse ici et de refaire exactement la même chose!!!

Après le formulaire de contact c'est la classe de gestion de template?
*


Premièrement Antoine avait demandé de l'aide sur un début de classe pour les templates avant ton post sur ta classe STML.

Deuxièmement je t'invite à relire ce sujet : http://www.titaxium.com/forum/index.php?showtopic=13344

C'est la dernière fois j'espère que le staff doit vous le rappelez et cela vaut également pour les personnes qui en rajoute.

Merci.
Antoine_935
Bon, pour en revenir au sujet de base.

Que pourrais-je faire pour l'améliorer ?
Digwele
C'est pas mal ^^

Histoire que l'on puisse mieux visualiser et t'aider, tu pourrais nous montrer une exemple de template vierge. Et puis je n'ai pas trouvé de fonction de copie. Je pense que la principale utilité d'un template est de créer des pages à la vollée, il faudrait donc créer une méthode pour copier les nouvelle pages dans un dossier spécifique =). Sinon, peut-être mettre en place un générateur de feuilles de style qui irait de paire avec cette classe-ci smile.gif.

En tout cas, je pourrais t'en dire plus en voyant ton template vierge smile.gif.

Sinon désolé pour le staff développement, j'le ref'rais plus -_- Je me repentis mais avouer que quelques sanctions envers la personne de SeoxyS ne feraient de mal à personne :°
Antoine_935
le template de base :
http://phtp.be/titaxium/template/template.phtpl
le résultat ( css à retravailler)
http://phtp.be/titaxium/

je travaille dès mnt sur une fonction qui renregistrerait la page générée, mais je ne concois pas bien comme je pourrais faire un générateur de css. le css va de paire avec le template. je ne comprends pas, mais ca a l'air intéressant. peut tu m'expliquer ce à quoi tu penses ?
Antoine_935
voila, j'ai ajouté la fonction dans le code.
je vais la tester de suite, mais il n'y a pas de raison que ca ne marche pas

EDIT : bon, la fonction marche, mnt il faut que je puisse réutiliser les pages générées et sauvegardées smile.gif
RE-EDIT : Merci bcp digwele, grace a toi, je viens de gagner 1/3 du temps pour générer une page biggrin.gif
RE-RE-EDIT : va quand meme falloir que j'approfondisse un peu...
elf
Attandez...

Si il veut publier une classe sur les templates je ne pouvais pas le savoir, je savais qu'il en fesais une. Et? Le problème? Ma classe étais terminée avant que la sienne soit commencée. J'ai aps dit plagiat... j'ai dit publier la même chose juste après moi. Et on peut encore moins dire que je l'ai copié. J'ai juste pensé a la publier quand il a parlé de son bug.

Ensuite est-ce que j'ai dit que je fesais mieux que lui ou que j'étais une référence.

Tout ce que je sors de ce la est que il y a des coincidances, comme publier la même chose en même temps.

Ah oui comme xtouche a quoté digwele (la seule manière pour moi de voir ses messages est de voir les quotes) je peux juste ajouter que mon scripte marche à merveille, et si personne veux me copier tant mieux pour moi.
Antoine_935
Bon, encore merci digwele pour ta super idée, le système de cache marche à merveille !
K-jasi
Tu devrais peut-être essayer d'intégrer un système de blocs qui se répetent. De plus, quelques fonctions intégrées aux templates sont parfois utiles, comme par exemple la possibilité d'utiliser des conditions simples (if, else,...) (attention tout de même aux performances).

Je tiens également à te prévenir sur le fait que la fonction strtr est extrêmement lente par rapport à str_replace. Voir ici pour un benchmark... Vu que str_replace accepte les tableaux en argument, tu peux t'en servir très facilement wink.gif

Bonne continuation.

PS: J'ai moi aussi fait mon moteur de templates pour Connectix Boards, mais je me suis bien vite rendu compte que ce n'est pas toujours très utile de vouloir à tout prix créer quelque chose qui existe déja en beaucoup plus performant. Conclusion: je transforme tout pour utiliser Smarty, un moteur innovant qui a fait ses preuves... Il faut donc parfois un peu se poser des questions avant de se lancer tête baissée dans un truc qui n'est pas forcément utile wink.gif (je ne veux pas te décourager, rassure toi).
Antoine_935
Bon, ej viens de tester de fond en comble le remplacement se strtr par str_replace, et ca cause un bug bizarre lorsqu'on utilise les tableaux.
C'est simple : il me met tout à la place de tout...
Par contre, quand on fait une boucle foreach avec un tableau, ca marche sans problème. reste a vérifier si c'est réellement plus rapide. ca devrait l'etre, si l'on en croit l'article dont tu as donné l'adresse.

En réponse à ton Post Scriptum, je dirai que j'ai horreur d'utiliser le code des autres car il me manque toujours l'une ou l'autre fonction, et que ca me permet de faire un code optimisé pour mon utilisation à moi. C'est donc plus simple à utiliser, meme si ce n'est pas aussi performant qu'un grand comme smarty ou fasttemplate smile.gif

Par contre, je n'ai pas compris ton histoire de blocs qui se répètent...
K-jasi
En effet, chacun son point de vue, mais ayant eu ma propre expérience en ce domaine que sont les templates, il me semblait utile d'en faire part.

str_replace ne s'utilise pas exactement comme strtr et n'a pas exactement le même comportement. Regarde attentivement dans la doc de quoi il retourne, ca répondra peut-être à tes interrogations.

Les blocs qui se répetent, c'est par exemple les messages d'un forum, des news, ou toute autre chose qui fait qu'un morceau de template est utilisé plusieurs fois dans la même page. Ca peut etre utile d'avoir une fonction qui gère ca dans ta classe.
Antoine_935
ah, si j'ai bien compri, tu parles des blocs qui se retrouvent identiques sur de nombreuses pages ?
C'est une bonne idée, et j'y travaillerai ! merci !
K-jasi
Non, en fait je voulais parler de ceux qui se retrouvent plusieurs fois sur la même page (comme les messages sur ce forum).
Antoine_935
ah, oui
donc, ne pas mettre deux fois la meme chose sur la page ?
donc, dans le cas de ce forum, ne pas répéter 100 * le meme message.

j'y penserai aussi, mais j'ai trouvé un système bcp plus pratique, mais qui n'utilise pas le moteur de tempalte, pour cause de légèreté.
Antoine_935
Voila, j'ai ajouté la fonction en question : parse_db($ressource_db, $template[, $reverse])
il prend en entrée une ressource mysql ou pgsql (pour le moment du moins), le mini-template avec lequel parser, et éventuellement la variable $reverse (False par défaut).

Si votre table contient 'name' et 'ip', et votre template '{name}' et '{ip}', tant qu'il pourra obtenir des données avec la ressource de la base de données, il va répéter le template en insérant a chaque fois les données.

Si $reverse n'a pas de valeur, il mettra chaque partie de template après le code déja généré.
si c'est TRUE, il la mettra avant le code déja généré.

Voila, j'espère que mon explication a été claire.

Qu'en pensez vous ?
Hikawa
Citation (SeoxyS @ vendredi 23 septembre 2005 à 16h56)
Mais vous avez vraiment la manie de venire juste après mes scripts open source que je diffuse ici et de refaire exactement la même chose!!!

Après le formulaire de contact c'est la classe de gestion de template?
*

Il existe diverses façons d'aborder un même sujet, tout comme il existe diverses façons de coder pour un même résultat, alors c'est pas la peine de venir critiquer le fait que tu ne sois pas le seul à vouloir coder tel ou tel système.

Tu dis que tu ne parle pas de plagiat, mais c'est ce que tu fais en parlant de "similitudes" ou en disant que ton code était fini avant même qu'il commence le sien, qu'en sais-tu?

De plus, au final son code diffère malgré tout du tien, alors quand bien même il y aurait des similitudes, elles ne seraient dû qu'au hasard... C'est presque obligatoire de retrouver certaines lignes de codes dans deux scripts dès l'instant où ils abordent une même fonction, non?

En espérant n'avoir vexé personne. wink.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2010 Invision Power Services, Inc.