L’idée
Vous utilisez souvent la même liste de valeurs dans le critère IN d’une boucle.
exemple dans la boucle suivante :
<BOUCLE_art(ARTICLES){id_article IN 12,13,14,25}>
<h1>#TITRE</h1>
</BOUCLE_art>
La boucle précédente liste les articles d’identifiants 12, 13, 14 ou 25.
Une solution de mutualisation pour un seul squelette
Une première possibilité pour mutualiser cette liste consiste à la charger dans un tableau statique (voir cet article du site officiel de SPIP sur l’utilisation des tableaux avec #ARRAY) . On peut alors l’utiliser plusieurs fois dans le même squelette (ce qui le rend plus facile à maintenir), exemple :
[(#SET{montableau,#ARRAY{0,12,1,13,2,14,3,25}})]
<BOUCLE_art1(ARTICLES){id_article IN #GET{montableau}|sinon{0}}{par hasard}>
<h1>#TITRE</h1>
</BOUCLE_art1>
<BOUCLE_art2(ARTICLES){id_article IN #GET{montableau}|sinon{0}}{par titre}>
<h1>#TITRE</h1>
</BOUCLE_art2>
Une solution pour l’ensemble des squelettes
Imaginons que j’utilise souvent cette liste dans plusieurs squelettes.
Voici un moyen de la mutualiser :
Je crée un squelette tout simple qui ne fait que contenir une chaine, formée de la liste des valeurs séparées par un caractère peu utilisé (par exemple le pipe ’|’) :
On crée par exemple le fichier maliste.html :
12|13|14|25
Et voici le squelette montest.html :
#CACHE{0}
<BOUCLE_art(ARTICLES){id_article IN #INCLURE{fond=maliste}|explode{'|'}}>
<h1>#TITRE</h1>
</BOUCLE_art>
Le filtre « explode » est une fonction php qui sépare la chaîne passée en paramètre et remplit un tableau avec les valeurs. La fonction prend comme premier paramètre le caractère de séparation... et le tour est joué ! C’est un peu comme si le squelette inclus passait un tableau en paramètre.
Application à la réalisation de boucles « impossibles »
Voici un exemple permettant de faire une boucle impossible en SPIP 1.9.2 normalement : on souhaite lister les articles contenus dans les rubriques ayant le mot clé d’identifiant 15.
Une possibilité offerte par les tableaux dynamiques consisterait à faire le squelette suivant (voir également les outils du plugin SPIP-Bonux pour construire des tableaux dynamiques) :
#CACHE{0}
#SET{montableau, #ARRAY{}}
<BOUCLE_rub(RUBRIQUES){id_mot=15}>
[(#SET{montableau,
#GET{montableau}|push{#ID_RUBRIQUE}
})]
</BOUCLE_rub>
<BOUCLE_art(ARTICLES){id_rubrique IN #GET{montableau}|sinon{0}}{par titre}>
<h1>#TITRE</h1>
</BOUCLE_art>
Cette solution fonctionne parfaitement, mais elle oblige à réécrire une partie du code dans chaque squelette où l’on s’en sert.
Voici une solution où l’on mutualise la première partie :
On crée un fichier liste-rubriques.html qui crée une liste d’identifiants séparés par des pipes.
<BOUCLE_rub(RUBRIQUES){id_mot?}{id_groupe?}{'|'}>#ID_RUBRIQUE</BOUCLE_rub>
On peut alors se servir de cette « sous-boucle » dans tous les autres squelettes. Par exemple, on peut l’utiliser pour la boucle suivante dans un autre squelette :
<BOUCLE_art(ARTICLES){id_rubrique IN #INCLURE{fond=liste-rubriques}{id_mot=15}|explode{'|'}|sinon{0}}{par titre}>
<h1>#TITRE</h1>
</BOUCLE_art>
Compatibilité :
Testé sous SPIP 2.0.9, devrait fonctionner également en SPIP 1.9.2.
Une technique (beaucoup) plus efficace pour faire la même chose
Avec la version 1.9.2 sont apparues les jointures « automatiques » (Voir l’article « Forcer des jointures » sur le site programmer.spip.org). On peut alors utiliser la boucle suivante pour obtenir le même résultat :
<BOUCLE_art(ARTICLES mots_rubriques){mots_rubriques.id_mot=15}{par titre}>
<h1>#TITRE</h1>
</BOUCLE_art>
L’avantage est que :
- Il n’y pas d’inclusion
- Tout le travail de jointure est fait par la base de donnée, ce qui est beaucoup plus rapide.
Voici pour preuve la requête fournie par le mode debug (var_mode=debug) :
SELECT articles.titre, articles.lang
FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bWFiYXNlPC9jb2RlPg=="></span>.spip_articles
AS <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YXJ0aWNsZXM8L2NvZGU+"></span>
INNER JOIN <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bWFiYXNlPC9jb2RlPg=="></span>.spip_mots_rubriques
AS L1 ON ( L1.id_rubrique = articles.id_rubrique )
WHERE (articles.statut = 'publie')
AND (articles.date < '9999-12-31')
AND (L1.id_mot = 15)
GROUP BY articles.id_article
ORDER BY articles.titre
Compatibilité :
Testé sous SPIP 2.0.9, devrait fonctionner à partir de SPIP 1.9.2.
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
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.
Suivre les commentaires : |