SPIP - Contrib

[ar] [en] [es] [fr] [it]



Accueil du site > Navigation > Tris hétérogénes

Mélanger et trier des éléments hétérogénes

jeudi 20 octobre 2005, par mortimer. Dernier ajout mercredi 6 décembre 2006


Voici une boucle pour faire un affichage trié et mélangé de différents types d’éléments SPIP.


Principe Général

Nous allons afficher un mélange d’articles et de rubriques.

Le problème pour réussir un affichage trié de rubriques et d’articles, c’est qu’on ne peut pas faire une boucle qui sélectionne en même temps les deux. On peut soit faire une boucle ARTICLES soit une boucle RUBRIQUES.

On est donc obligé de faire l’affichage dans deux boucles différentes, ce qui complique un peu l’affichage des deux types d’éléments dans une même liste selon un certain ordre.

Voici une boucle qui offre une solution pour faire un affichage trié par date :

qui nous donnera un affichage du genre :

Rub: 2005-07-21 16:55:59 Blog
Art: 2005-07-21 16:39:54 And you, where are you?
Art: 2005-07-08 17:12:38 Il reste des politiciens de génie (au moins 1)
Art: 2005-07-04 16:33:58 Déménagement
Rub: 2005-07-01 16:08:12 Computing
Rub: 2005-07-01 16:08:12 Out There
Art: 2005-07-01 16:08:12 Easy Personal Podcasting
Art: 2005-07-01 15:38:30 Ecole Polytechnique de ???

