Un tableau d’articles à entrées multiples en fonction des mots-clés associés

problématique

comment faire figurer les articles dans un tableau à entrées multiples, fonction des mots clés qui leurs sont attribués ?

Imaginons par exemple que j’aie un site consacré à la cuisine internationale. A chaque rubrique correspond un pays. Et pour chaque plat, j’associe un mot clé précisant si c’est une entrée, un plat, un dessert, et un autre mot-clé précisant quel type de vin accompagne idéalement le plat.

Je peux vouloir créer une page sur laquelle les plats sont triés en fonction du type de plat (entrée, plat, dessert) et en fonction du vin qui l’accompagne le mieux. Je veux donc faire un tableau à double entrée.

Boucles

La boucle qui permet de faire cela est la suivante :

<BOUCLE_groupe_un (MOTS) {id_groupe=1} {par titre}>
<BOUCLE_groupe_deux (MOTS) {id_groupe=2} {par titre}>
<BOUCLE_articles_lies_un (ARTICLES) {id_mot=#_groupe_un:ID_MOT}>
<BOUCLE_articles_lies_deux (ARTICLES) {id_article} {id_mot=#_groupe_deux:ID_MOT}>
</BOUCLE_articles_lies_deux>
</BOUCLE_articles_lies_un>
</BOUCLE_groupe_deux>
</BOUCLE_groupe_un>

Remarques : Dans cet exemple de code, j’ai utilisé le critère {id_groupe=XX}, dans un soucis de simplicité. Je vous recommande cependant de lui préférer un critère de type {type=XXX}, ce qui vous permet de vous affranchir de la numérotation de la base de données au profit des noms de vos groupes de mots-clés. Ainsi, en cas de fausse manipulation qui aurait pour conséquence de changer le numéro de vos groupes (suite à un effacement accidentel par exemple), vous n’avez pas à modifier les squelettes, mais simplement à conserver un nom de groupe identique.

ATTENTION !!! Vous ne pouvez avoir qu’un seul mot clé de chaque groupe attaché à chaque article !!! Autrement dit, vous devez avoir un article par élément du tableau.

Explications

Quel est le principe de tout cela ?

La boucle _groupe_un parcourt un à un tous les mots clés du groupe un.
Puis, pour chaque mot clé du groupe un, la boucle _groupe_deux parcourt tous les mots clés du groupe deux. Nous avons donc construit à ce stade chaque couple de mots clés, triés par titres.

La boucle articles_lies_un parcourt ensuite chaque article et ne retiens
que ceux qui sont liés à un mot du groupe un.
La boucle articles_lies_deux vérifie ensuite pour chaque article qui possède un mot clé du groupe un s’il possède aussi un mot clé du groupe deux (grâce au critère id_article).

(Pour l’explication de la signification de la balise #_groupe_deux_inc:ID_MOT, on se référera à la documentation sur les nouvelles balises).

Introduction du HTML

Pour afficher le tableau proprement dit, on pourra par exemple utiliser le code suivant :

<B_groupe_un>

<table border="1" summary="Tableau présentant les articles qui ont pour mots clés un ou plusieurs mots clés du groupe 1 _ET_ un ou plusieurs mots-clés du groupe deux">

<caption>Articles traitant à la fois du theme du groupe un et du theme du groupe deux, triés par couples de mots clés.</caption>

<!--Cette première boucle permet d'obtenir la première ligne du tableau (la liste des mots clés du groupe deux).-->
<tr><td></td>
<BOUCLE_th_groupe_deux (MOTS) {id_groupe=2} {par titre}>
<th scope="row">#TITRE</th>
</BOUCLE_th_groupe_deux>
</tr>

   <BOUCLE_groupe_un (MOTS) {id_groupe=1} {par titre}>
      <!--Ici débute les lignes qui composent le tableau, une par élément contenu dans le groupe de mots clés 1.-->
      <tr>
      <!--Cette balise correspond à la première colonne du tableau.-->
      <th scope="col">#TITRE</th>
         <BOUCLE_groupe_deux (MOTS) {id_groupe=2} {par titre}>
               <B_articles_lies_un>
               <!--C'est ici que se remplissent caque case du tableau.-->
               <td>
                  <BOUCLE_articles_lies_un (ARTICLES) {id_mot=#_groupe_un:ID_MOT}>
                     &nbsp;<BOUCLE_articles_lies_deux (ARTICLES) {id_article} {id_mot=#_groupe_deux:ID_MOT}>
                        <a href="#URL_ARTICLE" hreflang="#LANG" [title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a>
                     </BOUCLE_articles_lies_deux>&nbsp;
                  </BOUCLE_articles_lies_un>
               </td>
               </B_articles_lies_un>
            <!--Ce code alternatif permet d'avoir une case vide dans le tableau dans le cas où il n'y a pas d'article lié à cette combinaison de mots clés.-->
            <td>&nbsp;</td>{
            <//B_articles_lies_un>
         </BOUCLE_groupe_deux>
      </tr>
   </BOUCLE_groupe_un>
</table>
</B_groupe_un>

Ce qui nous donne le résultat suivant (par exemple) :

On trouvera toutes les informations qui traitent des tableaux en HTML 4.01 dans la recommandation W3C.

Pour aller plus loin

On peut réaliser ainsi des tableaux à entrées multiples en ajoutant des boucles (MOTS) et (ARTICLES).

On peut aussi procéder ainsi pour toutes les boucles qui acceptent des mots clés : RUBRIQUES, BREVES, SYNDICATION et FORUM, ainsi que celles qui s’y ajouteront.

Autre méthode

Il est possible d’obtenir la même chose en utilisant les doublons nommés.

Discussion

6 discussions

  • Salut, merci pour ta contrib, j’ai une grille avec des villes et des themes, et je souhaite afficher un seul article par theme et ville, j’ai rajouter 0,1 sur la boucle mais elle n’est pas prix en compte. Tu peux voir le site de test ici : dms matrix

    merci de ta reponse

    Répondre à ce message

  • 1

    L’idée paraissait intéressante, mais elle ne peut fonctionner que dans des cas très limités ... pour la simple raison que SPIP ne permet pas d’établir de relation entre des mots clés de groupes distincts : il n’y a aucun moyen de relier un mot clé d’un groupe avec un mot clé d’un autre groupe. Cette contrib ne fonctionne pas dans le cas ou l’on associe un article a plusieurs mots clés de chacun des groupes ...

    A ce sujet, le tableau en exemple (planning d’occupation des salles) n’a pas pu etre produit avec la contrib en question ...
    Explication : avec 2 groupes de mots clés, le groupe 1 pour la liste des jours et le groupe 2 pour la liste des salles, il n’est pas possible d’affecter correctement un meme article à la fois sur plusieurs jours différents et sur plusieurs salles différentes. Le résultat produit est l’affichage de toutes les combinaisons jours/salles ... ce qui n’est pas ce que l’on souhaite ...

    Ainsi l’article « validations_sur-SPIP-Contrib » affecté aux jours « lundi, mercredi, jeudi » ainsi qu’au salles « Déesse A, Arno » sera nécéssairement affiché dans les 6 cases des 6 combinaisons possibles des mots clés, et non uniquement des 3 cases comme dans l’exemple ...

    Dommage ...

    • Olivier G.

      Exact ! J’étais persuadé d’avoir signalé le fait qu’il fallait absoluement avoir la correspondance une case = un article, et ce n’est visiblement pas le cas, je demande une correction de l’article aux admins...

      Mea maxima culpa.

    Répondre à ce message

  • 2
    ivandps

    bonjour

    merci de ta contribe.
    je pense qu’elle va dans le sens que je cherche.
    je suis débutant et je peine un peu (beaucoup).

    voici mon besoin :

    je voudrais afficher non pas tous les articles liés par 2 groupes,
    mais ceux liés par un mot clé et 1 groupe ?

    merci pour l’aide apporter !

    • Olivier G.

      J’imagine qu’il suffirait de remplacer {id_mot=#_groupe_un:ID_MOT} par {id_mot=XXX}, avec XXX l’id du mot en question...

    • pardon d’abuser mais concrètement :

      je veux faire apparaître le lien vers l’article
      qui a en commun le même id_mot dans un groupe donné
      et un id_mot=27

      que faut il modifier dans ta boucle...très concrètement à la virgule prêt pour un débutant.

      merci

    Répondre à ce message

  • Claude Cardot

    Hello,

    juste pour te remercier, je n’avais pas besoin des deux critères, mais ça m’a bien aidé pour réaliser ce que je voulais.

    Répondre à ce message

  • 1
    Michel Fraisse

    Certainement une grande contrib, y a-t-il un site en demo ?

    Ce qui est très curieux c’est que je ne vois pas l’exemple sur la page de l’article, mais je le vois dans la page de rédaction du commentaire ???

    • Non, pas de site de démo à ce jour (le tien peut-être), je ne suis que théoricien...

      En recanche, le problème de l’image à été réglé.

    Répondre à ce message

  • 2

    Bonjour,
    tout à l’air de bien fonctionner, le tableau se construit parfaitement mais ne se remplit pas

    je n’arrive pas à récupérer les titres et le lien vers l’article.

    Cela viendrait de la version : je suis en 1.7.2 ?

    Jean

    • Eh oui ! C’est la version. jette un oeil aux mots clés de l’article (à droite), tu verra que c’est bon pour la 1.8.

    • Je m’en suis aperçu après avoir posté mon message !
      je l’ai installé dans une 1.8pr1
      là je n’obtiens même plus le tableau !
      j’ai encore dû loupé qqchose

      Mais cette contrib m’intéresse beaucoup, je continue

      Jean

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

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.

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

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom