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