La solution est en fait assez simple à comprendre :

  1. on commence par boucler sur toutes les rubriques (BOUCLE_rubriques)
  2. pour chaque rubrique, on regarde s’il y a des articles qui devraient être affichés avant, grâce au critère {date>#DATE}
  3. on affiche ensuite la rubrique
  4. une fois qu’on a parcouru toutes les rubriques, on affiche le reste des articles. Ceux qui sont plus vieux que toutes les rubriques du site.

Le critère {doublons} permet de ne pas afficher plusieurs fois le même article.

D’autres tris

On peut évidemment utiliser d’autres tris que le tri par date, il faut alors penser à modifier les critères en conséquence.

Par exemple, si on trie avec des numéros dans les titres, il faut remplacer :

  • {par date} {inverse} par {par num titre}
  • {date>#DATE} par {titre<#TITRE}

Subtilité avec les id_rubrique

Il faut bien faire attention, cette boucle affiche tous les articles et les rubriques du site. Si on voulait afficher seulement les articles et sous-rubriques de la rubrique du contexte, il faudrait se méfier du piège avec le critère id_rubrique de la boucle _articles.

En effet, imaginons qu’on soit dans un squelette entouré d’une boucle principale :

<BOUCLE_principale(RUBRIQUES) {id_rubrique}>

si on mettait juste {id_rubrique} dans la boucle _articles, on ne sélectionnerait pas les articles de la rubrique sélectionnée par la boucle _principale, mais les articles de la rubrique sélectionnée par la boucle _rubriques.

Il faudra donc utiliser le critère : {id_rubrique = #_principale:ID_RUBRIQUE} qui spécifie que l’on doit bien prendre les articles de la rubrique principale.

On aurait donc :

D’autres mélanges

Remarquez que cette méthode peut facilement s’appliquer à d’autres types d’éléments de SPIP. On peut tout aussi bien mélanger brèves et articles par exemple :

On peut même aller plus loin et mélanger 3 types d’éléments :

On mélange ici des articles, des brèves et des rubriques. On a donc ajouté des boucles brèves, qui sont considérées après toutes les autres.

On a donc :

  1. la boucle _breves dans la boucle _articles qui trouve toutes les brèves plus jeunes que l’article actuel,
  2. la boucle _breves2 dans la boucle _rubriques qui trouve toutes les brèves plus jeunes que la rubrique mais plus vieilles que tous les articles plus jeunes,
  3. la boucle _breves_fin1 dans la boucle _article_fin qui trouve toutes les brèves plus jeune que les articles plus vieux que toute rubrique,
  4. la boucle _breves_fin2 qui trouve les brèves plus vielles que tous les articles et que toutes les rubriques.

C’est pas beau tout ca ?


Répondre à cet article

  • PAGINATION

    4 avril 2008 07:46, par yoh

    Bonjour et merci pour cette contrib que j’ai longtemps cherché

    J’ai deux boucles imbriquées (qui fonctionne, ça me semble toujours incroyable) de la forme :

    <BOUCLE_site_yoh(SITES) {!par date}{syndication=non}>  

                            <BOUCLE_syndic_articles_yoh(SYNDIC_ARTICLES) {age_relatif<0}  {!par date}{doublons}>
                   
               
             <div class="texte"><a href="#URL_ARTICLE" ><b>[(#TITRE|supprimer_numero)]</b></a></div>    
           
     
                             </BOUCLE_syndic_articles_yoh>  
                         
             <div class="texte"><a href="#URL_SITE" ><b>[(#_site_yoh:NOM_SITE|supprimer_numero)]</b></a></div>    
           
          </BOUCLE_site_yoh>

    Cela liste, par date, les sites référencés non-syndiqués avec les articles_syndiqués de manière indifférencié.

    J’aimerai paginer cette liste mais je bloque depuis 2 jours dessus.

    Je n’arrive pas à faire comprendre à la balise #PAGINATION qu’il lui faut additionner les articles_syndiqués avec les sites non-syndiqués avant de faire son job.

    Si quelqu’un a une idée de piste, je suis preneur :)

    Merci d’avance

    Répondre à ce message

    • PAGINATION 22 avril 2008 08:36, par yoh

      Après pas mal de recherche, pagination impossible.

      J’ai donc afficher les résultats par age<30jrs puis avec l’aide de boutons par mois.

      Cela marche :)

      Répondre à ce message

    Retour au début des forums

  • Mélanger et trier des éléments hétérogénes

    19 décembre 2007 20:04, par Patrick

    <BOUCLE_articles(ARTICLES) {id_rubrique} [{par num titre}{inverse}][!{par date}{inverse}] {pagination}>

    Voilà ce que j’utilise pour allier le numéro et la date dans l’ordre (inverse pour les numéros).

    Répondre à ce message

    Retour au début des forums

  • Cas d’utilisation avec le filtre supprimer_numero

    7 août 2007 14:57, par Jean Baptiste Pressac

    Je me permet de signaler que si vous voulez utiliser cette boucle pour effectuer des tris avec des numéros dans les titres et que vous utilisez le filtre supprimer_numero pour faire disparaitre le numéro, vous devez faire suivre d’une astérisque la balise #TITRE du filtre {titre<#TITRE*} comme évoqué sur le forum. La boucle devient donc :

    <BOUCLE_rubriques(RUBRIQUES) {par num titre}>
        <BOUCLE_articles(ARTICLES) {par num titre} {doublons} {titre<#TITRE*}>
             Article: #TITRE<br>
        </BOUCLE_articles>
        Rubrique: #TITRE<br>
    </BOUCLE_rubriques>

    <BOUCLE_article_fin(ARTICLES) {par num titre}{doublons}>
        Article: #TITRE<br>
    </BOUCLE_article_fin>

    Répondre à ce message

    Retour au début des forums

  • C’est beau. Bravo et merci infiniment pour cette contribution fort utile.

    Répondre à ce message

    Retour au début des forums

  • Mélanger brèves et articles

    22 mars 2007 10:39, par tetue

    Moi je m’en sers systématiquement dans le « backend » pour construire un flux RSS qui diffuse à la fois les brèves et les articles.

    Répondre à ce message

    Retour au début des forums

  • Mélanger et trier des éléments hétérogénes

    14 août 2006 15:42, par indie

    Félicitations, ça marche à merveille.

    Répondre à ce message

    Retour au début des forums

  • Mélanger et trier des éléments hétérogénes

    23 novembre 2005 15:56, par MTM

    Bonjour,

    excellente l’idée, j’ai voulu la tester mais hélas, elle n’a pas fonctionné pour mon cas.

    en fait je souhaiterais afficher l’arborescence d’une rubrique et trier ses éléments par ordre alphabétique, et ceux-ci de manière récursive.

    ex :

    • rub
      • art 1.
      • rub 2.
        • art 2.1
        • art 2.2
        • rub 2.3
          • ...
      • art 3.

    j’ai donc voulu utiliser cet algo, (car il s’agit bien d’un algo), et l’adapter pour qu’il fonctionne de manière récursive.

    j’ai alors constaté deux problèmes :
    - le premier se situe au niveau de la condition id_rubrique=#_principal:ID_RUBRIQUE
    - le second a déjà été mentionné, il s’agit de la condition titre<#TITRE qui ne fonctionne pas visiblement, d’ autant que dans mon cas il faudrai plutôt utiliser num titre<#TITRE, mais cela ne fonctionne pas évidemment

    voici une partie de mon code :

    si quelqu’un voit où je me suis trompé, ou a une solution alternative, je suis intéréssé.

    d’autant plus que je pense que ce morceau de code, s’il fonctionne sera d’une grande utilité pour beaucoup de monde.

    Merci

    Répondre à ce message

    Retour au début des forums

  • Mélanger et trier des éléments hétérogénes

    3 novembre 2005 16:47, par nic ;o)

    Vraiment chouette !
    - Merci ;-)

    Répondre à ce message

    Retour au début des forums

  • Mélanger et trier des éléments hétérogénes

    21 octobre 2005 15:03, par balluche

    Cà fait des lustres que je cherche une solution pour ordonner les articles et les sous rubriques d’une rubrique en même temps. Un problème se pose si on souhaite trier par autre chose qu’une date. Si tu peux me trouver une soluce ...

    J’ai déjà commencé avec ton exemple mais çà me paraît pas viable, sachant que le critère {titre<#TITRE} pour la sous-boucle article semble ne pas marcher et que de toutes façons il faudrait prendre en charge le numéro dans le titre (qui sert à ordonner) comme on le fait pour le tri {par num titre}.

    Mon code :

    Voir en ligne : Comment je me suis créé une boucle ARTICLES_RUBRIQUES

    Répondre à ce message

    Retour au début des forums

  • Mélanger et trier des éléments hétérogénes

    20 octobre 2005 23:59, par Nicolas Hoizey

    Incroyable, bravo !!!

    Répondre à ce message

    Retour au début des forums

  • Mélanger et trier des éléments hétérogénes

    20 octobre 2005 18:02, par zagtag

    c’est super bô ! pas encore testé, mais ca fait longtemps que je souhaites effectuer ce genre de tri !

    Voir en ligne : gabriel.zeta

    Répondre à ce message

    Retour au début des forums



Suivre la vie du site RSS 2.0 | Plan du site | Espace privé | Charte et vie SPIP-Contrib | SPIP | L'autre.net