[spip-dev] Formulaire: «<?php» échappé dans une boucle DATA. Bug ?

Bonjour,

Je rencontre avec SPIP 3(.0.13 et même .0.14-dev SVN [21004]) un drôle
de problème.

La boucle suivante:

<BOUCLE_Foreach(DATA){liste 2,3}>
[(#VALEUR|oui)
<div class="ajax">
    #FORMULAIRE_EDITER_DOCUMENT{#VALEUR}
</div>
]
</BOUCLE_Foreach>

ne retourne pas le formulaire en HTML, mais le php du formulaire, avec
le premier chevron du «<?php» échappé:

<div class="ajax">
&lt;?php
include_once("./" . _DIR_RACINE . "ecrire/balise/formulaire_.php");
if ($lang_select = "fr") $lang_select = lang_select($lang_select);
inserer_balise_dynamique(balise_FORMULAIRE__dyn('FORMULAIRE_EDITER_DOCUMENT',
'2'), array('squelettes/mon_fichier_de_test.html',
'html_a12df3c934a8c10168b9789c0cc4c620', '_Foreach', 19, 'fr'));
if ($lang_select) lang_select();
?></div>

<div class="ajax">
&lt;?php
include_once("./" . _DIR_RACINE . "ecrire/balise/formulaire_.php");
if ($lang_select = "fr") $lang_select = lang_select($lang_select);
inserer_balise_dynamique(balise_FORMULAIRE__dyn('FORMULAIRE_EDITER_DOCUMENT',
'3'), array('squelettes/mon_fichier_de_test.html',
'html_a12df3c934a8c10168b9789c0cc4c620', '_Foreach', 19, 'fr'));
if ($lang_select) lang_select();
?></div>

évidement, ce n'est pas le résultat attendu !

J'ai essayé avec plusieurs types d'itérateurs et ça fait pareil (mon
premier essai était en fait un itérateur tableau)...

Est-ce qu'il n'y a pas un endroit où je me trompe ? Ou alors est-ce un bug ?

Bonjour, le problème court toujours avec SPIP 3.0.16

En effet.

Par contre, #FORMULAIRE_EDITER_DOCUMENT*{#VALEUR} passe...

La boucle DATA protège automatiquement toutes les balises qui sont à l'intérieur, car les données qu'on y manipule sont en général de provenance inconnue et potentiellement dangereuse.
Cela impacte aussi (à tort ?) les balises #FORMULAIRE_xx qu'il faut donc utiliser avec un * comme Suske le propose.

La solution alternative est d'utiliser une boucle POUR qui elle n'a pas ce comportement.

Salut,

La boucle DATA protège automatiquement toutes les balises qui sont à
l'intérieur, car les données qu'on y manipule sont en général de provenance
inconnue et potentiellement dangereuse.
Cela impacte aussi (à tort ?) les balises #FORMULAIRE_xx qu'il faut donc
utiliser avec un * comme Suske le propose.

La solution alternative est d'utiliser une boucle POUR qui elle n'a pas ce
comportement.

Merci pour ces précisions ! et l'astuce du POUR. Pour ma part j'avais
oublié avoir eu le souci, c'est Frank qui me l'a rappelé par son
message. Je ne sais plus du tout comment je l'avais contourné (ni dans
quel contexte je l'avais rencontré).

Je pense que ça vaudrait le coup de mettre à jour la doc sur spip.net, non ?

Par exemple, dans Les itérateurs de SPIP - la boucle (DATA) - SPIP ajouter (en
reprenant ce que tu viens d'écrire):

{{{Protection des données manipulées par les itérateurs}}}

La boucle <code>(DATA)</code> protège automatiquement toutes les
balises qui sont à l'intérieur, car les données qu'on y manipule sont
en général de provenance inconnue et potentiellement dangereuse. Cela
impacte aussi les balises des formulaires
(<code>#FORMULAIRE_xx</code>) qu'il faut donc utiliser avec un * comme
Suske le propose.

<code class="spip>
<BOUCLE_Foreach_protege(DATA){liste a,b,c,d,e}>
    #FORMULAIRE_XXX*{#VALEUR}
</BOUCLE_Foreach_protege>
<code>

Le plus souvent, il suffira d'utiliser une boucle <code>(POUR)</code>
qui elle n'a pas ce comportement.

<code class="spip>
<BOUCLE_Foreach_non_protege(POUR){liste a,b,c,d,e}>
    #FORMULAIRE_XXX{#VALEUR}
</BOUCLE_Foreach_protege>
<code>

J'ai proposé ça et d'autres choses ici:
http://www.spip.net/ecrire/?exec=article&id_article=5444#forum175307

Merci pour la proposition.

super !

merci pour la mise en oeuvre (super rapide !!!) !