FLEXIBLE TEMPLATE LANGUAGE (FTL) ? TEMPLATE PARSER EXTENSIBLE PAR PLUGINS

Signaler
Messages postés
291
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
13 mars 2015
-
Messages postés
1258
Date d'inscription
mercredi 21 mars 2001
Statut
Modérateur
Dernière intervention
21 juin 2009
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/42384-flexible-template-language-ftl-template-parser-extensible-par-plugins

Messages postés
1258
Date d'inscription
mercredi 21 mars 2001
Statut
Modérateur
Dernière intervention
21 juin 2009
2
La nouvelle version est sur le site dédié. j'ai du oublier d'uploader sur phpcs. dsl.
Pour les commentaires sur l'organisation, je suis d'accord, ce serait une bonne facon de faire. Mais j'ai codé cette class pour mes besoins perso a l'origine, et l'organisation actuelle s'adapte plus a mes besoins, etant donné que la class est intégrée dans un CMS perso.
A la limite, le code est plutot clair je pense, donc si tu vx essayer de re-organiser le fonctionnement et re-poster, ca me va.
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
17
Et où se trouve cette version ?
Manifestement, ce n'est pas celle qui est présente ici...
Messages postés
209
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
27 janvier 2008

Bonsoir,

>J'ai constaté un phénomène qui peut s'apparenter à un bug, sans que je sache si c'en est un ou pas...
>Quand on boucle sur un tableau, systématiquement, le premier élément n'est pas affiché. Bon, je pourrais regarder dans le code pourquoi, mais ma question n'est pas >comment faire pour que ce ne soit plus le cas (il suffit d'avoir un premier élément vide), mais : est-ce délibéré, ou bien est-ce un comportement non désiré ?

Ce beug est connu et appelé "First item droped". Il est corrigé dans la dernière version.

Pour le reste, je laisse à Blackwizzard le plaisir de traiter tout ça xD.

Bonne après midi.
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
17
Salut,

Je me souvenais de cette source, mais je ne m'y étais pas intéressé à l'époque... Là, je m'y intéresse, alors voilà...

J'ai constaté un phénomène qui peut s'apparenter à un bug, sans que je sache si c'en est un ou pas...

Quand on boucle sur un tableau, systématiquement, le premier élément n'est pas affiché. Bon, je pourrais regarder dans le code pourquoi, mais ma question n'est pas comment faire pour que ce ne soit plus le cas (il suffit d'avoir un premier élément vide), mais : est-ce délibéré, ou bien est-ce un comportement non désiré ?

C'est tout concernant les bugs. Concernant des remarques de tout poil, maintenant...

Je regrette qu'une instance soit associée à un fichier. Je ne trouve pas ça très... (flexible ?) souple.
Certes, on peut avoir dans un même fichier plusieurs sections, et choisir celles que l'on va afficher ou non.
Mais dans ma logique, en POO, je sépare au maximum les tâches en autant de tâches les plus élémentaires possibles. Exemple : je veux afficher des commentaires sur un article, sur une news, sur un billet de blog, sur une photo, ou sur n'importe quoi...
J'ai un template pour mes commentaires, que j'utiliserai partout : news, blogs, photos... Il me suffit de l'inclure dans le template de chaque page (directement dans le template, ou d'assigner une variable contenant le template parsé).

Avec FTL, il faut créer un deuxième objet pour le template des commentaires, et l'assigner au premier dans une variable. Ca fait 2 objets.
Ca va si j'ai que 2 templates, mais si j'en ai un pour l'entête, un pour les CSS, un pour les JS, un pour la bannière, un pour le menu, un pour les informations de l'utilisateur, un pour la pub, un pour le pied de page, un autre pour le contenu, un autre pour des commentaires... Ca commence à faire lourd...
Alors qu'avec un seul objet qui se charge de parser des fichiers qu'on lui passe en argument des méthodes appropriées... On n'a qu'un seul objet, et le reste du traitement est le même. Et je trouve que c'est plus souple.
Je ne comprends pas pourquoi tu préfères éviter d'avoir une multitude de petits fichiers... Personnellement, je trouve que d'avoir plusieurs fichiers, spécialisés, ça permet d'avoir un site très modulaire au niveau des template, et d'éviter d'avoir du code redondant, ce qui facilite la maintenance. Avoir plusieurs fichiers, s'ils sont bien rangés, c'est vraiment pas un problème...

Sinon, j'apprécie énormément le site, très clair, très détaillé : les explications sont limpides, bien ordonnées... C'est quand même bien agréable d'avoir une doc comme ça (en français qui plus est lol) quand on utilise une nouvelle classe.

Et puis j'aime quand même beaucoup l'idée d'avoir des plugins pour tout, avec juste une base qui fait le minimum.
Messages postés
209
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
27 janvier 2008

Merci,

En fait je suis un boulet : quand j'éacris ca dans le loop(); "property_value"=>$this->displayPropertyValue($id), la méthode displayPropertyValue() contient un echo... donc c'est normal que ca fasse n'importe quoi. Aucun beug à signaler donc, désolé.

Pour le if, je peut essayer de m'en occuper, à voir.
Messages postés
1258
Date d'inscription
mercredi 21 mars 2001
Statut
Modérateur
Dernière intervention
21 juin 2009
2
Sincerement, je n'en ai aucune idée!
Je n'ai aucun prob de ce type avec les boucles, et je n'ai pas touché à la fonction depuis cette correction.

Concernant les If, il faut modifier le plugin, pour definir une valeur null. Ce plugin est un peut à chier, la syntaxe de la balise est pas pratique.
Le mieux serait de le reecrire pour prendre une syntaxe genre {:if condition="myVar==NULL"}{/if} avec un parsing au niveau du plugin. C'est pas en projet pour le moment, mais je le ferai surement un jour quand j'aurai le temps.
Messages postés
209
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
27 janvier 2008

Bonsoir,

J'ai mis a jour le script et j'ai quelques questions.
Premierement, comment met-on la valeur nulle dans un {:if}? Du genre, si une variable est nulle, on n'affiche pas ce qui est entre {:if} et {/if}.
J'ai bien essayé avec {:if myVar=NULL operator="!="} mais ca ne marche pas.

Ensuite, je pense qu'en voulant corriger un beug sur les boucles (firstItemDropped), tu en as provoqué un autre : J'écris ce code dans mon PHP:
<?
$index = 0;
foreach ($this->PropertyList as $id => $property){$CSS ($index % 2 0) ? 'standRow1' : 'standRow2';$propertyLabel ($property['label'] NULL) ? $id : $property['label'];
$this->tpl_obj->loop("propertyList", array("tr_CSS"=>$CSS, "property_label"=>$propertyLabel, "property_value"=>$this->displayPropertyValue($id)));
$index++;
}
?>

et ce code dans mon .tpl :
{!loop name="propertyList"}
<tr class="%tr_CSS%">
<td class="standCell">%property_label%</td>
<td class="standCell">%property_value%</td>
</tr>
{/loop}
{!onEmptyLoop name="propertiesList"}
<tr class="standRow1">
<td colspan="2" style="color:#DD0000;" class="standCell">Pas de propriétés à afficher</td>
</tr>
{/onEmptyLoop}

et ca me produit un effet pour le moin innatendu : seule la valeur de "property_value" apparait, sans tableau ni rien et si je l'enleve du loop(); dans l'espoir de voir une autre colonne, rien n'apparait (carrément :d ).

Comment expliques-tu cela?
Messages postés
1258
Date d'inscription
mercredi 21 mars 2001
Statut
Modérateur
Dernière intervention
21 juin 2009
2
J'ai codé ça pour répondre à une besoin personnel, et mis en open-source pour potentiellement aider les gens. Du coup, le php4 me suffit, et je ne compte pas passer à php5 tant que je n'en aurait pas besoin.
Mais si l'un de vous améliore le parser, ou passe en php5, ou même si vous programmez de nouveaux plugins, envoyez moi un message, et je publierai la nouvelle version.
Messages postés
3
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
4 juin 2007

Le problèe que tu croises est assez récurrent, les notice apparaissent sur des vérifications faites sur des variables dont on n'est pas assuré de l'excistence...

si tu veux t'en débarasser, il suffit, à la ligne indiquée, d'ajouter dans la condition un !isset() || adapté ;)
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
Hello,

