Bonjour,
Je tente vainement de faire un petit modèle simple pour protéger par mot de passe un bout de texte:
<restreint
titre=Ah que ""!
pass=coucou
texte= Oui, c'est ça!
>
à mettre dans un article/rubrique pour qu'un formulaire titré 'Ah que ""!' demande le mot de passe et si on tape (en l'occurence) "coucou", ça écrive "Oui c'est ça!".
Alors j'ai tenté ma chance avec:
modeles/restreint.html
<form method="get" action="#SELF">[(#TITRE|sinon{"Mot de passe: "})]
[(#SELF|form_hidden)]
<input type="password" name="passwd" id="passwd" />
</form>]
<?php
if("[(#PASS)]" == "[(#ENV{passwd})]") {
?>
[(#ENV{texte})] <?php } ?>
J'ai plusieurs problèmes:
Tout d'abord, pass, titre et texte sont bien passés au modèle, mais passwd a un comportement bizarre:
#PASSWD ou #ENV{passwd} ne donne rien, pourtant [(#SELF|form_hidden)] le rajoute (correctement) dans la liste des champs GET. Donc il est bien passé mais pas mis dans #ENV.
D'autre part, mais je ne suis pas le seul à soulever le problème, voir: http://forum.spip.org/fr_192043.html
form_hidden agglutine les différents champs au lieu de les remplacer
par le dernier, ce qui rend cette astuce complètement inopérante. J'ai donc modifié le filtre form_hidden dans ecrire/inc/filtre.php de la manière suivante:
// La fonction suivante ne sert plus aujourd'hui qu'aux squelettes des
// balises dynamiques, en attendant une nouvelle conception qui permettra
// d'eviter les redondances de calcul et d'ecriture qu'elle induit.
// Elle fournit la suite de Input-Hidden correspondant aux parametres de
// l'URL donnee en argument. Ce besoin de ne devrait pas apparaitre,
// utiliser plutot generer_form_ecrire.
// http://doc.spip.org/@form_hidden
function form_hidden($action) {
$hidden = '';
$tableau = array();
if (false !== ($p = strpos($action, '?')))
foreach(preg_split('/&(amp;)?/S',substr($action,$p+1)) as $c) {
$name_value = explode("=", $c, 2);
$tableau[trim($name_value[0])] = trim($name_value[1]);
}
foreach($tableau as $name => $value){
$hidden .= "\n<input name='" .
entites_html(rawurldecode("$name' value='$value'")) .
"' type='hidden' />";
}
return $hidden;
}
soit le diff suivant: