SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

286 Plugins, 197 contribs sur SPIP-Zone, 251 visiteurs en ce moment

Accueil > Squelettes > Tutoriels pour squelettes > Des techniques pour étendre les possibilités des boucles

Des techniques pour étendre les possibilités des boucles

14 août 2009 – par Thierry Kauffmann – commentaires

Toutes les versions de cet article : [English] [Español] [français]

12 votes

Voici exposées plusieurs techniques permettant d’étendre les possibilités offertes par les boucles standards de SPIP :

Tout d’abord une technique permettant de mutualiser le critère IN d’une boucle sous à partir de SPIP 1.9.2 et offrant également la possibilité d’écrire des boucles qui semblaient impossibles à faire.

Ensuite, une deuxième technique disponible depuis SPIP 2.0.x, permettant de faire de nouvelles boucles grâce aux jointures « automatiques » ou « forcées ».

Demandez la lune à vos boucles :) !

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 :

  1. <BOUCLE_art(ARTICLES){id_article IN 12,13,14,25}>
  2. <h1>#TITRE</h1>
  3. </BOUCLE_art>

Télécharger

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 :

  1. [(#SET{montableau,#ARRAY{0,12,1,13,2,14,3,25}})]
  2.  
  3. <BOUCLE_art1(ARTICLES){id_article IN #GET{montableau}|sinon{0}}{par hasard}>
  4. <h1>#TITRE</h1>
  5. </BOUCLE_art1>
  6.  
  7. <BOUCLE_art2(ARTICLES){id_article IN #GET{montableau}|sinon{0}}{par titre}>
  8. <h1>#TITRE</h1>
  9. </BOUCLE_art2>

Télécharger

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 :

  1. 12|13|14|25

Et voici le squelette montest.html :

  1. #CACHE{0}
  2. <BOUCLE_art(ARTICLES){id_article IN #INCLURE{fond=maliste}|explode{'|'}}>
  3. <h1>#TITRE</h1>
  4. </BOUCLE_art>

Télécharger

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) :

  1. #CACHE{0}
  2.  
  3. #SET{montableau, #ARRAY{}}
  4. <BOUCLE_rub(RUBRIQUES){id_mot=15}>
  5. [(#SET{montableau,
  6. #GET{montableau}|push{#ID_RUBRIQUE}
  7. })]
  8. </BOUCLE_rub>
  9.  
  10. <BOUCLE_art(ARTICLES){id_rubrique IN #GET{montableau}|sinon{0}}{par titre}>
  11. <h1>#TITRE</h1>
  12. </BOUCLE_art>

Télécharger

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.

  1. <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 :

  1. <BOUCLE_art(ARTICLES){id_rubrique IN #INCLURE{fond=liste-rubriques}{id_mot=15}|explode{'|'}|sinon{0}}{par titre}>
  2. <h1>#TITRE</h1>
  3. </BOUCLE_art>

Télécharger

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 :

  1. <BOUCLE_art(ARTICLES mots_rubriques){mots_rubriques.id_mot=15}{par titre}>
  2. <h1>#TITRE</h1>
  3. </BOUCLE_art>

Télécharger

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) :

  1. SELECT articles.titre, articles.lang
  2. FROM `mabase`.spip_articles
  3. AS `articles`
  4. INNER JOIN `mabase`.spip_mots_rubriques
  5. AS L1 ON ( L1.id_rubrique = articles.id_rubrique )
  6. WHERE (articles.statut = 'publie')
  7. AND (articles.date < '9999-12-31')
  8. AND (L1.id_mot = 15)
  9. GROUP BY articles.id_article
  10. ORDER BY articles.titre

Télécharger

Compatibilité :
Testé sous SPIP 2.0.9, devrait fonctionner à partir de SPIP 1.9.2.

P.-S.

  1. Pour utiliser les nouvelles possibilités offertes par SPIP 2.0.x, il ne faut pas hésiter à utiliser un outil comme PhpMyAdmin, proposé en général par tous les hébergeurs, pour découvrir les tables de spip et leur structure (qui est vraiment TRÈS claire !) de manière à trouver les tables intermédiaires qui permettront ces nouvelles jointures.
    Vérifier ensuite que SPIP fait bien les jointures souhaitées en testant votre squelette avec le paramètre var_mode=debug et en affichant le « calcul » généré par la boucle considérée. Il faudra pour certains apprendre quelques rudiments de langage sql (Structured_Query_Language).
  2. (màj le 22/02/2010) On pourra lire également avec intérêt cet article qui traite de l’anti-doublon. C’est une technique très efficace pour créer des regroupements d’origines diverses du même type d’objet (des UNION en sql). Cela évitera dans la plupart des cas d’avoir recours aux tableaux.

Dernière modification de cette page le 11 février 2012

Retour en haut de la page

Vos commentaires

  • Le 21 août 2010 à 07:49, par Loiseau2nuit En réponse à : Des techniques pour étendre les possibilités des boucles

    OH My God ! Mais j’ai encore du retard sur la subtilité des boucles moi ... oO

    Merci à toi Thierry pour ces éclaircissements :-)

    Répondre à ce message

  • Le 28 août 2009 à 07:32, par davux En réponse à : Des techniques pour étendre les possibilités des boucles

    Attention, bien mettre « IN » en majuscules. Je viens de m’arracher les cheveux à essayer de comprendre pourquoi ma boucle traitait seulement le premier élément, et en fait c’est juste parce que j’avais mis « in » en minuscules.

    Si ça peut faire gagner du temps à d’autres...

    Répondre à ce message

  • Le 21 août 2009 à 18:14, par Matthieu Marcillaud En réponse à : Des techniques pour étendre les possibilités des boucles

    1. <BOUCLE_art(ARTICLES mots_rubriques){id_mot=15}{par titre}>
    2. <h1>#TITRE</h1>
    3. </BOUCLE_art>

    Télécharger

    J’aime bien cet exemple. Je l’aurais bien ajouté sur Programmer, mais il me parait un rien aléatoire. Ce n’est pas évident que le id_mot s’applique sur la rubrique et non l’article. En SPIP 2, je me demande si {mots_rubriques.id_mot=15} n’est pas plus parlant (si ça marche)

    • Le 23 août 2009 à 21:01, par Thierry Kauffmann En réponse à : Des techniques pour étendre les possibilités des boucles

      En SPIP 2, je me demande si mots_rubriques.id_mot=15 n’est pas plus parlant (si ça marche)

      Ça marche effectivement de la même façon (jointure absolument identique). C’est sans doute plus parlant et probablement moins aléatoire (dans la mesure où on spécifie la jointure). On peut penser que la requête est moins susceptible de changer suite à une mise à jour de SPIP.

    Répondre à ce message

  • Le 21 août 2009 à 04:25, par ? En réponse à : Des techniques pour étendre les possibilités des boucles

    Bravo et merci pour cette démonstration très claire qui apporte notamment plus de lumière sur les jointures faites directement dans les boucles

    Répondre à ce message

Répondre à cet article

Qui êtes-vous ?

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 Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Adaptive Images

    15 novembre 2013 – 66 commentaires

    Un plugin pour permettre aux sites responsive d’adapter automatiquement les images de la page à l’écran de consultation. Adaptive Images, que l’on pourrait traduire par Images adaptatives, désigne la pratique qui vise à adapter les taille, (...)

  • Métas

    8 août 2009 – 50 commentaires

    Ce petit plugin permet l’ajout, depuis l’espace privé, de metatags aux articles et rubriques de SPIP, ainsi que la mise en exergue de mots importants.

  • Brownie

    6 juillet 2012 – 43 commentaires

    Brownie est une adaptation pour Zpip du thème du même nom initialement développé par Egrappler.com. Présentation Brownie est un thème Responsive à deux colonnes. La démonstration ci-dessous utilise la version 2.0.0 de Brownie, la dist de SPIP3 (...)

  • Métas +

    3 décembre – 13 commentaires

    Améliorez l’indexation de vos articles dans les moteurs et leur affichage sur les réseaux sociaux grâce aux métadonnées Dublin Core, Open Graph et Twitter Card. Installation Activer le plugin dans le menu dédié. Dans le panel de configuration, (...)

  • Acces Restreint 3.0

    11 décembre 2008 – 785 commentaires

    Le plugin accès restreint permet de définir et de gérer des zones de l’espace public en accès restreint. Cette version du plugin a été redévelopée et optimisée tout spécialement pour SPIP 2.0. Il en découle une amélioration des performances sur les gros (...)

Ça spipe par là