Mélange d’éléments hétérogènes

Une méthode pour mélanger autant de type d’éléments voulus et de se servir de toutes les possibilité des boucles, par exemple la pagination.

Avec SPIP Bonux ou Spip 3, nous allons pouvoir utiliser une autre méthode qui va nous permettre de mélanger un nombre illimité d’éléments, d’utiliser les paginations, ou encore d’autres possibilités offertes par le système de boucles habituelles.

La base du système.

Nous allons utiliser des tableaux de tableaux d’éléments. Chaque élément sera constitué de 3 éléments : Son type d’objet [1], son identifiant [2], et le champ de tri qui sera utilisé dans la boucle suivante.

Ensuite nous utilisons une boucle POUR [3].
Pour faciliter la mise en place des tableaux, nous remplissons des variables avec la balise #VALEUR, le filtre |table_valeur et la balise #SET.

Dans l’ordre :

  1. Création du tableau.
  2. Remplissage du tableaux avec les tableau des éléments avec des boucles dédiées.
  3. Boucle sur le tableau ordonné à notre convenance.
  4. Dans cette boucle nous utilisons soit un filtre de test |oui pour inclure chaque squelettes en fonction du type d’objet, soit une boucle CONDITION pour afficher le contenu selon le type d’objet, cette possibilité peut se faire dans un autre fichier ; [4].

Nous présentons 2 possibilités à la suite. La première inclut un fichier commun pour tous les éléments, le 2e se sert du filtre |oui pour l’un des éléments et une boucle CONDITION pour l’autre.

Cela nous permet d’utiliser toutes les fonctionnalités de tri sur la dernière boucle, les filtres étant appliqués sur les premières boucles.

Exemple pour une liste de brèves et d’articles d’une rubrique triés par date

Création et remplissage du tableau : nous utilisons la balise #SET pour créer et remplir un tableau défini par #ARRAY. Il serait possible d’ajouter les éléments avec |push, nous utilisons ici la balise #SET_PUSH fournie par le plugin bonux.

