#liste_articles {display:block}

SPIP - requête et tri sur des éléments hétérogènes

jeudi 16 avril 2009

 

SPIP 2.x

Voici une méthode permettant d’éviter le recours au php pour trier par date les éléments hétérogènes (d’une même rubrique dans cet exemple) : articles, documents, articles issus de sites syndiqués.

Cette solution nécessite l’installation préalable du plugin SPIP Bonux et de ses très utiles #SET_MERGE et BOUCLE(POUR).

On stocke d’abord les différents éléments dans un tableau associatif ayant comme index la date de l’objet. On évite les doublons en ajoutant le type d’objet collé à l’index.
Enfin on restitue les différentes données ordonnées par date grâce à la boucle POUR :

[(#REM)Boucle sur le contenu d'une rubrique et tri par date : articles, sites, documents
Paramètres du squelette :
- id_rubrique]
       
[(#REM)-- Initialisation des variables --]
        #SET{iteration,10}
        #SET{contenus, #ARRAY}
       
[(#REM)-- Construction des listes de contenus --]
<BOUCLE_art(ARTICLES){id_rubrique}{0,#GET{iteration}}{!par date}>
#SET_MERGE{contenus,#GET{contenus},#ARRAY{#DATEart#ID_ARTICLE,#ARRAY{art,#ID_ARTICLE}}}
</BOUCLE_art>
       
<BOUCLE_syndic(SYNDIC_ARTICLES){id_rubrique}{0,#GET{iteration}}{!par date}>
#SET_MERGE{contenus,#GET{contenus},#ARRAY{#DATEsynd#ID_SYNDIC_ARTICLE,#ARRAY{synd,#ID_SYNDIC_ARTICLE}}}
</BOUCLE_syndic>
       
<BOUCLE_doc(DOCUMENTS){id_rubrique}{0,#GET{iteration}}{!par date}>
#SET_MERGE{contenus,#GET{contenus},#ARRAY{#DATEdoc#ID_DOCUMENT,#ARRAY{doc,#ID_DOCUMENT}}}
</BOUCLE_doc>
       
[(#REM)-- Tri par date et affichage des contenus --]
<BOUCLE_tri(POUR){tableau #GET{contenus}}{!par cle}>
        [(#REM)<br />Date : #CLE]
       
        [(#REM)Articles]
        <BOUCLE_test_art(POUR){tableau #VALEUR}{cle==art}>
        <INCLURE{fond=contenu-detail}{id_article=#VALEUR}{env}>
        </BOUCLE_test_art>
       
        [(#REM)Syndic]
        <BOUCLE_test_synd(POUR){tableau #VALEUR}{cle==synd}>
        <INCLURE{fond=contenu-detail}{id_syndic_article=#VALEUR}{env}>
        </BOUCLE_test_synd>
       
        [(#REM)Docs]
        <BOUCLE_test_doc(POUR){tableau #VALEUR}{cle==doc}>
                <INCLURE{fond=contenu-detail}{id_document=#VALEUR}{env}>
        </BOUCLE_test_doc>
</BOUCLE_tri>

Il est à compléter par l’appel à un squelette affichant ou traitant le détail des différents éléments :
contenu_detail.html

<BOUCLE_article(ARTICLES){id_article}>
        #SET{titre,#TITRE}
        ...
</BOUCLE_article>       
               
<BOUCLE_document2(DOCUMENTS){id_document}>
        #SET{titre,#TITRE}
        ...
</BOUCLE_document2>       
               
<BOUCLE_syndic(SYNDIC_ARTICLES){id_syndic_article}>
        #SET{titre,#TITRE}
        ...
</BOUCLE_syndic>

#GET{titre}
...

Documents :

par Patrick Vincent