Hello,
Je bataille avec deux formulaires de mon site et je m’arrache les cheveux … Quelqu’un aurait une idée ? Merci d’avance !
Le contexte:
J’ai une table OBSERVATIONS contenant des champs id_observation, titre et id_taxref. Je cherche à lier, depuis l’espace public, un ARTICLE à une OBSERVATION en peuplant le champ id_taxref de la valeur de l’id_article correspondant.
J’ai donc créé un formulaire dans une page publique d’article où je présente dans une liste déroulante, les observations candidates, en demandant à l’utilisateur d’en choisir une. Dans la même page, j’ai un second formulaire qui propose de délier les observations déjà liées à l’article. Chacun des deux formulaires redirige vers cette même page à la fin du traitement.
Mon problème:
la liaison d’une observation fonctionne
la suppression du lien d’une observation fonctionne
mais …
l’URL de la page contenant les formulaires perd la référence de l’article au retour de traiter().
si je veux lier une seconde observation, ça échoue …
idem pour une seconde suppression …
En regardant le source de la page APRES exécution de traiter(), je m’aperçois que l’id_observation de la première opération a été injecté dans les champs hidden de la page !! Pas moyen de comprendre pourquoi …
j’ai l’impression que tu es victime d’un choix de fonctionnement de SPIP par défaut, souvent bien pratique mais parfois bien gênant : form_hidden insère des hiddens en trop (#3769) · Issues · spip / spip · GitLab qualifié selon les moments de fonctionnement « tordu psychologiquement » et par moment de « pas un bug sinon ça se saurait depuis le temps ».
Selon les cas, pour remédier à cette difficulté, j’utilise
une fonction monplugin_form_hidden, qui reprend tout le code de form_hidden sauf la partie fautive qui surajoute les variables en trop :
/*
* monplugin : C'est ici la différence avec le form_hidden de spip
* car urls_decoder_url renvoie un id_truc qui ne vient pas de $action
* mais issu de l'url de la page
// ensuite avec celles du contexte, sans doublonner !
foreach ($contexte as $var => $val) {
if (preg_match(',\[\]$,S', $var)) {
$values[] = array($var, $val);
} else {
if (!isset($values[$var])) {
$values[$var] = array($var, $val);
}
}
}
*/
L’important ici c’est /* au début et */ à la fin. Pour le reste garde le code de form_hidden.
Sinon, plus simplement peut être, tu pourrais passer une variable masquée, que tu récupérerais « à la main » là où tu le veux vraiment au lieu de compter sur les automatismes de SPIP.
Ici masquée par un nom différent du vrai nom : utiliser ?id_article_nonauto=123 ou ?id_observation_nonauto=12354 selon ce qui gêne,
et dans le squelette utiliser #ENV{id_article_nonauto} ou #ENV{id_observation_nonauto} aux endroits où il y a besoin de la valeur. Par exemple dans une boucle, le critère {id_article=#ENV{id_article_nonauto}} au lieu de {id_article}
Ainsi SPIP du coup ne pourrait rien faire de nuisible avec son automatisme compulsif dans form_hidden.
Ce qui est bien quand même avec les variables en id_ c’est que l’écran de sécurité les protège en restreignant leurs valeurs possibles à des entiers. Je te conseille donc de garder un nom qui commence par id_. id_observation_ref stv.