En reproduisant la gestion des liens pour l’affectation des types de plugin aux plugins je suis tombé sur un truc que je trouve bizarre.
Dans le formulaire editer_liens on affiche la liste des objets liés (par exemple les mots) avec le bouton “retirer …”. Ce bouton est une balise dont :
le name vaut : “supprimer_lien[mot-#ID_MOT-#OBJET-#ID_OBJET]”, où supprimer_lien indique l’action à exécuter et le contenu entre crochets la liste des arguments de l’action.
la value vaut étrangement “X”.
Dans le PHP, pour le “traiter”, on trouve le code d’exécution du bouton qui :
soit appelle une action dont le nom est bien compliquée,
soit déroule un code générique sans faire appel à une action. J’avoue ne pas trop comprendre pourquoi d’ailleurs on ne passe pas par une action pour sécuriser tout ça et pourquoi une telle différence de traitement.
Si l’action existe, on lui passe le _request(bouton) du fameux bouton qui par magie contient un tableau associatif dont l’index correspond aux arguments entre crochet et la valeur “X” soit par exemple “mot-#ID_MOT-#OBJET-#ID_OBJET” = “X”.
L’action qui s’exécute récupère donc un argument $arg qui contient exactement le tableau associatif précédent.
De fait, si on fait bêtement un explode() pour récupérer les arguments on récupère null pour tous car on fait l’explode sur “X” et pas sur l’index. On a donc un comportement totalement différent de celui de la plupart des actions.
Je ne sais pas si c’est voulu ou si c’est un cas qui n’a jamais vraiment été testé mais je trouve ce fonctionnement pas très heureux. Ne faudrait-il pas :
soit passer la clé du tableau à l’action (en utilisant un key() par exemple)
soit changer le name et la value du button si c’est possible (j’avoue que je ne comprends pas bien pourquoi le bouton a un tel name et une telle value.
La raison pour laquelle on utilise la clé et pas la valeur est un problème de compatibilité avec toute une série d’IE (je ne sais plus jusqu’à quelle version) ou la valeur des button est le html compris entre les balises <button> au lieu de l’argument value
Il y a dans le formulaire une fonction pour decouper la clé il me semble.
Tout ça est donc parfaitement voulu et normal et testé, même si ça parait en effet assez obscur
La raison pour laquelle on utilise la clé et pas la valeur est un problème de compatibilité avec toute une série d’IE (je ne sais plus jusqu’à quelle version) ou la valeur des button est le html compris entre les balises au lieu de l’argument value
Il y a dans le formulaire une fonction pour decouper la clé il me semble.
Tout ça est donc parfaitement voulu et normal et testé, même si ça parait en effet assez obscur
Je reviens quand même sur le sujet car quitte à me faire troller autant aller jusqu’au bout :p.
J’ai fait une recherche sur la zone et je n’ai pas trouvé d’exemple d’une action spécifique du type editer_liens_ajouter_xxxx.
(ou l’équivalent avec supprimer°.
Donc je ne suis pas convaincu qu’on ait déjà utilisé cette action spécifique à laquelle on passe le tableau [arguments] = ‹ x ›.
C’est pourquoi je me demande quand même si on ne devrait pas passer à cette action uniquement arguments comme pour toutes les autres actions de SPIP afin d’éviter les erreurs de traitement surtout si cette action peut être appelée par un bouton action. Tu vois ce que je veux dire ?
Pas sur la zone, non, mais dans mon gitlab j’en utilise
Le truc c’est que l’argument c’est un tableau qui peut contenir une ou plusieurs actions, et en effet en fonction du html utilisé l’action va être décrite dans la clé ou dans la valeur.
C’est pourquoi on fait dans le code par défaut
foreach ($ajouter as $k => $v) {
if ($lien = lien_verifier_action($k, $v)) {…
lien_verifier_action se chargeant de récupérer la bonne valeur qui est dans $k ou $v
Ok, mais ça veut dire que cette action n’est pas utilisable par un bouton_action classique qui va renvoyer les arguments dans la valeur et pas l’index non?
Par défaut ce n’est en effet pas une action qui vise à être utilisée avec un bouton action (elle ne prends pas les infos dans _request())
Mais de toute façon tu dois utiliser lien_verifier_action() pour pouvoir fonctionner avec tous les types de boutons, et en ajoutant un peu de test à l’entrée tu dois pouvoir la faire fonctionner avec un bouton action également (mais il faut gérer la sécurité etc)