Contexte
Supposons que l’on souhaite réaliser un modèle « artrecents » listant les derniers articles publiés dans une rubrique passée en paramètre, en séparant les articles selon leur mois de publication.
On va donc créer un fichier modeles/artrecents.html
contenant :
<BOUCLE_art(ARTICLES){id_rubrique=#ENV{id}} {par date} {inverse}>
[<h3 class="SPIP">(#DATE|affdate_mois_annee|unique)</h3>]
<p> #TITRE</p>
</BOUCLE_art>
Il ne reste alors plus qu’à ajouter dans le texte d’un article l’appel suivant : <artrecents10>
pour afficher la liste des derniers articles publiés dans la rubrique 10.
Après validation des modifications de l’article, on obtient bien dans l’interface privée le résultat suivant :
mars 2012
Article AAA
Article BBB
février 2012
Article CCC
Article DDD
Le problème
Le modèle semble fonctionner sans problème. Content de vous, vous validez l’article et aller le consulter côté public. Et là, patatra, seuls les titres des articles sont présents, les mois / années ayant disparus :
Article AAA
Article BBB
Article CCC
Article DDD
comme si le filtre |unique
ne renvoyait rien tout.
L’orgine du souci n’est pas forcément évidente à première vue, mais il y a fort à parier que le modèle a été exécuté plus d’une fois lors du calcul de la page. Vérifiez votre squelette. La plupart, dont la dist, prévoit dans l’en-tête html de la page le code suivant :
[<meta name="description" content="(#INTRODUCTION{150}|attribut_html)" />]
Lors de l’appel de la balise #INTRODUCTION
, le texte de l’article, incluant de fait le modèle, est calculé une première fois, puis transformé en texte brut et coupé à 150 caractères.
Dès lors, lorsque la balise #TEXTE
est appelée dans le squelette, le modèle est recalculé une seconde fois. Sauf que les valeurs mois année ayant déjà été rencontrées plus tôt (au moment du calcul de #INTRODUCTION
), le filtre |unique
ne renvoit donc rien, d’où problème.
Une solution
D’une certaine manière, on souhaite que le filtre |unique
soit en quelque sorte réinitialisé à chaque appel du modèle. D’après la documentation du dit filtre, il faut passer un paramètre au filtre afin de différencier des utilisations indépendantes, paramètre qui a besoin d’être différent à chaque calcul du modèle.
Le plus simple est alors de générer une valeur aléatoire à chaque appel du modèle, valeur qui sera ensuite transmise à |unique
, ce qui permet de le « réinitialiser ».
Le code du modèle sera alors modifié comme suit :
#SET{alea, #EVAL{rand()}}
<BOUCLE_art(ARTICLES){id_rubrique=#ENV{id}} {par date} {inverse}>
[<h3 class="SPIP">(#DATE|affdate_mois_annee|unique{#GET{alea}})</h3>]
<p> #TITRE</p>
</BOUCLE_art>
... et le tour est joué !
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |