[spip-dev] Un SPIP plusieurs bases : le retour

Bonjour à tous,

/*Rappel :

Nous travaillons sur la refonte du site du CRDP de Bourgogne http://neill.u-bourgogne.fr/crdp/ et de 3 CDDP dont le CDDP de l'Yonne http://neill.u-bourgogne.fr/cddp89/

Le CRDP est constitué d'un centre régional à Dijon et de 3 centres
départementaux. Certains articles ont une portée régionale et sont sur le site du CRDP. Pour éviter de dupliquer les articles, nous explorons la syndication, comme l'a suggéré Fil.
Fin du rappel*/

Nous avons créé un fichier backend.html avec une boucle article récupérant tous les articles qui devront se trouver dans les sites départementaux.

  Le problème c'est que nous avons besoin de reclasser les articles syndiqués dans des rubriques, il nous faut donc l'ID_RUBRIQUE d'origine. Nous avons rajouté une balise <guid>pour mettre l'ID_RUBRIQUE de l'article dans backend.html (comme vu sur http://zone.spip.org/trac/spip-zone/file/squelettes/forum.spip.org/backend-forum.html
). Comment récupérer dans la boucle syndic article cet id rubrique comme critère de sélection ? Un filtre ? Si oui comment créer ce filtre ?

Une autre question : Est-ce qu'il est autorisé d'avoir plus de 15 items dans un flux RSS ?
Merci d'avance

Laurent Casagrande
CRDP de Bourgogne - Dijon

Laurent Casagrande wrote:

  Le problème c'est que nous avons besoin de reclasser les articles syndiqués dans des rubriques, il nous faut donc l'ID_RUBRIQUE d'origine. Nous avons rajouté une balise <guid>pour mettre l'ID_RUBRIQUE de l'article dans backend.html (comme vu sur http://zone.spip.org/trac/spip-zone/file/_squelettes_/forum.spip.org/backend-forum.html
). Comment récupérer dans la boucle syndic article cet id rubrique comme critère de sélection ? Un filtre ? Si oui comment créer ce filtre ?

tu peux t'inspirer de Des champs multivalués, une alternative ponctuelle aux Extras - SPIP-Contrib
qui a été écrit exactement pour ce type de besoin.
(c'est ce principe qui a donné les champts <multi>lingue par la suite)

Cordialement,
JLuc

Fil avait écrit
>Pour éviter de dupliquer les articles dans les 4 sites, il faudrait que je
>> puisse afficher dans un SPIP des articles provenant du site du CRDP. Je
>> pense qu'il y a plusieurs pistes.

Je vote pour la syndication.

>> Mais je n'ai pas trouvé de doc pour la création de fichier Backend
>> personnalisé.

C'est juste un squelette normal, avec le filtre |texte_backend pour passer
les données au format XML.

Un exemple "riche" se trouve sur
http://zone.spip.org/trac/spip-zone/file/squelettes/forum.spip.org/backend-forum.html

Ensuite tu vas probablement vouloir récupérer le texte "propre" au moment de
la syndication, et pas le texte sans balises et coupé à 300 caractères ; là
il faut un peu d'astuce :

- passer |abs_url sur le texte pour que les liens relatifs aillent vers le
   bon site (notamment pour les images, mais aussi pour les vrais liens)

- passer |entites_html avant |texte_backend, pour encoder deux fois les
   caractères html (ils sont décodés une fois à la lecture, puis les tags
   sont supprimés : tu peux alors passer |filtrer_entites sur [(#DESCRIPTIF)]
   dans le squelette qui affiche l'article).

- éventuellement augmenter la taille du champ descriptif dans
   spip_syndic_articles (vérifier s'il y a une limite ?)
- patcher un peu dans ecrire/inc_sites.php3 pour supprimer le filtre
   couper(...,300), histoire de ne pas perdre du contenu
Pour ça c'est OK

-- Fil
Si je passe |abs_url, je n'ai plus du tout de texte dans le fichier http://neill.u-bourgogne.fr/crdp/backend-ressources.php3.
Si je ne le passe pas, je retrouve le texte mais effectivement les liens vers les images sont en relatif donc ça ne va pas non plus.

Pour un article contenant du HTML, le résultat est meilleur en appliquant |entites_html après |texte_backend mais il reste encore des problèmes, les caractères encodés dans les textes de l'article (&eacute; ...) sont décodés dans dans le site qui syndique mais il reste des " ;"
Voir : http://neill.u-bourgogne.fr/cddp89/rubrique.php3?id_rubrique=1
Il y a 3 articles syndiqués au début dont un avec un tableau réalisé en html dans l'article d'origine.

Le plus embêtant est que les liens de type annuaire.php?centre=1&service=1 sont transformés en annuaire.php%20?centre=1&%20;service=1 et sont donc brisés
En réalité, il semble qu'il rajoute des espaces devant les points d'interrogation et derrière les & (où il rajoute aussi un ; comme derrière les caractères é è ...)

Merci d'avance

Laurent Casagrande
CRDP de Bourgogne - Dijon

- patcher un peu dans ecrire/inc_sites.php3 pour supprimer le filtre
   couper(...,300), histoire de ne pas perdre du contenu

http://neill.u-bourgogne.fr/crdp/backend-ressources.php3.

Voici le patch que je fais chez moi pour syndiquer le backend que tu
indiques :

(version CVS, ecrire/inc_sites.php3, ligne 552)

+ $data[$var] = "<html>".filtrer_entites($data[$var])."</html>";
- $data[$var] = couper($data[$var], 300);

et je n'ai aucun souci, le texte est complet et nickel, sauf les liens
relatifs et les images.

Note : sans le <html> ça marche aussi, avec le risque toutefois de choses un
peu étranges car propre(propre($x)) n'est pas toujours identique à
propre($x). Mais en tous cas filtrer_entites est indispensable à cet
endroit.

Pour les liens absolus, le filtre abs_url est planté, ce qui ne m'étonne pas
quand je regarde le code actuel, qui utilise $url au lieu de $texte : ce qui
prouve que personne ne l'a testé :frowning:

Pour le #TEXTE, essaie peut-être avec |liens_absolus (mais ça ne règlera que
les liens <a href>, et pas les <img src>, il y a donc aussi quelques
corrections à faire dans SPIP, tu nous diras : ecrire/inc_filtres.php3).

-- Fil

Pour le #TEXTE, essaie peut-être avec |liens_absolus (mais ça ne règlera que
les liens <a href>, et pas les <img src>, il y a donc aussi quelques
corrections à faire dans SPIP, tu nous diras : ecrire/inc_filtres.php3).

Je viens de faire ces corrections, et [(#TEXTE|abs_url)] devrait fonctionner
désormais. Mais aussi, côté "client", tu peux désormais afficher ton article
via [(#TEXTE|abs_url{http://adresse.du.site.d.origine/\})]

voire plus acrobatique :
        [(#TEXTE|abs_url{#URL_SITE/})]
si l'url du site d'origine est dans le contexte (i.e. tu es à l'intérieur
d'une boucle (SYNDIC).

-- Fil

Je viens de faire ces corrections, et [(#TEXTE|abs_url)] devrait fonctionner
désormais. Mais aussi, côté "client", tu peux désormais afficher ton article
via [(#TEXTE|abs_url{http://adresse.du.site.d.origine/\})]

En fait on peut faire mieux : sortons le couper(..300) de la fonction
analyser_backend() [ ce n'est pas son rôle ], et déplaçons-le dans
inserer_article_syndique(). Au passage, ajoutons un "point d'entrée" qui
permet de remplacer couper(...,300) par une fonction de son choix dans
ecrire/mes_options.php3

Avec tout ça, il suffit désormais de mettre dans ecrire/mes_options.php3 la
fonction ci-dessous pour obtenir le bon résultat :

function nettoyer_descriptif_syndication($descriptif, $id_syndic=0, $url_site='') {
        // Sites syndiques "full text"
        if ($url_site == 'http://neill.u-bourgogne.fr/crdp/
        OR $url_site == 'http://plop.u-texas.us/cusdp/') {
                return "<html>".abs_url(filtrer_entites($descriptif), $url_site)."</html>";
        }

        // sinon fonctionnalite normale
        return couper($descriptif, 300);
}

Le partage automatique d'articles entre sites est presque complet. Les mises
à jour se propagent, etc. Et s'il y a des documents joints, il doit suffire
de les ajouter dans le backend sous forme d'"enclosure" pour qu'ils soient
eux aussi transmis.

Il ne reste plus qu'à rédiger un tutoriel complet.

-- Fil

Fil a écrit :

Je viens de faire ces corrections, et [(#TEXTE|abs_url)] devrait fonctionner
désormais. Mais aussi, côté "client", tu peux désormais afficher ton article
via [(#TEXTE|abs_url{http://adresse.du.site.d.origine/\})]

En fait on peut faire mieux : sortons le couper(..300) de la fonction
analyser_backend() [ ce n'est pas son rôle ], et déplaçons-le dans
inserer_article_syndique(). Au passage, ajoutons un "point d'entrée" qui
permet de remplacer couper(...,300) par une fonction de son choix dans
ecrire/mes_options.php3

Avec tout ça, il suffit désormais de mettre dans ecrire/mes_options.php3 la
fonction ci-dessous pour obtenir le bon résultat :

function nettoyer_descriptif_syndication($descriptif, $id_syndic=0, $url_site='') {
        // Sites syndiques "full text"
        if ($url_site == 'http://neill.u-bourgogne.fr/crdp/
        OR $url_site == 'http://plop.u-texas.us/cusdp/') {
                return "<html>".abs_url(filtrer_entites($descriptif), $url_site)."</html>";
        }

        // sinon fonctionnalite normale
        return couper($descriptif, 300);
}

Le partage automatique d'articles entre sites est presque complet. Les mises
à jour se propagent, etc. Et s'il y a des documents joints, il doit suffire
de les ajouter dans le backend sous forme d'"enclosure" pour qu'ils soient
eux aussi transmis.

Il ne reste plus qu'à rédiger un tutoriel complet.

-- Fil

C'est de la sorcellerie !!
Ca marche impec, merci beaucoup.
Je vois que le fichier inc_site.php3 a été beaucoup remanié.
Pour le tutoriel, bien entendu nous ferons ça sur spip contrib mais il nous reste une chose à faire : replacer les articles du site crdp aux bons endroits sur les sites des CDDP.
Pour cela nous pensons utiliser le champ lesauteurs pour y placer le nom de la rubrique d'origine pour filtrer la syndication en fonction du nom des rubriques (la structure des rubriques a une partie commune entre le CRDP et les CDDP).
L'idéal serait d'avoir un champ supplémentaire dans la table syndic_articles dans lequel on place ce que l'on souhaite (dans notre cas, le nom ou l'id de la rubrique d'origine) est-ce possible ?
Encore merci pour cette modif.

Laurent Casagrande
CRDP de Bourgogne - Dijon

Pour cela nous pensons utiliser le champ lesauteurs pour y placer le nom
de la rubrique d'origine pour filtrer la syndication en fonction du nom
des rubriques (la structure des rubriques a une partie commune entre le
CRDP et les CDDP).

Pourquoi ne pas plutôt faire un backend par id_rubrique d'origine ?
et syndiquer backend.php3?id_rubrique=56 dans la rubrique 56, etc.

-- Fil

Fil a écrit :

Pour cela nous pensons utiliser le champ lesauteurs pour y placer le nom de la rubrique d'origine pour filtrer la syndication en fonction du nom des rubriques (la structure des rubriques a une partie commune entre le CRDP et les CDDP).

Pourquoi ne pas plutôt faire un backend par id_rubrique d'origine ?
et syndiquer backend.php3?id_rubrique=56 dans la rubrique 56, etc.

-- Fil

Ca marche, on a donc un seul squelette backend-ressources.php3/html avec la boucle <BOUCLE_cddp89(ARTICLES){lang ?}{id_rubrique}{titre_mot=cddp89}{unique}>
Dans les sites "clients", on syndique le site avec backend-ressources.php3?id_rubrique=56 et on a que les articles contenant le mot clé et faisant partie de la rubrique 56. Si c'est ça c'est encore plus simple que ce que je pensais comprendre !
C'est dingue SPIP et son équipe de développeurs
Merci encore
Laurent