SPIP-Contrib

SPIP-Contrib

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

288 Plugins, 197 contribs sur SPIP-Zone, 217 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 ?
  • [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 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

  • LinkCheck : vérificateur de liens

    13 février 2015 – 94 commentaires

    Ce plugin permet de chercher et tester l’ensemble des liens présents dans les objets. Vous pourrez donc en quelques clics connaître les liens brisés ou défectueux qui se sont immiscés dans le contenu de votre site SPIP. La vérification s’effectue en (...)

  • Serveur HTTP abstrait

    25 novembre 2013 – commentaires

    Un plugin-outil pour aider les développeurs à implémenter des API orientées REST, basées sur les méthodes HTTP (get, post, put, delete). Ce plugin a pour but premier de normaliser des URL que l’on pourra appeler pour manipuler les données du site. À (...)

  • Agenda Fullcalendar facile

    29 octobre 2016 – 33 commentaires

    Dans un précédent article, nous expliquions comment afficher un agenda Fullcalendar sur son site avec le plugin agenda. Cependant, ceci nécessite des manipulation de squelettes, ce qui n’est pas toujours évident lorsqu’on débute. La présente (...)

  • Acces Restreint 3.0

    11 décembre 2008 – 804 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 (...)

  • Abonnements

    31 janvier 2015 – 18 commentaires

    Gérer des abonnements à des offres, et uniquement cela. Ce plugin a pour but de regrouper tout ce qui est commun aux différents types d’abonnements possibles (à des zones restreintes, à des contenus précis, à une version papier pourquoi pas (...)

Ça spipe par là