[(#REM) On créé le tableau]
#SET{elements,#ARRAY{}}

[(#REM) On le remplit avec les articles de la rubrique en cours]
<BOUCLE_articles(ARTICLES){id_rubrique}>
	#SET{element, #ARRAY{objet,"article",id_objet,#ID_ARTICLE,date,#DATE}} 
	#SET_PUSH{elements,#GET{element}}
</BOUCLE_articles>

[(#REM) On le remplit avec les brèves de la rubrique en cours]
<BOUCLE_breves(BREVES){id_rubrique}>
	#SET{element, #ARRAY{objet,"breve",id_objet,#ID_BREVE,date,#DATE}} 
	#SET_PUSH{elements,#GET{element}}
</BOUCLE_breves>

Construction de la boucle pour récupérer les éléments du tableau, rien de difficile sur cette boucle. Nous remplissons 2 variables : objet et id_objet avec les valeurs des tableaux d’éléments. Nous utilisons |table_valeur sur la #VALEUR pour raccourcir le code et faciliter la mise en place. Un autre choix serait d’utiliser directement la boucle condition dans cette boucle. Cette boucle peut remplacer la boucle de contenu/rubrique.html de Le Squelette Zpip.

<B_elements><div class="liste"><ul class="list-items">
<BOUCLE_elements(POUR){tableau #GET{elements}}{!par date}{pagination 5}>
	#SET{id_objet,#VALEUR|table_valeur{id_objet}}
	#SET{objet,#VALEUR|table_valeur{objet}}
	<INCLURE{fond=inclure/element-resume}{objet=#GET{objet}}{id_objet=#GET{id_objet}}>
</BOUCLE_elements>
</ul></div><B_elements>

Remarque : La boucle (POUR) est fournie par le plugin Bonux.
De manière plus moderne, cette boucle peut s’écrire au moyen d’une boucle DATA :

<B_elements><div class="liste"><ul class="list-items">
<BOUCLE_elements(DATA){source table,#GET{elements}}{!par date}{pagination 5}>
	#SET{id_objet,#VALEUR|table_valeur{id_objet}}
	#SET{objet,#VALEUR|table_valeur{objet}}
	<INCLURE{fond=inclure/element-resume}{objet=#GET{objet}}{id_objet=#GET{id_objet}}>
</BOUCLE_elements>
</ul></div><B_elements>

Il nous reste enfin à construire le squelette inclure/element-resume.html, cette fois ci en nous servant de la boucle CONDITION. Comme nous l’avons déjà remarqué, ce choix permet de n’avoir qu’un seul fichier à modifier en cas de changement du contenu des éléments de la liste.

<BOUCLE_test_article(CONDITION){si #ENV{objet}|=={article}}>
  <BOUCLE_article(ARTICLES){id_article=#ENV{id_objet}}>
    <li class="item hentry">
    <h3 class="h3 entry-title"><a href="#URL_ARTICLE" rel="bookmark">#TITRE</a></h3>
    [<div class="#EDIT{intro} introduction entry-content">(#INTRODUCTION)</div>]
    <div class="meta-publi">
      <a class="lire-la-suite" href="#URL_ARTICLE"><:lire_la_suite:><span class="lire-la-suite-titre"><:lire_la_suite_de:> <em>#TITRE</em></span></a>
    </div>
    </li>
  </BOUCLE_article>
</BOUCLE_test_article>

<BOUCLE_test_breve(CONDITION){si #ENV{objet}|=={breve}}>
  <BOUCLE_breve(BREVES){id_breve=#ENV{id_objet}}>
    <li class="item hentry">
    <h3 class="h3 entry-title"><a href="#URL_BREVE" rel="bookmark">#TITRE</a></h3>
    [<div class="#EDIT{intro} introduction entry-content">(#INTRODUCTION)</div>]
    <div class="meta-publi">
      <a class="lire-la-suite" href="#URL_BREVE"><:lire_la_suite:><span class="lire-la-suite-titre"><:lire_la_suite_de:> <em>#TITRE</em></span></a>
    </div>
    </li>
  </BOUCLE_breve>
</BOUCLE_test_breve>

Remarque : La boucle (CONDITION) est fournie par le plugin Bonux. Avec les SPIP récents, le critère {si} peut s’appliquer à toute boucle. On pourra donc plus simplement écrire :

  <BOUCLE_article(ARTICLES){si #ENV{objet}|=={article}}{id_article=#ENV{id_objet}}>
    <li class="item hentry">
    <h3 class="h3 entry-title"><a href="#URL_ARTICLE" rel="bookmark">#TITRE</a></h3>
    [<div class="#EDIT{intro} introduction entry-content">(#INTRODUCTION)</div>]
    <div class="meta-publi">
      <a class="lire-la-suite" href="#URL_ARTICLE"><:lire_la_suite:><span class="lire-la-suite-titre"><:lire_la_suite_de:> <em>#TITRE</em></span></a>
    </div>
    </li>
  </BOUCLE_article>

  <BOUCLE_breve(BREVES){id_breve=#ENV{id_objet}}{si #ENV{objet}|=={breve}}>
    <li class="item hentry">
    <h3 class="h3 entry-title"><a href="#URL_BREVE" rel="bookmark">#TITRE</a></h3>
    [<div class="#EDIT{intro} introduction entry-content">(#INTRODUCTION)</div>]
    <div class="meta-publi">
      <a class="lire-la-suite" href="#URL_BREVE"><:lire_la_suite:><span class="lire-la-suite-titre"><:lire_la_suite_de:> <em>#TITRE</em></span></a>
    </div>
    </li>
  </BOUCLE_breve>

Un flux RSS mélangeant article et brèves.

Pour ce fichier, nous remplissons le tableaux en effectuant un filtre sur les dates inversées, en effet, nous remplissons le tableau avec un minimum d’élément pour alléger les requêtes sur le serveur. Nous prenons la base du fichier backend.php de squelette-dist sur la version 2.1 de Spip.

Remplissage du tableau :

<BOUCLE_10articles(ARTICLES) {lang ?}{branche ?}{id_mot ?}{id_auteur ?} {par date}{inverse}{0,10}{unique}>
	#SET{element, #ARRAY{objet,"article",id_objet,#ID_ARTICLE,date,#DATE}} 
	#SET_PUSH{elements,#GET{element}}
</BOUCLE_10articles>
<BOUCLE_articles_tres_recents(ARTICLES){lang ?}{branche ?}{id_mot ?}{id_auteur ?} {par date}{inverse}{age<3}{unique}>
	#SET{element, #ARRAY{objet,"article",id_objet,#ID_ARTICLE,date,#DATE}} 
	#SET_PUSH{elements,#GET{element}}
</BOUCLE_articles_tres_recents>
<BOUCLE_10breves(BREVES){lang ?}{branche ?}{id_mot ?}{id_auteur ?}{par date}{inverse}{id_rubrique ?}{lang ?}{id_mot ?}{unique}{0,5}>
	#SET{element, #ARRAY{objet,"breve",id_objet,#ID_BREVE,date,#DATE}} 
	#SET_PUSH{elements,#GET{element}}
</BOUCLE_10breves>
<BOUCLE_breves_tres_recents(BREVES){lang ?}{branche ?}{id_mot ?}{id_auteur ?} {par date}{inverse}{age<3}{unique}>
	#SET{element, #ARRAY{objet,"breve",id_objet,#ID_ARTICLE,date,#DATE}} 
	#SET_PUSH{elements,#GET{element}}
</BOUCLE_breves_tres_recents>

Nous bouclons ensuite sur les éléments comme précédemment, par contre cette fois-ci : nous allons utiliser un test sur le type d’objet : soit avec un test direct et une inclusion [5], soit avec une boucle CONDITION [6].

  • Pour les articles : le test s’effectue via [(#VALEUR|table_valeur{objet}|=={article}|oui) ]
  • Pour les brèves, la boucle CONDITION donne : <BOUCLE_test_breve(CONDITION){si #VALEUR|table_valeur{objet}|=={breve}} />

Ce qui donne, avec un contenu minimum pour les brèves :

<BOUCLE_elements(POUR){tableau #GET{elements}}{!par date}>
#SET{id_objet,#VALEUR|table_valeur{id_objet}}
[(#VALEUR|table_valeur{objet}|=={article}|oui)
<INCLURE{fond=inc-rss-item}{id_article=#GET{id_objet}}>]

<BOUCLE_test_breve(CONDITION){si #VALEUR|table_valeur{objet}|=={breve}}>
	<BOUCLE_breve(BREVES){id_breve=#GET{id_objet}}>
		<item[ xml:lang="(#LANG)"]>
			<title>[<:breve:>] [(#TITRE|supprimer_tags|texte_backend)]</title>
			<link>[(#URL_BREVE|url_absolue)]</link>
			[<guid isPermaLink="true">(#URL_BREVE|url_absolue)</guid>]
			[<dc:date>(#DATE|date_iso)</dc:date>]
			<dc:format>text/html</dc:format>
			[<dc:language>(#LANG)</dc:language>]
			<description>[(#INTRODUCTION|liens_absolus|texte_backend)]

	<BOUCLE_breve_rubrique_mf(RUBRIQUES){id_rubrique}>-
	[&lt;a href="[(#URL_RUBRIQUE|url_absolue)]" rel="directory"&gt;(#TITRE|texte_backend)&lt;/a&gt;]
	</BOUCLE_breve_rubrique_mf>
			</description>
	</BOUCLE_breve>
</BOUCLE_test_breve>

</BOUCLE_elements>

De manière plus moderne et sans le plugin Bonux, ela peut s’écrire ainsi :

<BOUCLE_elements(DATA){source table, #GET{elements}}{!par date}>
#SET{id_objet,#VALEUR|table_valeur{id_objet}}
[(#VALEUR|table_valeur{objet}|=={article}|oui)
    <INCLURE{fond=inc-rss-item}{id_article=#GET{id_objet}}>
]
<BOUCLE_breve(BREVES)
    {si #VALEUR|table_valeur{objet}|=={breve}}
    {id_breve=#GET{id_objet}}
>
	<item[ xml:lang="(#LANG)"]>
		<title>[<:breve:>] [(#TITRE|supprimer_tags|texte_backend)]</title>
		<link>[(#URL_BREVE|url_absolue)]</link>
		[<guid isPermaLink="true">(#URL_BREVE|url_absolue)</guid>]
		[<dc:date>(#DATE|date_iso)</dc:date>]
		<dc:format>text/html</dc:format>
		[<dc:language>(#LANG)</dc:language>]
		<description>[(#INTRODUCTION|liens_absolus|texte_backend)]
	<BOUCLE_breve_rubrique_mf(RUBRIQUES){id_rubrique}>
        - [&lt;a href="[(#URL_RUBRIQUE|url_absolue)]" rel="directory"&gt;(#TITRE|texte_backend)&lt;/a&gt;]
	</BOUCLE_breve_rubrique_mf>
		</description>
</BOUCLE_breve>
</BOUCLE_elements>

Vous pouvez télécharger le fichier joint directement pour mettre en place un flux RSS mélangeant brèves et articles dans votre installation de Spip.

Notes

[1article, breve, article syndiqué …

[2#ID_ARTICLE, #ID_BREVE, #ID_SYNDIC_ARTICLE

[3Intégrée à Spip-Bonux

[4Le dernier choix permet de n’avoir qu’un seul squelette à modifier en cas de changement de contenu de la liste, et donc de ne pas oublier l’un des éléments

[5pour les articles

[6pour les brèves

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

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

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom