Pour une utilisation spécifique, j'ai modifié le plugin A2A pour lier
des fiches (clubs) à des articles. Le fonctionnement de la recherche
marche sans souci. Je peux recherche un club par son ID ou par son
nom. Par contre le bouton "lier" me met un lien 404
"spip.php?page=404" alors que le plugin A2A renvoie un lien de cette
forme : "ecrire/?exec=articles&action=a2a&arg=lier_article/2017/42662/uni/&hash=f1966937b084c38e3a3aabb15a1d26101407a214&redirect=.%2F%3Fexec%3Darticles%26amp%3Bid_article%3D42662"
Alors que les 2 liens sont appelés exactement de la même façon :
- Pour A2A : [(#URL_ACTION_AUTEUR{a2a,lier_article/#ID_ARTICLE/#ID_ARTICLE_ORIG/uni/[(#ENV{type_liaison})],#SELF})]
- Pour ma version modifiée :
[(#URL_ACTION_AUTEUR{liaison_fiches,lier_article/#ID_CLUB/#ID_ARTICLE_ORIG/uni/[(#ENV{type_liaison})],#SELF})]
Et dans les logs spip, j'ai également les mêmes logs (à part le nom).
A quel moment et pourquoi la balise URL_ACTION_AUTEUR me renvoie une
erreur 404 ?
C'est ça qui m'interpelle. J'ai pensé également que c'était à ce
niveau-là c'est ce qui me semblait le plus logique. Je vais reprendre
de A à Z le plugin, mais j'ai peur que le problème soit exactement le
même.
Après avoir tout repris sans modifier les noms pour ne pas m'emmêler
juste la modification de la base et le changement id_article_lie par
id_club, j'ai cette erreur :
Warning: Missing argument 1 for vider_url(), called in
/home/.../http/spip/ecrire/public/composer.php(49) : eval()'d code on
line 64 and defined in /home/.../http/spip/ecrire/inc/filtres.php on
line 569
J'ai au moins un message d'erreur, mais ça plante au même endroit. Un
truc qui m'échappe, Spip qui n'aime pas id_club car ce n'est pas un
objet éditorial peut-être ? Je n'ai pas d'erreur dans les logs.
Pour ce dernier point, le vider_url ne concernait pas le même souci,
j'avais oublié d'enlever un #URL_ARTICLE.
En fait la balise #URL_ACTION_AUTEUR ne fonctionne pas si la balise
est contenue dans une boucle qui va taper dans une autre base de
données. Si je tape dans la même base de données que Spip, ça
fonctionne.
Y'a-t-il un moyen de faire marcher la balise #URL_ACTION_AUTEUR sur
une base externe ?
On m'a suggéré de voir du côté des autorisations sur IRC, ce que j'ai
fait (sur programmer et autres sites), mais j'ai toujours pas réussi à
comprendre le principe des autorisations de spip. Du coup j'ai
(bêtement) copier sur d'autres plugins et ajouter ça :
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('public/parametrer');
function liaison_fiches_autoriser(){}
function autoriser_lier_article_dist($faire, $type, $id, $qui, $opt){
return true;
}
Mais sans succès la balise
[(#URL_ACTION_AUTEUR{liaison_fiches,lier_article/#ID_CLUB/#ID_ARTICLE_ORIG/uni/[(#ENV{type_liaison})],#SELF})]
renvoie inlassablement une erreur 404. Est-ce que je peux faire sauter #URL_ACTION_AUTEUR d'une quelquonque façon ou comment autoriser ma
table externe ou ma fonction ? Logiquement il ne me reste que ce point
bloquant sur mon plugin (et sur le site entier).
Je ne pense pas, en commentaires du fichier /ecrire/balise/url_.php :
// Les balises URL_$type sont generiques, sauf qq cas particuliers.
// Si ces balises sont utilisees pour la base locale,
// production des appels a generer_url_entite(id-courant, entite)
// Si la base est externe et non geree par SPIP
// on retourne NULL pour provoquer leur interpretation comme champ SQL normal.
Donc je pense que c'est volontaire pour que #URL_ACTION_AUTEUR soit
considérée comme un champ SQL. Donc je ne préfère pas ouvrir un
rapport de bug sans avoir confirmation que ça en ait bien un.
Là je suis complètement bloqué sur ce point, j'ai essayé en dégageant
la balise et en mettant simplement le lien en exec... ça me sort que
l'accès est interdit (comme je n'arrive pas à gérer les autorisations
ça me semble logique). J'ai essayé de sortir de la boucle externe avec
spip bonux, ça ne m'affiche plus rien.
J'avais bien vu ce bout de code, et bien interprété comme tel. Et
donc, je n'ai aucun moyen de produire une URL dans une boucle sur une
base externe ? Je ne peux pas surcharger cette fonction pour lui dire
de ne pas produire une erreur 404 ? Ou bien créer une balise
équivalente pour les bases externe ?
Merci Cédric... de m'avoir donné de faux espoirs... ;o) J'y ai cru
mais bien que cela ne me donne plus d'erreur 404 l'URL est vide,
j'obtiens ça comme URL "/ecrire/". D'ailleurs avec cette forme, même
hors boucle sur base externe j'obtiens toujours "/ecrire/" en URL.
Merci quand même, je reste dans l'impasse donc je suis preneur de
toute proposition même non testée.
Pourtant en écriture normale :
[(#URL_ACTION_AUTEUR{liaison_fiches,lier_article/#ID_ARTICLE/#ID_ARTICLE_ORIG/uni/[(#ENV{type_liaison})],#SELF})]
et dans une boucle sur une base interne, la balise renvoie bien la
bonne URL. Par contre si j'enlève les [] sur #URL_ACTION_AUTEUR la
balise ne me renvoie plus rien du tout. J'ai fait pas mal de tests,
mais j'ai pas essayer d'enlever les [] sur #ENV par ex. Je vais
tester.
Pourtant en écriture normale :
[(#URL_ACTION_AUTEUR{liaison_fiches,lier_article/#ID_ARTICLE/#ID_ARTICLE_ORIG/uni/[(#ENV{type_liaison})],#SELF})]
et dans une boucle sur une base interne, la balise renvoie bien la
bonne URL.
Je ne comprends pas pourquoi Cédric te raconte n'importe quoi.
Il suffit de regarger le code de la fonction s'occupant de cette balise pour voir qu'elle commence par:
if ($p->boucles[$p->id_boucle]->sql_serveur) {
$p->code = 'generer_url_public("404")';
return $p;
}
les balises #URL ne sont pas utilisables dans une boucle sur base distante, car le code produit appellerait les fonctions '''generer_url_''' du site local, avec utilisation du '''type_url''' local, et consultation éventuelle de la base locale pour le titre en mode URL propres etc. On interdit donc l'utilisation de ces balises, mais la question de leur compilation de manière correcte est ouverte.
Mais je n'aurais pas dû appliquer cet ajout à la balise URL_ACTION_AUTEUR car malgré son nom elle ne souffre pas de ce problème.
Je l'élimine tout de suite de la version 2.1.
Mais après test il s'avère donc que le compilateur ne passe pas la référence explicite de boucle à la balise dynamique, ce qui semble montrer l'existence d'un bug sur ce point.
Sous réserve que je ne raconte pas encore n'importe quoi, bien évidemment.
Ben si: le compilateur envoie bien cette info, mais c'est à chaque balise de décider si elle doit en tenir compte ou pas.
Et en l'occurrence URL_ACTION_AUTEUR n'a rien à voir avec les boucles, elle produit une URL avec les arguments qu'on lui donne point barre,
tester qqch à propos d'une boucle englobante n'a et n'avait aucune raison d'être.
Par ailleurs il ne s'agit pas d'une balise dynamique, puisqu'elle ne produit pas une séquence <?php ...?> à réévaluer dans une passe supplémentaire.
Mais après test il s'avère donc que le compilateur ne passe pas la référence explicite de boucle à la balise dynamique, ce qui semble montrer l'existence d'un bug sur ce point.
Sous réserve que je ne raconte pas encore n'importe quoi, bien évidemment.
Ben si: le compilateur envoie bien cette info, mais c'est à chaque balise de décider si elle doit en tenir compte ou pas.
Et en l'occurrence URL_ACTION_AUTEUR n'a rien à voir avec les boucles, elle produit une URL avec les arguments qu'on lui donne point barre,
tester qqch à propos d'une boucle englobante n'a et n'avait aucune raison d'être.
Par ailleurs il ne s'agit pas d'une balise dynamique, puisqu'elle ne produit pas une séquence <?php ...?> à réévaluer dans une passe supplémentaire.
Oui sur le fond je suis d'accord. J'étais juste surpris qu'on ne puisse s'en tirer avec une référence explicite pour échapper à la détection du serveur.
Merci à tous les 2, sauf que cela ne solutionne pas mon souci. Ayant
vu cette partie de code hier, je l'avais commentée pour voir si ce
n'est pas ça qui me renvoyait une erreur 404. Et cela ne change
strictement rien au comportement qui me renvoie toujours vers cette
page : spip.php?page=404. J'ai réessayé ce matin, même résultat.
Toujours impossible de produire une #URL_ACTION_AUTEUR dans une boucle
sur base externe, dès que je sors de la boucle (avec un #SET-#GET par
exemple) aucun souci j'ai la bonne URL.