SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

289 Plugins, 197 contribs sur SPIP-Zone, 120 visiteurs en ce moment

Accueil > Documentation > Tutoriels pour webmasters > Utiliser |unique dans un modèle

Utiliser |unique dans un modèle

19 mai 2012 – par Joseph – commentaire

8 votes

L’utilisation du filtre |unique peut parfois réserver quelques surprises. Petite astuce pour un bon fonctionnement.

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 :

  1. <BOUCLE_art(ARTICLES){id_rubrique=#ENV{id}} {par date} {inverse}>
  2.  [<h3 class="SPIP">(#DATE|affdate_mois_annee|unique)</h3>]
  3. <p> #TITRE</p>
  4. </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 :

  1. [<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 :

  1. #SET{alea, #EVAL{rand()}}
  2. <BOUCLE_art(ARTICLES){id_rubrique=#ENV{id}} {par date} {inverse}>
  3.  [<h3 class="SPIP">(#DATE|affdate_mois_annee|unique{#GET{alea}})</h3>]
  4. <p> #TITRE</p>
  5. </BOUCLE_art>

... et le tour est joué !

Dernière modification de cette page le 28 mai 2012

Retour en haut de la page

Vos commentaires

  • Le 15 décembre 2015 à 16:53, par Lire et Écrire En réponse à : Utiliser |unique dans un modèle

    Ça fonctionne bien entendu aussi dans un squelette inclus. J’avais le souci avec une newsletter, où le plugin calcule deux pages : l’une pour l’envoi (avec une lien de visualisation et les infos de désinscription) et l’autre pour la visualisation sur le site.

    Le filtre |unique n’était pas « remis à zéro » entre les deux et ne renvoyait rien pour la page de visualisation :-/

    Je cherchais comment le remettre à zéro mais, apparemment, la seule manière est le rand(), comme tu le proposes. Merci pour le partage !

    Répondre à ce message

Répondre à cet article

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Formidable, le générateur de formulaires

    23 janvier 2012 – 2446 commentaires

    Un générateur de formulaires facilement configurable pour les non-informaticiens et facilement extensible pour les développeurs. Introduction L’objectif était de créer un plugin permettant de générer des formulaires. Historiquement, 2 plugins (...)

  • ORR v2

    21 mai 2013 – 106 commentaires

    ORR, le plugin d’Organisation des Réservations et des Ressources passe en version 2, avec quelques nouveautés attendues. Je ne reprendrai pas les explications données dans la version 1. Les nouveautés : 1. Gestion des autorisations Le principe (...)

  • Visualiser un PDF dans un article

    13 juin – commentaires

    SoyezCréateurs utilise un modèle pour afficher un PDF dans le corps d’un article Un peu d’histoire Avant, les navigateurs n’incluaient pas de lecteur PDF nativement ce qui avait conduit à la création du plugin Lecteur pdf javascript pdf.js. Mais, (...)

  • Aveline v2

    9 novembre 2012 – 97 commentaires

    Aveline est une collection de noisettes hautement paramétrables, compatibles avec les thèmes Z et à inclure dans vos pages avec le noiZetier. Compatibilité Cette version 2 du plugin Aveline s’utilise, sous SPIP 3, avec la version 2 du noizetier, (...)

  • Speedsyndic pour SPIP 2 et SPIP 3

    11 octobre 2010 – 32 commentaires

    Ce plugin est une version compatible spip 2.0.x / 2.1 / 3.1 du plugin Speedsyndic Note : Une bonne partie du texte ci-dessous a été pompé de cet article, expliquant la version précédente du plugin. je n’ai fait qu’adapter le code pour spip 2, ajouter (...)