
Home
» Talus' Works » Talus' TPL » Rapports de Bugs » Problème clé array quand la clé est une valeur d'un autre tableau » Lecture du Sujet » Page 1 | Forum Fermé - Sujet Fermé |
|
|
|
|
Bonjour, Je suis en train de tester le moteur tpl et j'ai un petit problème. Lorsque je souhaite afficher une variable contenu dans un tableau, de base je fais ça : {VALUE,MON_ARRAY['cle']} Si ma clé est une variable, je fais ça : {VALUE,MON_ARRAY[{$MA_VARIABLE}]} Jusque là pas de problème, par contre lorsque ma clé est une variable contenu dans un autre tableau ça bug : {VALUE,MON_ARRAY[{VALUE,$AUTRE_ARRAY['cle']}]} Le message d'erreur : Parse error: syntax error, unexpected ';', expecting ']' in... La ligne qui bug dans la compilation : <?php echo $__tpl_foreach_value['MON_ARRAY'][$__tpl_foreach_value['AUTRE_ARRAY']['cle']; ?>] Le problème vient du fait que PHP est refermé trop vite : ; ?>] au lieu de ]; ?> Je ne pense pourtant pas faire d'erreur dans la syntaxe. Est-ce un bug ou moi qui bug ? Merci d'avance pour l'aide, Xavier. |
|
|
|
|
|
Oui c'est un bug, mais le problème, c'est que je vois pas comment le régler (la magie des regex)... Si tu pouvais juste trouver un autre moyen de régler ton problème.... En effet, pour les array, tout est captué jusqu'a la détection d'un ]}, et ce pour le premier array, et pas celui du milieu... Du coup, c'est rattaché au premier array, et non pas au deuxième, ce qui fausse le tout. Or, avec les regex, on ne peut pas paramétrer le fait qu"il faut aprtir du "milieu", comme ce pourrait etre le cas avec XML... Le problème est donc irrésolvable, pour le moment :/ Pourrais-tu trouver un autre moyen de faire, en attendant ? Dev' de Talus' Works |
|
|
|
|
Merci pour la réponse rapide, je m'y attendais un peu, ça m'arrange pas des masses ça va être long et chiant à contourner le problème :S N'y a t'il pas moyen de rajouter une syntaxe spécifique, style au lieu de mettre ça : {VALUE,MON_ARRAY[{VALUE,$AUTRE_ARRAY['cle']}]} Mettre ça : {VALUE,MON_ARRAY[{_VALUE,$AUTRE_ARRAY['cle']_}]} ? EDIT : Bon j'ai testé un petit truc, ça marche pas, mais je pense que je suis sur la bonne voie, voici mon test : Dans le TPL : {_VALUE,TEST[{VALUE,$BASE_ARRAY[1]}]_} Dans le PHP : $test = array(1 => 'test_1',2 => 'test_2'); Dans le compiler je rajoute : '`\{_VALUE,([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)(\[(?!]})(?:.*?)])?_}`' => '<?php echo $__tpl_foreach_value[\'$1\']$2; ?>', La compilation donne : <?php echo $__tpl_foreach_value['TEST'][$__tpl_foreach_value['BASE_ARRAY'][1]]; ?> Dans le code source HTML, aucun texte n'apparait alors qu'il devrait y avoir 'test_2', je vois pas trop pourquoi, ça a pourtant l'air de bien reprendre la syntaxe du moteur, une idée ? Dernière édition le 16/07/2009, à 15:10, par Xas |
|
|
|
|
|
Sauf que je ne peux pas déterminer quand il faut utiliser un _ ou non, c'est ca le problème... Et après, il faut aussi pouvoir faire pour les arrays de dimensions > 2, et c'est encore le même problème... Ah, qu'est-ce qu'ils me font chier ces arrays :s Dans le code php, essaye de faire un $test[$base_array[1]] pour voir ce que ca donne ? Dernière édition le 16/07/2009, à 15:38, par Talus Dev' de Talus' Works |
|
|
|
|
En fait, je viens de m'apercevoir que le texte s'affiche mais il faut que le cache contienne : <?php echo $tpl->vars['TEST'][$tpl->vars['BASE_ARRAY'][1]]; ?> au lieu de : <?php echo $__tpl_foreach_value['TEST'][$__tpl_foreach_value['BASE_ARRAY'][1]]; ?> J'ai donc mis dans le compiler : '`\{_VALUE,([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)(\[(?!]})(?:.*?)])?_}`' => '<?php echo $tpl->vars[\'$1\']$2; ?>', Ce qui donne dans le cache : <?php echo $tpl->vars['TEST'][$__tpl_foreach_value['BASE_ARRAY'][1]]; ?> Le 2ème array contient toujours $__tpl_foreach_value et non pas par $tpl->vars. J'ai tenté : {_VALUE,TEST[{$BASE_ARRAY[1]}]_} et là, magique ça marche :) Si je comprends bien pour afficher une variable d'un tableau il faut utiliser la syntaxe : {VALUE,TEST['cle']} Ca reste du bricolage car comme tu le dis pour les dimensions supérieurs à 2 ça ne marchera pas mais bon pour l'instant ça me va, je chercherais une solution plus propre quand j'aurais un peu de temps. Dernière édition le 16/07/2009, à 18:04, par Xas |
|
|
|
|
|
Ah mais en fait tu confonds, je pense, sur l'emploi de KEY & VALUE : ce sont pour les itérations des foreach, pas pour les arrays... KEY correspond à l'itération, et VALUE sa valeur. Un peu comme ici :
Code PHP
<?php
Alors que pour accéder à une clé d'un array, tu peux toujours faire {VAR['clé']}, tout comme tu peux faire {VAR[{$VAR2[{$VAR3}]}]} (je crois :p). Alors que pour VALUE, etc, je crois que ca peut se compliquer... Dev' de Talus' Works |
|
|
|
|
Ouai, je m'étais embrouillé car mon problème était à la base dans un foreach, maintenant tout est ok, le bug est bricolé, tout marche nikel. |
|
|
|
|
|
Sinon je viens de penser à un petit subterfuge :
Code TPL
<function name="multidim" arg="ARY">{ARY}</function>
<foreach ary="{$ARY}">
<call name="multidim" arg="{VALUE,$ARY[{VALUE,$BASE}]}" />
</foreach>
Au lieu de s'emmerder à créer un autre symbole... :) Dev' de Talus' Works |
|
|
|
|
Ouep, je confirme ça marche nikel ! Edit : Juste un petit problème, ça rajoute un espace juste après le texte que ça écrit, c'est un peu chiant par ex quand on veux s'en servir pour définir le nom d'une image : image .jpg au lieu de image.jpg, rien de bien méchant suffit d'envoyer la fin du texte dans la même fonction mais je le signale au passage ;) Dernière édition le 19/07/2009, à 13:51, par Xas |
|
|
|
|
|
Ca donne quoi en compilé ce que je t'ai donné ? Tiens, dans une prochaine version, je peux essayer de donner la possibilité d'utiliser un filtre sur une fonction, ca pourrait être pas mal je pense... Comme ca, on pourra genre appliquer un filtre "trim" :) Dernière édition le 19/07/2009, à 14:18, par Talus Dev' de Talus' Works |
|
|
|
|
Dans la compilation, l'espace est rajouté après la fermeture du PHP : "?> " Ca donne un truc dans le genre : On peut bien rajouter autant de sous array que l'on souhaite. |
|
|
|
|
|
Ok trouvé. Voici la correction (pour la 1.6.0) : Talus_TPL_Compile : CHERCHER, LIGNE 238 :
Code PHP
<?php //...
Talus_TPL_Compile : REMPLACER, PAR :
Code PHP
<?php //...
Ca devrait faire l'affaire. Recharge ton cache une fois que t'as fait la modif :) Dev' de Talus' Works |
| Forum Fermé - Sujet Fermé |