#liste_articles {display:block}
designbyinook

|

Technologies

|

SPIP / CMS

|

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

 

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

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}
...

jeudi 16 avril 2009 par Patrick Vincent