J'ai été conquis par ton code, et je crois que je vais l'utiliser dans mes nouveaux scripts :D
Par contre, je trouve une erreur ( error_reporting(E_ALL) )

Notice: Undefined index: section in C:\wamp\www\P\themes\parser\class.codeparser.php on line 291

J'ai beau chercher, je ne trouve pas (Il n'y a pas de variable $section ..., ni $?['section'], ...)

Sinon, je pense que ce serait pas mal de faire du Php5, et rajouter quelques vérifications (file_exists)
Messages postés
1258
Date d'inscription
mercredi 21 mars 2001
Statut
Modérateur
Dernière intervention
21 juin 2009
2
La version 3.0b est la premiere version publique en ligne.
Pour les prochaines versions, je vais mettre en ligne une newsletter et un changelog evidement.
Mais la structure du langage ne changera pas, ce ne sera que des ajouts, pas de deprecations.

Je mettrai aussi une fonction de commentaire sur les pages de la doc, pour que les gens puissent commenter et preciser, à la maniere de php.net
Messages postés
209
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
27 janvier 2008

Oui oui effectivement mon exemple était pas terrible. J'utilise un array associatif pour la boucle comme decrit dans la doc. mais le premier tour n'est jamais pris en compte.

Nikel pour les if, merci.

