Mélanger brèves et articles

15 mars 2007,
par Romy Têtue

Mots-clefs associés à cet article :

Lorsqu’il s’agit de suivre l’actualité du site, souvent il importe peu que l’internaute distingue entre les articles et les brèves. Épargnons-lui d’avoir à s’abonner à deux flux de syndication distincts, en réunissant articles et brèves en un seul fichier RSS.

Brèves et articles sont deux éléments qu’il n’est pas toujours nécessaire de traiter distinctement. J’ai souvent eu besoin de les lister indistinctement, tantôt dans un plan de site, tantôt à la page des nouveautés du site, tantôt dans le fichier de syndication. Or le système de boucle de SPIP ne permet d’appeler qu’un type d’élément à la fois : brèves OU articles, mais pas les deux en même temps.

Voici donc le bout de code que j’utilise pour ce faire (pour SPIP 1.8.2 et supérieure) :

<ul>
        <BOUCLE_articles(ARTICLES) {!par date}>
        
                <BOUCLE_breves(BREVES) {age_relatif<0} {!par date} {doublons}>
                <li>[(#DATE|affdate{'d|m|Y'}) : ] <a href="#URL_BREVE">#TITRE</a></li>
                </BOUCLE_breves>
        
        <li>[(#DATE|affdate{'d|m|Y'}) : ] <a href="#URL_ARTICLE">#TITRE</a></li>
        
        </BOUCLE_articles>
</ul>

Il s’agit d’une boucle ARTICLES, au sein de laquelle est imbriquée une boucle BREVES, qui compare les dates des brèves à celle de chaque article. Si une (ou des) brève(s) plus récente(s) existent, elle(s) est(seront) affichée(s) avant l’article, et ainsi de suite, pour chaque article. On obtient donc une liste mélangée de brèves et d’articles correctement classés par ordre antéchronologique.

Remarques :

  • Le critère {doublons} sur la boucle imbriquée est important : il permet à cette boucle de ne pas ressortir un résultat précédemment trouvé.
  • Ceci peut être étendu aux autres éléments de SPIP, en imbriquant les unes dans les autres des boucles de messages de forum, rubriques, sites ou auteurs.
  • Utiliser un critère autre que celui de tri par date est périlleux. En effet, la date est le seul champ commun à toutes les tables SPIP. D’autre part, et c’est pourquoi, le fonctionnement de cette boucle repose sur le critère {age_relatif} qui permet de comparer les dates de publication [1].
  • Attention : il est impossible de limiter précisément le nombre de résultats affichés. On peut par exemple limiter à 10 le nombre de résultats de la première boucle (articles), mais les résultats trouvés par la boucle imbriquée (brèves) viendront augmenter ce nombre. Notez aussi que les résultats ne sont plus satisfaisants lorsqu’une de ces boucles est dotée d’une pagination.

Diffuser brèves et articles via le même flux

Ces restrictions cantonnent ce bout de code à un usage précis, dont le plus adapté est la construction d’un fichier de syndication mélangeant brèves et articles. En voici le code complet (pour SPIP 1.9), à placer dans le fameux fichier backend.html :

<BOUCLE_articles(ARTICLES) {lang ?}{branche ?}{id_mot ?} {!par date} {0,10} {unique}>
        <BOUCLE_breves(BREVES) {lang ?}{id_mot ?} {age_relatif<0} {!par date} {doublons}>
        <INCLURE{fond=inc-rss-item-breve}{id_breve}>
        </BOUCLE_breves>
<INCLURE{fond=inc-rss-item-article}{id_article}>
</BOUCLE_articles>

Ce code appelle deux noisettes : inc-rss-item-breve.html et inc-rss-item-article.html (à télécharger ci-après), construites sur le modèle du fichier backend de la dist SPIP 1.9.

{#TITRE,#URL_ARTICLE,#INTRODUCTION}

Vos commentaires

  • Le 24 mars 2007 à 15:47, par Richard Aubry En réponse à : Mélanger brèves et articles

    N’y a-t-il pas une erreur dans la boucle BREVES ? Ne devrait-on pas y lire « #URL_BREVE » plutôt que « #URL_ARTICLE » ?

  • Le 25 mars 2007 à 22:29, par Romy Têtue En réponse à : Mélanger brèves et articles

    Si, évidemment ! C’est corrigé.

  • Le 27 mars 2007 à 07:35, par Stéphane Deschamps En réponse à : Mélanger brèves et articles

    Tiens Romy je n’avais pas fait attention : {!par date}, je suppose que c’est la même chose que {par date}{inverse} ?

    J’ai regardé la doc, mais elle n’a pas l’air d’être à jour pour l’instant.

  • Le 27 mars 2007 à 09:52, par Romy Têtue En réponse à : Mélanger brèves et articles

    Oui le « ! » est une négation, et cette syntaxe a été introduite en SPIP 1.8.2.

  • Le 19 avril 2007 à 13:22, par Stéphane Deschamps En réponse à : Mélanger brèves et articles

    Je suis vraiment en retard sur Spip. Heureusement que Paris Web m’a forcé à m’y replonger.

    Soit dit en passant, c’est le genre d’endroit bien précis où je préfère repasser par du PHP : il est impossible de limiter précisément le nombre de résultats affichés.

    Je préfère stocker une boucle de 10 brèves dans un tableau (Array), puis 10 articles dans le même tableau. Ensuite je trie par date, et je limite à 10.

    (je ne colle pas ici le code complet de ma home, elle finira sur la zone pour les curieux)

  • Le 8 juin 2008 à 10:25, par Dimitri En réponse à : Mélanger brèves et articles

    Bonjour j’ai tester votre boucle nikel !!!
    Par contre j’aimerais qu’il publie tout sauf la rubrique Vidéos et Dossiers comment faire ?

    Merci d’avance ....

  • Le 14 avril 2009 à 11:27, par JB En réponse à : Mélanger brèves et articles

    Bonjour, et merci pour vos billets SPIP, toujours très instructifs.
    Je souhaiterais utiliser ce mélange breve/article dans une boucle récupérant les derniers messages (commentaires) postés sur le site, mais je ne parviens pas à récupérer l’identifiant id_breve fourni par la boucle forum.

    Voici mon code :

                                    <BOUCLE_forums_liens(FORUMS) {plat} {par date}{inverse} {0,12}>
                                            <BOUCLE_art(ARTICLES) {id_article}>
                                                    <BOUCLE_brv(BREVES) {id_breve=(#_forums_liens:ID_BREVE)}{age_relatif<0} {!par date} {doublons}>
                                                            [<li>[(#_forums_liens:DATE|affdate{'d/m H:m'})] - <b>[(#_forums_liens:NOM|?{#_forums_liens:NOM,'Anonyme'})]</b> à propos de <a href="[(#TITRE|!={'SquashLibre'}|?{#_forums_liens:URL_FORUM,#_forums_liens:URL_SITE/spip.php?page=voirsujet&id_forum=#_forums_liens:ID_THREAD#forum#_forums_liens:ID_FORUM})]" id="commtexte"><span id="commsujet">[(#_forums_liens:TITRE|couper{30})]</span> : (#_forums_liens:TEXTE|couper{140})</a></li>]
                                                    </BOUCLE_brv>
                                                    <BOUCLE_rub(RUBRIQUES){id_rubrique}>
                                                            [<li>[(#_forums_liens:DATE|affdate{'d/m H:m'})] - <b>[(#_forums_liens:NOM|?{#_forums_liens:NOM,'Anonyme'})]</b> à propos de <a href="[(#TITRE|!={'SquashLibre'}|?{#_forums_liens:URL_FORUM,#_forums_liens:URL_SITE/spip.php?page=voirsujet&id_forum=#_forums_liens:ID_THREAD#forum#_forums_liens:ID_FORUM})]" id="commtexte"><span id="commsujet">[(#_forums_liens:TITRE|couper{30})]</span> : (#_forums_liens:TEXTE|couper{140})</a></li>]
                                                    </BOUCLE_rub>
                                            </BOUCLE_art>
                                    </BOUCLE_forums_liens>

    Si quelqu’un peut m’aider, je suis preneur...
    Merci d’avance,

  • Le 14 avril 2009 à 11:55, par JB En réponse à : Mélanger brèves et articles

    Deux précisions concernant mon post :

    1. Il ne faut évidemment pas de parenthèse pour essayer de récupérer l’ID_BREVE : <BOUCLE_brv(BREVES) {id_breve=#_forums_liens:ID_BREVE}
    2. Je crois avoir compris que le pb se situe dans le fait que la boucle article à qui l’on passe l’id_article pointe déjà sur cet article, donc l’occurrence d’une breve ne peut pas exister dans ce cas.

    Oui mais comment résoudre mon pb du coup ? Je cherche en tout cas !

  • Le 4 février 2010 à 17:49, par Jeddo En réponse à : Mélanger brèves et articles

    Merci pour cette contribution. Je l’ai utilisée pour le flux RSS. Néanmoins, pour que cela fonctionne, j’ai dû modifier une ligne dans backend.html :

    Remplacer <?xml version=

  • Le 9 août 2010 à 20:56, par ChristianD. En réponse à : Mélanger brèves et articles

    Bonjour,

    Cette boucle est exactement celle que je recherche depuis un certain temps.

    Le seul hic est qu’elle ne tient pas compte de mon critère {0,3}, car je souhaite ne ramener que 3 brèves. Or, la boucle m’en ramène un certain nombre.

    Comment faire pour n’avoir que les 3 dernières brèves ?

    Merci d’avance de vos réponses.

  • Le 9 août 2010 à 21:12, par ChristianD. En réponse à : Mélanger brèves et articles

    Oups, avec le code, c’est peut-être mieux :

    <BOUCLE_art1(ARTICLES){!par date}{!id_mot=104}{0,3}>
                            <BOUCLE_breves(BREVES){age_relatif<=0}{!par date}{doublons}{!id_mot=104}{0,3}>
                                    <li><a href="#URL_BREVE">
                                            <h3>#TITRE</h3>
  • Le 11 août 2010 à 22:06, par Romy Têtue En réponse à : Mélanger brèves et articles

    C’est le problème de cette méthode, avec laquelle il est impossible de limiter précisément le nombre de résultats affichés.

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
  • Raccourcis : {{gras}} {italique} -liste [bla->url] <q> <quote> <code>.

Suivre les commentaires : RSS 2.0 | Atom