La problèmatique
Voici un tableau qui représente 5 classes d’une école. Je pointe l’âge le plus bas et l’âge le plus haut de chaque classe pour connaitre les tranches d’âge de chaque classe. On voit que la pour 1re classe, les élèves ont tous 7 ans et que les autres classes comprennent des élèves de plusieurs âges.
âges | 5 | 6 | 7 | 8 | 9 | 10 |
1re classe | 7 | |||||
2e classe | 7 | 9 | ||||
3e classe | 5 | 7 | ||||
4e classe | 6 | 9 | ||||
5e classe | 8 | 10 |
Un ministère, propose une action ou un examen pour tous les élèves de 7 ans, quel que soit leur niveau. Je recherche donc les classes ayant des élèves âgés de 7 ans pour discuter avec leurs enseignants. Si j’utilise ma grille ci-dessus et que j’appelle le mot-clé « 7 », je vais obtenir pour résultat les objets (article, brève, rubrique...) 1re classe, 2e classe, 3e classe. Je ne vais pas avoir la 5e classe, ce qui est normal. Le problème est que je ne vais pas non plus avoir la 4e classe qui comporte peut-être aussi des élèves âgés de 7 ans.
Avec cette contribution, je propose de retrouver les objets (ici des articles) dont des mots-clés entourent une valeur donnée. Ici cette valeur est un mot-clé du même groupe, mais on pourrait aussi fournir une valeur par un formulaire ou autre.
Ma liste de mots-clés peut, par exemple, être des limites d’âge, des ordres de hauteur d’une plante (de 50 cm à 80 cm), des limites de normes (analyses de sang), des limites de tolérance au calcaire ou à l’acidité (exemple développé ci-dessous). Je pourrais aussi saisir toutes les valeurs intermédiaires entre les bornes mais c’est un peu longuet au bout d’un moment, donc je peux l’éviter si je suis certain que les valeurs sont continues. Outre des valeurs, il peut s’agir de mots classés alphabétiquement et trouver que « cassis » est dans la page « brugnon-cassoulet ». L’utilisation potentielle est large.
L’exemple
Pour l’un des mes groupes de mots-clés, j’ai eu envie de classer mes articles par plages de valeurs compatibles avec une valeur choisie.
Ici, Il s’agit du potentiel Hydrogène (échelle logarithmique de tolérance à l’acidité ou à la basicité du sol). Donc mes plantes (mes articles) ont une limite basse et une limite haute. Ces limites sont des mots-clés rassemblés dans un même groupe. Un article peut avoir 0 (pas de données disponibles), 1 (besoin de pH très pointu ou... lacunaire) ou 2 mots-clés (les limites idéales basse et haute).
Dans la recherche par mot-clé, si je choisis la valeur « 4,5 », je n’aurais pas les articles sans mots-clés de ce groupe, mais j’aurais les articles ayant le mot-clé « 4,5 ». Çà ne me satisfait pas car je veux aussi les plantes (articles) dont la plage pH comprend la valeur « 4,5 » même si aucune des valeurs limites de cette plage n’est le mot-clé « 4,5 ». Plus concrètement, je souhaite que le bleuet qui a une plage de préférence de pH 4 à pH 7 apparaisse dans cette page. En effet, « 4,5 » est supérieur à « 4 » et inférieur à « 7 ».
Avec ma boucle, je peux obtenir cette page d’exemple qui va bien.
Une contrainte : saisir les mots-clés dans un ordre croissant de valeur (4 ; 4,5 ; 5 ; 5,5 ; 6 ; 6,5 ; 7…). et non pas en désordre (4,5 ; 6 ; 7 ; 5,5 ; 4…). Ces valeurs peuvent être numériques comme alphabétiques puisque l’on utilise l’ordre des id_mot pour trier. Le but est que l’ordre des id_mot du groupe corresponde à l’ordre désiré des mots-clés. Une variante plus souple (sic) est proposée plus loin.
Dans l’exemple, je pars d’une page « mot.html » (dont la boucle principale se nomme BOUCLE_mot_principal en général) et je travaille sur le groupe 46 des mes mots-clés. Je remplace la boucle d’affichage par celle-ci :
<BOUCLE_ph_bas(ARTICLES) {id_groupe=46} {id_mot<=#_mot_principal:ID_MOT} {doublons A}></BOUCLE_ph_bas>
<BOUCLE_ph_hors(ARTICLES) {doublons A} {doublons B}></BOUCLE_ph_hors>
<B_ph_haut>
<BOUCLE_ph_haut(ARTICLES) {id_groupe=46} {id_mot>=#_mot_principal:ID_MOT} {doublons B} {par titre}>
<div class="texte"><a href="#URL_ARTICLE">#TITRE [((#SOUSTITRE))]</a>
<BOUCLE_ph_1(MOTS) {id_article} {id_groupe=46} {par titre} {0,1}>, <i>p</i>H : [(#DESCRIPTIF)]</BOUCLE_ph_1> à
<BOUCLE_ph_2(MOTS) {id_article} {id_groupe=46} {par titre} {n-1,n}>[(#DESCRIPTIF)]</BOUCLE_ph_2></div>
</BOUCLE_ph_haut>
</div>
</B_ph_haut>
Les boucles sont bien espacées pour la lisibilité. À l’usage, il vous faudra certainement en recoller certaines, notamment celles à l’intérieur de BOUCLE_ph_haut pour éviter des effets de bord.
Explications
BOUCLE_ph_bas : Je sélectionne tous les articles qui ont un id_mot — dans ce groupe — inférieur ou égal à l’id_mot de ma page (avec doublons A).
BOUCLE_ph_hors : Avec doublons A, je sélectionne tous les autres articles et les renomme doublons B. Cela me permettra de réutiliser la sélection de la première boucle.
BOUCLE_ph_haut : Je sélectionne tous les articles qui ont un id_mot dans ce groupe qui est supérieur ou égal à l’id_mot de ma page. Ils avaient déjà étaient sélectionnés dans la première boucle comme ayant leur ou l’un de leurs mots-clés du groupe ayant un id inférieur à celui de la page. Pour les articles ayant deux mots-clés de ce groupe (la généralité), l’un de ceux-ci à une id inférieur ou égale à l’id de ma page, et l’autre mot à une id supérieur ou égale à l’id de la page. J’ai donc bien les articles ayant des mots du groupe de même id que la page OU qui ont des id encadrantes la valeur de l’id de la page : « id_mot bas <= id_mot de la page <= id_mot haut ». S’il n’y a qu’un mot, il suffit que ce soit celui de la page en cours (ici « 4,5 » [1]).
BOUCLE_ph_1 : J’affiche le premier — dans l’ordre des titres, donc dans l’ordre des id — des mots-clés du groupe 46 pour chaque article.
BOUCLE_ph_2 : J’affiche le dernier — dans le même ordre — des mots-clés de ce groupe pour chaque même article.
Une variante avec le titre du mot-clé
Cette boucle permet d’éviter la contrainte de saisir des mots-clés dans un certain ordre… et donc de ne plus pouvoir modifier ce groupe et de continuer à utiliser la contrib.
<BOUCLE_hauteur_basse(ARTICLES) {id_groupe=XX} {titre_mot<=#_mot_principal:TITRE*} {doublons A}></BOUCLE_hauteur_basse>
<BOUCLE_hauteur_hors(ARTICLES) {doublons A} {doublons B}></BOUCLE_hauteur_hors>
<B_hauteur_haute>
<BOUCLE_hauteur_haute(ARTICLES) {id_groupe=XX} {titre_mot>=#_mot_principal:TITRE*} {doublons B} {par titre}>
<div><a href="#URL_ARTICLE">#TITRE</a><BOUCLE_hauteur_1(MOTS) {id_article} {id_groupe} {par titre} {0,1}>, [(#DESCRIPTIF)]</BOUCLE_hauteur_1> à <BOUCLE_hauteur_2(MOTS) {id_article} {id_groupe} {par titre} {n-1,n}>[(#DESCRIPTIF)]</BOUCLE_hauteur_2></div>
</BOUCLE_hauteur_haute>
</B_hauteur_haute>
J’utilise des dérivées de cette boucle pour classer des hauteurs : « quels sont les végétaux qui peuvent mesurer 5 mètres [ou 20 centimètres] ? » ou aussi « quelles sont les plantes qui mesurent au minimum [ou au maximum] 20 centimètres de haut ? ». L’astérisque est ici utilisée (dans TITRE*) pour utiliser la saisie de type « 000253. Titre du mot » [2].
Il faut alors faire attention à ce que la numérotation soit différente entre les groupes de mots. Utiliser : 01. Mot dans un groupe et 001. Mot dans un autre, etc. ; sinon ces deux mots seront équivalents. Le « titre_mot » ne peut être réduit à un groupe et la boucle va donc chercher tous les mots de même titre. D’autres astuces sont aussi possibles.
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
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.
Suivre les commentaires : |