Sur une 2.1.8, une boucle avec un filtre |unique à l'intérieur,
utilisée dans un modèle, lui-même appelé dans un article,
apparait très bien dans la visu de l'article en partie privée,
mais n'apparaît pas
(ou parfois seulement, peut être lors des recalculs automatiques)
dans la visu de l'article en partie publique.
Par exemple
un modele testmod.html
<BOUCLE_mod(ARTICLES)>
[(#TITRE|unique)]
</BOUCLE_mod>
appelé par <testmod2011> dans un article
s'affiche parfaitement dans la prévisu privée de l'article
mais pas du tout en partie publique.
Possible que ton #TEXTE passe deux fois par propre() ? Auquel cas
lors du second passage |unique aurait déjà vu l'élément et renverrait
la chaîne vide... ça peut être le cas avec certains plugins, je
crois... peut-être la table des matières ?
Possible que ton #TEXTE passe deux fois par propre() ? Auquel cas
lors du second passage |unique aurait déjà vu l'élément et renverrait
la chaîne vide... ça peut être le cas avec certains plugins, je
crois... peut-être la table des matières ?
Ah, ça pourrait être une piste en effet, mais j'ai testé sur 2 sites différents,
l'un en mutu mais totalement vierge, avec la dist donc, et sans aucun plugin
l'autre avec plugins mais sans mutu.
Dans les 2 cas la partie privée affiche le contenu du modele
et la partie publique n'affiche rien.
Possible que ton #TEXTE passe deux fois par propre() ? Auquel cas
lors du second passage |unique aurait déjà vu l'élément et renverrait
la chaîne vide... ça peut être le cas avec certains plugins, je
crois... peut-être la table des matières ?
Ah, ça pourrait être une piste en effet, mais j'ai testé sur 2 sites différents,
l'un en mutu mais totalement vierge, avec la dist donc, et sans aucun plugin
l'autre avec plugins mais sans mutu.
Dans les 2 cas la partie privée affiche le contenu du modele
et la partie publique n'affiche rien.
Bon c'est dû apparemment à la balise INTRODUCTION
(depuis semble t il une nouvelle implémentation de cette balise)
qui lit le contenu de TEXTE pour se construire,
au fait que mon modèle ne peut pas être appelé plusieurs fois dans une page,
et au fait qu'il y a pas de caches propre aux modèles,
au fait que le filtre |unique a un fonctionnement global à la page HTML, pas au squelette,
et que donc les valeurs mémorisées se cumulent à chaque usage.
Quand TEXTE est lu pour INTRODUCTION, |unique se charge avec toutes les valeurs,
et quand TEXTE est à nouveau calculé pour être affiché,
unique ne renvoie plus rien puisqu'il connait déjà tout.
J'ai réglé le pb en utilisant des SET et GET à la place, assez facile à faire dans mon cas.
Dans le cas général, il y aurait une manière de faire pour assurer
que le 2eme appel renvoie la même chose que le premier :
"nommer le |unique" avec un identifiant renvoyé par exemple par uniquid. #SET{ident, #REM|uniquid}
puis utiliser |unique{#GET{ident}}
Possible que ton #TEXTE passe deux fois par propre() ? Auquel cas
lors du second passage |unique aurait déjà vu l'élément et renverrait
la chaîne vide... ça peut être le cas avec certains plugins, je
crois... peut-être la table des matières ?
Ah, ça pourrait être une piste en effet, mais j'ai testé sur 2 sites différents,
l'un en mutu mais totalement vierge, avec la dist donc, et sans aucun plugin
l'autre avec plugins mais sans mutu.
Dans les 2 cas la partie privée affiche le contenu du modele
et la partie publique n'affiche rien.
Bon c'est dû apparemment à la balise INTRODUCTION
(depuis semble t il une nouvelle implémentation de cette balise)
qui lit le contenu de TEXTE pour se construire,
au fait que mon modèle ne peut pas être appelé plusieurs fois dans une page,
et au fait qu'il y a pas de caches propre aux modèles,
au fait que le filtre |unique a un fonctionnement global à la page HTML, pas au squelette,
et que donc les valeurs mémorisées se cumulent à chaque usage.
Quand TEXTE est lu pour INTRODUCTION, |unique se charge avec toutes les valeurs,
et quand TEXTE est à nouveau calculé pour être affiché,
>unique ne renvoie plus rien puisqu'il connait déjà tout.
J'ai réglé le pb en utilisant des SET et GET à la place, assez facile à faire dans mon cas.
Dans le cas général, il y aurait une manière de faire pour assurer
que le 2eme appel renvoie la même chose que le premier :
"nommer le |unique" avec un identifiant renvoyé par exemple par uniquid. #SET{ident, #REM|uniquid}
puis utiliser |unique{#GET{ident}}
Enfin, ya une autre solution : coder à nouveau INTRODUCTION
comme elle l'était avant la modif de ESJ.
Attention, cette modif de CERDIC avait aussi des conséquences sur les #NOTES : du coup #INTRODUCTION maintenant enregistre les notes, se
calcule, puis rétablit les notes. Pas glop !
Oui, mais ça, est-ce que c'est pas un bug de conception des notes ?
Plus prosaïquement, la boite de pandore a été ouverte avec les modèles, qui génèrent un contenu riche,
dont on est en droit d'attendre qu'il soit reflété par #INTRODUCTION
Pour en revenir au bug initial, il est aussi une conséquence de l'absence de cache des modèles,
qui fait qu'un même modèle avec même env affiché deux fois dans le hit est calculé deux fois.
On pourrait sans doute optimiser a raison ce point par stockage en static (afin d'avoir un seul calcul par hit du même modèle)
Attention, cette modif de CERDIC avait aussi des conséquences sur les #NOTES : du coup #INTRODUCTION maintenant enregistre les notes, se
calcule, puis rétablit les notes. Pas glop !
Oui, mais ça, est-ce que c'est pas un bug de conception des notes ?
oui les deux se cumulent ;
Plus prosaïquement, la boite de pandore a été ouverte avec les modèles, qui génèrent un contenu riche, dont on est en droit d'attendre qu'il soit reflété par #INTRODUCTION
oui et non… je comprend l'intention dans certains cas, mais le choix
qui consiste à tout calculer deux fois est aussi criticable, ne
serait-ce que d'un point de vue écologique lorsque les textes sont
longs à calculer (j'ai comme exemple de modèle, un roman de 300 pages
que j'extrais d'un fichier .tex …)
Pour en revenir au bug initial, il est aussi une conséquence de l'absence de cache des modèles,
qui fait qu'un même modèle avec même env affiché deux fois dans le hit est calculé deux fois.
On pourrait sans doute optimiser a raison ce point par stockage en static (afin d'avoir un seul calcul par hit du même modèle)
ça serait une solution, avec un petit hic si un même texte doit être
répété deux fois mais générer du contenu différent (ex: texte
contenant des notes, ou contenant un modèle qui dépend de
je-ne-sais-quoi). Mais puisqu'il s'agit de faire un compromis entre
divers critères, on peut décider que c'est ça qu'on sacrifie.
Attention, cette modif de CERDIC avait aussi des conséquences sur les #NOTES : du coup #INTRODUCTION maintenant enregistre les notes, se
calcule, puis rétablit les notes. Pas glop !
Plus prosaïquement, la boite de pandore a été ouverte avec les modèles, qui génèrent un contenu riche, dont on est en droit d'attendre qu'il soit reflété par #INTRODUCTION
oui et non… je comprend l'intention dans certains cas, mais le choix
qui consiste à tout calculer deux fois est aussi criticable, ne
serait-ce que d'un point de vue écologique lorsque les textes sont
longs à calculer (j'ai comme exemple de modèle, un roman de 300 pages
que j'extrais d'un fichier .tex …)
Je suggère ici une autre manière de faire.
C'est pas totalement cerné et pas idéal mais c'est original :
un peu comme différentes "facettes" d'un modèle, se révélant selon le contexte de calcul.
Etant donné qu'il y a différents contextes de calcul d'un modèle,
il n'est pas abérant de penser qu'on attend différents résultats de ces calculs.
Par exemple, pour une INTRODUCTION, il pourrait être plus pertinent
qu'un modele renvoie un descriptif du texte ordinairement renvoyé,
plutôt que ce texte dans son intégralité.
L'idée serait donc de permettre de spécifier dans le corps du modele
ce que celui ci doit renvoyer dans un contexte particulier.
Par exemple : #ALTERNATIVE reçoit en argument le texte à renvoyer
dans un contexte d'appel alternatif #ALTERNATIVE{un texte simple et rapide à calculer}
Eventuellement #ALTERNATIVE peut recevoir un 2nd argument qui décrit le contexte
d'appel pour lequel ce renvoi alternatif doit être utilisé
(pour pouvoir en proposer plusieurs selon le contexte) : #ALTERNATIVE{Ici un truc simple et rapide à calculer, introduction}