Mots-clés (ou autres objets) dans des intervalles

Pouvoir classer des mots-clés dans des intervalles (durées, dates, valeurs numériques ou systématiques). Les objets sélectionnés ont ces mots-clés ou des mots-clés dont la « valeur » encadre le mot-clé recherché.
Cet exemple utilise les mots-clés mais rien n’interdit de l’étendre à d’autres objets (articles, brèves, rubriques...).

Attention, ne fonctionne pas en Spip 3 !

En effet, en Spip 3, les critères <, >, <= ou >= ne fonctionnent plus avec titre_mot (même s’ils fonctionnent encore avec titre).

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&nbsp;: [(#DESCRIPTIF)]</BOUCLE_ph_1>&nbsp;&agrave;&nbsp;
			<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> &agrave; <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.

Notes

[1Mais il affichera « pH 4,5 à 4,5 » avec les boucles suivantes.

[2C’est aussi cette saisie qui permet d’utiliser le critère {par num titre} .

Attention ! Si vous utilisez cette contrib sur le squelette mot.html, tous vos mots-clés de tous leurs groupes vont l’utiliser.

Il vous faut donc soit créer un fichier spécialisé pour gérer les mots de ce groupe soit utiliser au moins la première partie de la contrib suivante Squelettes pour groupes et par groupes de mots. Celà vous donnera des squelettes mots-clés qui pourront être différents selon les groupes de mots-clés.

Discussion

Aucune discussion

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