[spip-dev] Spip 2.0 - contexte de la fonction recuperer_fond()

Bonjour à tous,

Petit problème que ni le chan irc, ni mon ami google ni une lecture
attentive du code ne m'a aidé à résoudre :

J'utilise dans un plugin via le pipeline post_edition la fonction
recuperer_fond() pour que lors de la publication d'un article un fichier
xml soit créer avec dedans -entre autre- le TEXTE html de l'article.

Mon soucis est que différents tests m'ont montré que la fonction
recuperer_fond() agit différement en fonction du contexte :

- si je l'appelle via une page classique du front
http://monsite/spip?page=mon_script_qui_genere_du_xml , le html du TEXTE
sort correctement avec les bonnes liens et les bonnes redimensions
d'images dans ce TEXTE

- si je l'appelle via le pipeline du pluggin (et du coup le html est
généré dans un contexte d'espace privé puisqu'au moment où un auteur
publie un article ) alors les liens vers les images ne sont plus absolus
mais relatifs et par ailleurs les liens vers d'autres articles pointent
vers l'espace privé (sur le modèle
http://monsite/ecrire/?exec=articles&id_article=98 )

Je voudrais pouvoir dire à la fonction recuperer_fond() de focntioner
comme côté front bien qu'étant dans l'espace privé...

Quelqu'un a-t-il une solution à me proposer ?

Merci d'avance

Stéphane

Bonjour à tous,

Bon, peux(!) de réponses à ma question mais mes propres investigations
vont peut-être donner des idées à certains :slight_smile:

J'ai compris que la construction des url d'un #TEXT se fait sur le
modèle front ou privé (c'est à dire lien public ou lien privé
avec /ecrire/exec)=) avec la fonction generer_url_entite($arg, ...) du
fichier /ecrire/inc/utils.php en fonction de l'argument $public (5ieme
argument) et par défaut en fonction du contexte d'exécution.

ok.

Ce que je ne comprends pas c'est que cette fonction
generer_url_entite($arg,...) est appelé par la fonction
traiter_lien_implicite($arg,...) du fichier /ecrire/inc.lien.php qui
lui passe en 5ieme argument non pas $public mais $connect. (ex : ligne
314 )

$connect devant être à priori le nom du fichier de connexion à la base
de données à utiliser et non pas un booleen indiquant si on est ou non
dans l'espace public.

Deux questions :

- Quelqu'un pourrait-il m'éclairer sur ce point précis ?

- Serait-il imaginable de modifier la fonction recuperer_fond pour lui
passer soit dans l'argument $options soit dans l'argument $contexte une
entrée 'public' qui permettrait de forcer son contexte d'utilisation ?

ex d'utilisation :
$context =
array("id_article"=>$flux['args']['id_objet'],"public"=>true) ;

$xml_article = recuperer_fond("modeles/xml_article",$context);

Merci de votre aide d'avance,

Stéphane

Ce que je ne comprends pas c'est que cette fonction
generer_url_entite($arg,...) est appelé par la fonction
traiter_lien_implicite($arg,...) du fichier /ecrire/inc.lien.php qui
lui passe en 5ieme argument non pas $public mais $connect.

Deux questions :

- Quelqu'un pourrait-il m'éclairer sur ce point précis ?

$public étant indéfini ici ce n'est pas la bonne piste pour ce que tu veux faire.
Et par définition qqch d'implicite est qqch qui dépend du contexte,
donc on appelle generer_url_entite en lui communiquant la part de contexte concernée,
savoir ici $connect qui indique quel serveur l'URL à construire doit référencer.

- Serait-il imaginable de modifier la fonction recuperer_fond

Non, cette fonction est centrale et la changer aurait des impacts incalculables.
Tu dois plutôt opérer par surcharge de la fonction inc_lien, qut tu dois définir comme identique
sauf qu'elle force True le 4e argument de l'appel à calculer_url.
Toutefois ça révèle un manque de robustesse dans les version de SPIP,
il faut appliquer le patch suivant ou attendre le Zip correspondant:
http://trac.rezo.net/trac/spip/changeset/15735

Committo,Ergo:Sum

Confronté à un soucis similaire (faire un recuperer_fond dans /ecrire mais qui calcule des urls publiques pour un raccourcis [–>art12], dans un #DESCRIPTIF qui a aussi des modèles) j'ai essayé d'activer le hack de esj

http://core.spip.org/projects/spip/repository/revisions/15735

Différents essais :

Je pensais réussir en faisant

$message = liens_absolus(recuperer_fond($gabarit,$env,array(),true)) ;

Mais spip essaie de se connecter à un serveur et le recuperer_fond echoue.

$message = liens_absolus(recuperer_fond($gabarit,$env,array(),false)) ;

Récupere bien le squelette sans chercher a se connecter sur le serveur false, mais la valeur false n'arrive pas jusque dans inc_lien, ce qui me fait penser que le cas précédent n'aurait de toutes facon pas marché même indépendamment de la connexion non souhaitée.

J'ai tenté une petit [(#DESCRIPTIF*|propre{#EVAL{true}})] qui fonctionne bien pour un [–>art12] qui a bien l'url publique mais les modeles inclus ne le sont plus.

Donc c'est l'échec. Je ne parviens pas à faire un récuperer_fond dans /ecrire qui calculerait des raccouris de liens avec url publiques.

BoOz

Committo,Ergo:sum wrote: