[SPIP Zone] [Bug ?] Gestion des boucles documents avec doublons

Bonjour,

En triturant un squelette, je me suis rendu compte de la chose suivante. Soit
un fichier squelette servant à afficher des articles contenant un portfolio
du type :

<BOUCLE_documents(DOCUMENTS){id_article}{mode=document}{doublons}>
(Un portfolio)
</BOUCLE_documents>

Une telle boucle ne doit pas référencer les documents déjà présents
({doublons}), c'est-à-dire ceux intégrés au corps de l'article. Pour cela, il
faut que la balise #TEXTE soit présente dans le squelette car, si j'ai bien
compris, c'est son contenu qui est parcouru à la recherche d'éventuels
documents intégrés.

Or, dans mon squelette, j'utilise [(#TEXTE*|filtre_truc|propre)], c'est-à-dire
le #TEXTE brut filtré par la fonction filtre_truc puis renvoyé à propre pour
être mis en forme. Dans ce cas, la boucle documents ne semble plus repérer
les documents intégrés et les affiche tous dans le portfolio de l'article.

Pour contourner ce problème, j'ai placé un 2e appel à #TEXTE, mais sans
filtre, en commentaire PHP, de façon à ce que la page ne soit pas alourdie :
<?php /* #TEXTE */ ?>.

Ainsi, la boucle document ignore de nouveau les documents intégrés à
l'article.

Est-ce normal ? Me suis-je compliqué la vie inutilement parce qu'il existe une
autre man½uvre ? Je n'ai pas trouvé beaucoup de doc à ce sujet.

Le dimanche 18 mars 2007 23:47, Vincent Ramos a écrit :

Pour contourner ce problème, j'ai placé un 2e appel à #TEXTE, mais sans
filtre, en commentaire PHP, de façon à ce que la page ne soit pas
alourdie : <?php /* #TEXTE */ ?>.
Ainsi, la boucle document ignore de nouveau les documents intégrés à
l'article.

En contrepartie, je me retrouve avec des notes de bas de page dédoublées !

Bonjour,

J'ai remarqué le même comportement sur une de mes squelettes où la
balise #TEXTE est déclarée après le portfolio. Dans ce cas ça me
semble logique que la boucle portfolio ne détecte pas les doublons des
images présentes dans le texte (car celui est déclaré après).

Est-ce le cas de ton squelette ? Si quelqu'un à une astuce pour
résoudre ce petit problème je suis aussi intéressé.

Or, dans mon squelette, j'utilise [(#TEXTE*|filtre_truc|propre)], c'est-à-dire
le #TEXTE brut filtré par la fonction filtre_truc puis renvoyé à propre pour
être mis en forme. Dans ce cas, la boucle documents ne semble plus repérer
les documents intégrés et les affiche tous dans le portfolio de l'article.