Peut-on etre averti par mail en cas d'update? Y a-t-il un changelog pour savoir ce qu'il faut modifier?
Messages postés
1258
Date d'inscription
mercredi 21 mars 2001
Statut
Modérateur
Dernière intervention
21 juin 2009
2
Pour les if, c'est implementé en plugin (PLUGINS/dynamics/if.php)
Utilisation:
Pour executer un code dans le cas où la variable "hello" (definie via une balise define ou une fonction addVar) est superieur ou egale à 10:
{:if hello=10 operator=">="}
code...
{/if}

La syntaxe est pas terrible, je vais surement updater le plugin. En attendant, utilisez ça.

Pour l'utilisation des loops, la fonction supporte uniquement les array non indexés de type array("variable1"=>"valeur1","variable2"=>"valeur2","variableN"=>"valeurN")

C'est donc normal que le passage d'un array à une dimention donne des resultats imprevus...
Messages postés
209
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
27 janvier 2008

J'ai trouvé le premier beug : Lorsque l'on utilise une boucle, le premier element envoyé au parser n'est jamais pris en compte. Exemple, j'ai l'array suivant que je veut afficher dans une <table/> : array("pomme", "banane", "orange"); Et bien quand j'aurai fait tout le bazar avec foreach et tout le PHP, seule "banane" et "orange" se retrouveront dans le HTML. Si on execute loop(); avec une array NULL de variable avant le foreach censé traiter l'array susmentionné (en guise d'init) et bien "pomme" apparait.
Messages postés
3
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
4 juin 2007

ça a l'air très sympa.

Je n'ai pas encore regardé le code de près, mais la doc est plutot claire, l'utilisation semble à la fois aisée est puissante (getBaliseMap doit être un bonheur)

Bref bravo, je noterai dès que j'aurai testé, ce qui ne saurai tarder :D
Messages postés
209
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
27 janvier 2008

C'est tout simplement génial!
Est-ce qu'il est prevu le support des conditions dans les templates? Peut-etre est-il déjà implémenté tu me dira, mais je n'ai pas vu comment je pouvais m'en servir.

Allé bravo, je te met 10 :)
Messages postés
1258
Date d'inscription
mercredi 21 mars 2001
Statut
Modérateur
Dernière intervention
21 juin 2009
2
oui, moi aussi je deteste ça. C'est pas assez flexible.
Je voulais creer un systeme simple et flexible, adaptable à tous les projets, extensible par plugins tres simplement.
Messages postés
209
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
27 janvier 2008

Ca m'a l'air bien cool tout ca, il faudra que je le teste. Heureusement, il n'y a pas de cache ou tout ce genre de chose (j'ai horreur des systeme de temlate avec cache).
Messages postés
291
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
13 mars 2015

ok, j'avais pas vu, ça a a l'air trè complet en plus. Merci
Messages postés
1258
Date d'inscription
mercredi 21 mars 2001
Statut
Modérateur
Dernière intervention
21 juin 2009
2
Le lien vers la doc est indiqué (http://flexible.blackwizzard.com/)
Chaque balise, chaque fonction est décrite, avec des exemples.

Va voir en particulier la page dédiée à la syntaxe et à la description (sommaire, ce n'est pas un tutorial) du processus de parsing : http://flexible.blackwizzard.com/basics/syntax
Messages postés
291
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
13 mars 2015

La présentation est séduisante, mais un peu de comentaire sur l'utilisation, et la onstitution des plugins eu été sympthique.
Je ne maitrise pas trop le PHP, et j'ai du passer quelques heures à décortiquer le code, malgré que cela semble assez abordable.
Je vais quand même tenter d'aller jusqu'au bout car ca semble correspondre à un beoin que j'avais.
Si j'ai bien compris il faut définir une balise qui commense par <!nom> et se termine par </nom>.
Je ne omprends pas pouurquoi utiliser le ! en dé&but et le / en fin, si c'est pour distinguer les balise d'un autre système, il faudrait le faire aussi sur la balise de fin, se me semble.
Par ailleurs je ne coprends pas bien comment est parser le template pour ajouter de nouvelle balise.