SPIP-Contrib

SPIP-Contrib

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

288 Plugins, 197 contribs sur SPIP-Zone, 106 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

  • Diaporama responsive avec Nivo Slider

    15 septembre 2015 – commentaires

    Un diaporama responsive basé sur « Nivoslider ». Introduction Cette contribution est une adaptation liée à Nivo-Slider (http://contrib.spip.net/Nivo-Slider-3747). Ce dernier plugin disponible n’étant pas responsive, nous l’avons refait une adaptation (...)

  • Mon site affiche une page blanche ou je ne peux plus accèder à l’espace privé

    7 février 2008 – 32 commentaires

    Au secours ! « Tout à coup » votre site devient inutilisable ou inaccessible ! Comment faire ? Pourquoi ? Par où commencer ? Sans pouvoir couvrir tous les cas, cet article va essayer de vous guider rapidement vers la (...)

  • Polyhiérarchie

    14 juillet 2009 – 166 commentaires

    Ce plugin permet de rattacher un article ou une rubrique à plusieurs rubriques parentes.

  • Étiquettes

    18 avril 2008 – 80 commentaires

    Générer des formulaires pour ajouter facilement des mots-clés à tout et n’importe quoi.

  • Formidable, le générateur de formulaires

    23 janvier 2012 – 2278 commentaires

    Un générateur de formulaires facilement configurable pour les non-informaticiens et facilement extensible pour les développeurs. Introduction L’objectif était de créer un plugin permettant de générer des formulaires. Historiquement, 2 plugins (...)