Essaie peut-être avec [(#TEXTE*|filtre_truc|propre|traiter_doublons_documents)]

-- Fil

Le lundi 19 mars 2007 10:00, bruno bergot a écrit :

J'ai remarqué le même comportement sur un de mes squelettes où la
balise #TEXTE est déclarée après le portfolio. Dans ce cas ça me
semble logique que la boucle portfolio ne détecte pas les doublons des
images présentes dans le texte (car celui est déclaré après).
Est-ce le cas de ton squelette ? Si quelqu'un à une astuce pour
résoudre ce petit problème je suis aussi intéressé.

Ma balise #TEXTE est bien avant le portfolio. Je suis en train de tester le
filtre traiter_doublons_documents.

Le lundi 19 mars 2007 10:31, Fil a écrit :

Essaie peut-être avec
[(#TEXTE*|filtre_truc|propre|traiter_doublons_documents)]

Merci.

J'ai essayé mais ce filtre semble demander deux arguments et je ne vois pas
comment les lui passer car la fonction est construite ainsi :
function traiter_doublons_documents(&$doublons, $letexte) {
[...]
}

Je cherche comment faire.

Est-ce normal ? Me suis-je compliqué la vie inutilement parce qu'il existe
une autre man½uvre ? Je n'ai pas trouvé beaucoup de doc à ce sujet.

Je viens de tester encore plus simplement :
[(#TEXTE*|propre)]

renvoie un texte propre sans gestion des documents intégrés.

Cela me semble bien être un bug.

La question avait déjà été traitée dans la liste dev :
<http://archives.rezo.net/spip-dev.mbox/200507.mbox/thread> (fil « #TEXTE et
#TEXTE*|propre sont dans un bateau ») avec mention du même problème de
dédoublement de notes.

Je récapitule :
1. [(#TEXTE)] et [(#TEXTE*|propre)] ne renvoient pas la même chose et il est
normal que propre() ne s'occupe pas de la gestion des documents intégrés ;
2. il n'est donc pas possible d'utiliser un filtre demandant le #TEXTE brut et
de le repasser en propre() sans quelques manipulations pour la gestion des
documents intégrés (donc « doublonnés ») et celle des notes.

==Documents intégrés==
Utiliser de nouveau la balise #TEXTE avec un filtre n'affichant rien. Par
exemple :
[(#TEXTE*|filtre_perso|propre)]
[(#TEXTE|rien)]

avec, dans mes_options.php :
rien($texte){
return "";
}

Cela dédoublera nécessairement les notes de bas de page car celles-ci sont
maintenant calculées deux fois.

==Dédoublement des notes==
Il faut appeler une autre fois #NOTES, avec le même filtre rien() : [(#NOTES|
rien)].

Le placement de cette balise vidée est crucial : elle doit précéder l'appel
aux balises dont on veut acquérir les notes. Par exemple, pour que cela
marche, j'ai la configuration suivante :
[(#TEXTE|rien)][(#NOTES|rien)]
[(#CHAPO)]
[(#TEXTE*|filtre_perso|propre)]

Si [(#NOTES|dummy)] n'est pas avant #CHAPO, je perds les notes éventuelles
dans le chapeau.

Je viens de testerencore plus simplement:
[(#TEXTE*|propre)]

renvoie un texte propre sans gestion des documents intégrés.

Cela me semble bien être un bug.

Non, la gestion des doublons de documents est faite par les
"traitements par défaut"; si tu utilises des traitements persos, tu
dois les gérer toi-même avec
[(#TEXTE*|filtre_truc|propre|traiter_doublons_documents)]

-- Fil

> Je viens de testerencore plus simplement:
> [(#TEXTE*|propre)]
> renvoie un texte propre sans gestion des documents intégrés.
> Cela me semble bien être un bug.

Non, la gestion des doublons de documents est faite par les
"traitements par défaut"; si tu utilises des traitements persos, tu
dois les gérer toi-même avec
[(#TEXTE*|filtre_truc|propre|traiter_doublons_documents)]

Je suis d'accord : ce n'est pas un bug (voir mon dernier message) mais
[(#TEXTE*|filtre_truc|propre|traiter_doublons_documents)] ne marche pas pour
autant : manque un argument à traiter_doublons_documents().

[Mon message semble ne pas avoir été distribué. Nouvel envoi.]

La question avait déjà été traitée dans la liste dev :
<http://archives.rezo.net/spip-dev.mbox/200507.mbox/thread> (fil « #TEXTE et
#TEXTE*|propre sont dans un bateau ») avec mention du même problème de
dédoublement de notes.

Je récapitule :
1. [(#TEXTE)] et [(#TEXTE*|propre)] ne renvoient pas la même chose et il est
normal que propre() ne s'occupe pas de la gestion des documents intégrés ;
2. il n'est donc pas possible d'utiliser un filtre demandant le #TEXTE brut et
de le repasser en propre() sans quelques manipulations pour la gestion des
documents intégrés (donc « doublonnés ») et celle des notes.

==Documents intégrés==
Utiliser de nouveau la balise #TEXTE avec un filtre n'affichant rien. Par
exemple :
[(#TEXTE*|filtre_perso|propre)]
[(#TEXTE|rien)]

avec, dans mes_options.php :
rien($texte){
return "";
}

Cela dédoublera nécessairement les notes de bas de page car celles-ci sont
maintenant calculées deux fois.

==Dédoublement des notes==
Il faut appeler une autre fois #NOTES, avec le même filtre rien() : [(#NOTES|
rien)].

Le placement de cette balise vidée est crucial : elle doit précéder l'appel
aux balises dont on veut acquérir les notes. Par exemple, pour que cela
marche, j'ai la configuration suivante :
[(#TEXTE|rien)][(#NOTES|rien)]
[(#CHAPO)]
[(#TEXTE*|filtre_perso|propre)]

Si [(#NOTES|dummy)] n'est pas avant #CHAPO, je perds les notes éventuelles
dans le chapeau.

Je suis d'accord: ce n'est pas un bug (voir mon dernier message) mais
[(#TEXTE*|filtre_truc|propre|traiter_doublons_documents)] ne marche pas pour
autant: manque un argument à traiter_doublons_documents().

Ah, désolé pour la fausse piste ; oui le traitement des doublons est
une chose complexe...

Une solution pour toi c'est plus probablement de faire une fonction du
genre avant_propre().

PS : si tu gardes pour toi ce que tu mets dans filtre_truc(),
difficile de t'aider plus.

-- Fil

En triturant un squelette, je me suis rendu compte de la chose suivante. Soit
un fichier squelette servant à afficher des articles contenant un portfolio
du type :

<BOUCLE_documents(DOCUMENTS){id_article}{mode=document}{doublons}>
(Un portfolio)
</BOUCLE_documents>

Une telle boucle ne doit pas référencer les documents déjà présents
({doublons}), c'est-à-dire ceux intégrés au corps de l'article. Pour cela, il
faut que la balise #TEXTE soit présente dans le squelette car, si j'ai bien
compris, c'est son contenu qui est parcouru à la recherche d'éventuels
documents intégrés.

Or, dans mon squelette, j'utilise [(#TEXTE*|filtre_truc|propre)], c'est-à-dire
le #TEXTE brut filtré par la fonction filtre_truc puis renvoyé à propre pour
être mis en forme. Dans ce cas, la boucle documents ne semble plus repérer
les documents intégrés et les affiche tous dans le portfolio de l'article.

Pour contourner ce problème, j'ai placé un 2e appel à #TEXTE, mais sans
filtre, en commentaire PHP, de façon à ce que la page ne soit pas alourdie :
<?php /* #TEXTE */ ?>.

Ainsi, la boucle document ignore de nouveau les documents intégrés à
l'article.

Est-ce normal ? Me suis-je compliqué la vie inutilement parce qu'il existe une
autre man¦uvre ? Je n'ai pas trouvé beaucoup de doc à ce sujet.

----

Je confirme, il n'y a pas de bug. Mais la manipulation pour exclure le
dédoublement des documents inclus dans le texte sans affecter les NOTES peut
devenir assez tordu.

Voici comment nous y sommes arrivés, (d'après une suggestion d'un
utilisateur du squelette ALTERNATIVES).

atives/article.html

Les boucles et balises significatives sont, dans l'ordre, les suivantes :

<BOUCLE_article(ARTICLES) {id_article} {doublons} >
    [...(#TEXTE*|sommaire_article|propre)...]
    [...(#TEXTE*|decouper_en_page{#ID_ARTICLE}|propre)...]
    [...(#PS)...]
    [...(#NOTES)
    [(#TEXTE|?{""})]
  <BOUCLE_doc(DOCUMENTS) {id_article} {mode=document} {doublons}>
    [...]
  </BOUCLE_documents>
</BOUCLE_article>

À remarquer : [(#TEXTE|?{""})] entre #NOTES et la boucle DOCUMENTS.

André Vincent