Attention, ceci est l'archivage statique d'un ancien site qui a maintenant disparu. En savoir plus.

Bienvenue sur , le recueil de réflexions et créations en tous genres de Nicolas Hoizey, passionné de Web depuis 1996, co-créateur et Directeur de l’Innovation de Clever Age, photographe amateur, créateur du jeu HTML5 / SVG « esviji », etc.

Un exemple de jointures entre plusieurs tables dans une boucle SPIP

Publié le

par Nicolas Hoizey,

tagué SPIP

et commenté 3 fois

Les jointures sont disponibles depuis quelque temps dans SPIP, mais tout comme plein de nouveautés des dernières versions, je n’y avait pas encore goûté. C’est maintenant fait, et aux quelques errements initiaux près, c’est vraiment à connaitre. Voici un exemple très concret.

Utilisant le plugin Agenda pour gérer des événements1, j’ai eu besoin de lister chronologiquement les événements rattachés à des articles ayant un mot clef particulier.

Le code du squelette aurait été beaucoup plus simple si les mots clefs étaient rattachés directement aux événements, mais je préfère largement attacher les mots clefs aux articles, l’ajout aux événements étant laborieux.

Le problème, donc, est de lister {par date} des (EVENEMENTS) liés à des (ARTICLES) qui ont au moins un mot clef avec {id_mot=3}.

La technique traditionnelle serait de faire une boucle (ARTICLES) pour filtrer selon le mot clef, puis dans son corps une boucle sur les (EVENEMENTS) de chaque article.

Malheureusement, cela ne permet pas un classement {par date} de l’ensemble des (EVENEMENTS), mais seulement article par article.

C’est là que les jointures arrivent à la rescousse. L’idée est donc de faire une unique boucle, qui porte sur deux sources de données, les (ARTICLES) et les (EVENEMENTS), le lien étant l’id_article.

Voici ce que cela donne pour lister des événements passés rattachés aux articles de la rubrique courante ayant un mot clef avec {id_mot=3} :

  1. <BOUCLE_evenements(EVENEMENTS articles mots_articles){par date}{inverse}{id_rubrique}{id_mot=3}{age>0}>
  2. <li>[(#DATE_DEBUT|affdate{'d/m/Y'})]</li>
  3. </BOUCLE_evenements>

Télécharger

Il faut tester différentes syntaxes pour arriver au résultat, mais globalement, quelques règles découvertes sur le tas peuvent aider :

  • La première donnée peut être identifiée par son alias, mais les autres doivent être identifiées par leur nom de table, hors préfixe
  • Il semble que le compilateur de SPIP comprend bien que l’age demandé est celui des (EVENEMENTS) et non celui des (ARTICLES), sans doute parce que les (EVENEMENTS) sont l’élément principal de la boucle
  • Alors que le critère {id_mot=3} fonctionne sur une boucle (ARTICLES), il ne fonctionne pas sur la table articles, d’où nécessité d’ajouter la seconde jointure sur la table mots_articles

A vous de tester !

Notes

1En remplacement de mon vieil agenda développé il y a quelques années

Vos commentaires

  • Le 27 février 2008 à 16:13, par Sylvain En réponse à : Un exemple de jointures entre plusieurs tables dans une boucle SPIP

    Ouh là ! mais c’est super ça !

    ça va me simplifier les choses ... voir peut-être ouvrir des possibilités (faudra que je vois à l’usage ;-) )

    (...) Malheureusement, cela ne permet pas un classement par date de l’ensemble des (EVENEMENTS), mais seulement article par article.

    En fait si on peut. Je fais déjà la même chose depuis un bout de temps avec, certes plusieurs boucles, mais surtout {doublons XXX}

    je vais tenter de traduire ton exemple, si j’ai bien compris ... car ça devrait donner :

    tout est dans l’inversion du doublons :

    • le premier lot de boucles, ne sert en fait qu’a fait la sélection (sans trie par ...) ;
    • puis on utilise l’inversion de {!doublons XXX} pour ne prendre en fait que ce qui "a été retenu" par {doublons XXX} ;
    • enfin on trie {par date}, {0,10}, etc ..

    c’est dingue ce que l’on peut faire, depuis qu’ils ont refondu le compilo :-o
    en plus ils l’améliorent régulièrement ... je fais des empilements de boucles et balises de plus en plus complexes et suis toujours surpris que ça fonctionne ;-)


    Avec les jointures ça va devenir encore pire :-D

    merci pour l’astuce Nicolas.

  • Le 29 octobre 2009 à 15:16, par reno En réponse à : Un exemple de jointures entre plusieurs tables dans une boucle SPIP

    c’est exactement la problematique dans laquelle j’etais pour realiser cet agenda
    http://www.ninespirit.org/spip.php?article1
    Thank U very much

  • Le 29 octobre 2009 à 16:00, par Nicolas Hoizey En réponse à : Un exemple de jointures entre plusieurs tables dans une boucle SPIP

    Bravo, jolie utilisation !