Présentation
Il peut arriver parfois de vouloir sélectionner des objets SPIP (articles, rubriques, sites etc.), ayant un certains nombre de mot clefs communs.
Par exemple, je voudrais sélectionner les articles ayant les mots clefs « fruits » et « desserts », mais pas ceux qui n’ont que « desserts » ou que « fruits ».
Une telle opération, bien que possible, est assez difficile en SPIP ... sauf si vous utilisez ce plugin.
Il s’installe comme n’importe quel plugin.
Il propose trois critères :
- {mots}
- {mots_selon_id}
- {mots_selon_titre}
Dans une boucle, il ne faut utiliser qu’un seul de ces critères.
Le critère {mots}
Prenons un exemple :
<BOUCLE_art(ARTICLES){mots}>
#TITRE
</BOUCLE_art>
Cette boucle sélectionnera les articles ayant tous les mots clefs passés en paramètres d’environnement dans un tableau « mots ».
Comment passer ces mots-clefs en paramètres d’environnement ?
Typiquement, sur une page principale (non incluse), via des paramètres dans l’url. Par exemple : http://www.toto.fr/?page=toto&mots[0]=1&mots[1]=2
.
Ici, j’ai passé dans le tableau ’mots’ les valeurs 1 et 2. Les articles associés, à la fois au mot dont l’id est 1 et à celui dont l’id est 2 seront sélectionnés [1].
Les valeurs du tableau ’mots’ peuvent être des identifiants de mots (1, 2) ou des titres de mots (« fruits », « desserts »).
Attention au cas où des mots clefs sont uniquement sous forme de nombre ...
Le critère {mots_selon_id}
Il fonctionne exactement comme le critère {mots}
, à ceci près que les valeurs du tableau ’mots’ sont forcément des identifiants de mots (1,2).
Le critère {mots_selon_titre}
Il fonctionne exactement comme le critère {mots}
, à ceci près que les valeurs du tableau ’mots’ sont forcément des titres de mots (« fruits »,« desserts »).
Les paramètres supplémentaires
Les trois critères {mots}
,{mots_selon_id}
et {mots_selon_titre}
peuvent prendre trois paramètres : ’score’, ’tableau’, ’tri’. Sous la forme {mots score tableau}
.
Le paramètre ’score’.
Par défaut, le critère {mots}
prend les objets ayant tous les mots passés en paramètre. On peut décider de vouloir prendre ceux ayant au moins un certain nombre de mots passés paramètre, mais pas nécessairement tous. C’est à cela que sert le paramètre ’score’.
- Si score est compris entre 0 et 1 (exclus), alors SPIP sélectionnera les objets ayant au moins ce pourcentage de mots [2] sur le total des mots passés en paramètre. Par exemple si j’écris {mots 0.5}
, et que je passe 10 mots en paramètre, alors SPIP sélectionnera les objets ayant au moins 10*0.5 = 5 des mots passés en paramètre.
- Si score est supérieur ou égale à 1 et suivi du signe « % », alors SPIP sélectionnera les objets ayant au moins ce pourcentage sur le total des mots passés en paramètre. Par exemple si j’écris {mots 50%}
, et que je passe 10 mots en paramètre, alors SPIP sélectionnera les objets ayant au moins 50% de 10 = 5 des mots passés en paramètre.
- Si score est supérieur ou égale à 1, mais n’est pas suivi du signe « % », alors SPIP sélectionnera les objets ayant au moins ’score’ mots passés en paramètres. Par exemple {mots 5}
sélectionnera les objets ayant au moins 5 mots passés en paramètre.
Le paramètre ’tableau’.
Par défaut, SPIP prend comme tableau la variable d’environnement ’mots’. Mais on peut lui dire, via ce paramètre, de prendre un autre tableau.
Ce peut être un tableau :
- calculé via #GET
et #SET
- inscrit en dur via #ARRAY
- passé en variable d’environnement, et appelé via #ENV
.
Ex : {mots 100% #ARRAY{0,2,1,1}}
sélectionnera les objets ayant les mots clefs 2 et 1. Notez qu’il est obligatoire de donner une valeur au paramètre ’score’ pour utiliser ’tableau’, sinon SPIP les confond.
Le paramètre ’tri’
Ce paramètre, existant depuis la version 2.1 (sous SPIP 3) ou 1.3 (sous SPIP 2.1 et 2.0) peut prendre deux valeurs :
- tri
pour trier la boucle en fonction du nombre de mots du tableau associés, en commençant par le plus petit nombre.
- !tri
pour trier la boucle en fonction du nombre de mots du tableau associés, en commençant par le plus grand nombre.
Exemple :
L’article 1 est associé aux mots 1,2,3 ; l’article 2 est associé aux mots 2,3,4,5,6.
{mots 2 #LISTE{1,2,3} !tri}
affichera d’abord l’article 1, puis l’article 2.
En effet, l’article 1 est associé à 3 mots dans la liste (1,2,3), tandis que l’article 2 n’est associé qu’à 2 mots dans la liste (2,3).
Formulaire de sélection
Avec la version 1.1 de ce plugin, une nouvelle possibilité s’offre à vous : faire appel à un formulaire bâtissant pour vous les critères dans l’url pour filtrer selon plusieurs mots clefs.
Connecté en tant que webmestre, vous pouvez tester avec la page de démonstration : /?page=demo/parmots
.
Le formulaire présente dans un premier temps la liste de vos groupes de mots clefs.
Dès que vous en choisissez un dans la liste, automatiquement [3], la liste des mots clefs de ce groupe est affichée juste à côté.
Choisissez un mot clef, et ce dernier et ajouté à l’URL pour ne vous présenter que les articles ayant ce mot clef.
Et le processus peut être répété autant de fois que nécessaire.
Bonus : la liste des mots clefs déjà choisis est affichée sous le formulaire. Chaque mot est cliquable. Un clic le supprime de l’URL et de la liste.
Usage du formulaire
- Sur une seule page
- en affichant tous les groupes de mots :
<div class="ajax"> [(#FORMULAIRE_RECHERCHE_PAR_MOTS)] </div>
- en n’affichant que certains groupes de mots :
#SET{FiltreGroupes,#ARRAY} <BOUCLE_FiltreGroupes(GROUPES_MOTS){titre==^[^_]}> #SET{FiltreGroupes, #GET{FiltreGroupes}|push{#ID_GROUPE}} </BOUCLE_FiltreGroupes> <div class="ajax"> [(#FORMULAIRE_RECHERCHE_PAR_MOTS{#GET{FiltreGroupes}})] </div>
Ici, on a choisi de ne pas afficher les groupes de mots commençants par « _ ».
- On peut aussi utiliser le formulaire sur toute les pages du site pour renvoyer sur une page de résultats :
[(#FORMULAIRE_RECHERCHE_PAR_MOTS{'',#URL_PAGE{pagederesultats}})]
NB :
- le premier paramètre est un tableau d’identifiants de groupes, ou la chaine vide
- le deuxième paramètre est l’URL de la page qui affiche les résultats.
Usage avec le plugin Mots arborescents
Par défaut, seul le mot-clé demandé est recherché.
Mais il est possible de trouver via n’importe quel mot-clé de la branche du mot-clé demandé en mettant dans mes_options.php :
if (!defined('_CRITERE_MOTS_ARBO_BRANCHE'))
define('_CRITERE_MOTS_ARBO_BRANCHE', true);
Discussions par date d’activité
74 discussions
Excellent !
Est-ce que vous pensez possible de rajouter un critère de tri par nombre de mots trouvés ?
Par exemple, je demande à avoir au moins 1 mot en commun, mais je voudrais mettre en avant ceux qui en ont plus...
heu desolé, je ne connais pas assez le mysql pour faire cela. Peut-être que c’est possible, mais il faudrait que je me plonge dedans. Peut-être cet été.
Bonjour et merci,
tres utile
La nouvelle version permet-elle de resoudre ce pb
Bruno
pas à ma connaissance
Répondre à ce message
Je n’aurais que 2 mots : « BRAVO » et « MERCI » ! :-)
Répondre à ce message
Une dernière petite question :
J’ai mis le formulaire sur la page mot puisque j’ai une navigation exclusivement par mot clé !. j’arrive donc toujours sur cette page en ayant suivi un lien mot.
J’aurais souhaité que l’id_mot que j’ai suivi soit prise en compte dans le tableau. Sans pour autant devoir modifier partout les liens sur les mots clés.
Est-ce possible ?
très probablement. Ce n’est pas moi qui ait créé ce formulaire, mais je suppose qu’il y a moyen de le modifier pour lui passer un paramètre id_mot. Après là je n’ai pas le temps de regarder exactement comment faire.
Quelqu’un pourrait juste m’expliquer comment ajouter une id_mot récupérer dans les variables environnementales dans le tableau mots ?
Merci d’avance
merci de commencer un nouveau fil par nouveau sujet ;-)
pour le problème, un exemple de code aurait-été bon. Mais je t’envoie quand même vers la doc de la balise #ARRAY, qui devrait t’aider. Et si tu n’y arrive pas, et bien reviens :-) http://www.spip.net/fr_article4009.html
Désolé mais je n’ai fait que continuer mon fil ! j’ai juste oublié de m’identifier !
Voila où j’en suis :
Au début de ma page mot, j’ai rajouté cette ligne :
[(#SET{mots,[(#ENV{mots, #ARRAY{}}|push{#ENV{id_mot}})]})]
J’ai donc bien rajouté mon id_mot dans le tableau.
Seulement si j’inclus le formulaire recherche_par_mot sur la page mot en utilisant la balise #FORMULAIRE_RECHERCHE_PAR_MOTS, il va chercher la valeur du tableau en ENV et non en GET et ne tient donc pas compte de mon ajout.
J’essaie donc de mettre mon formulaire dans une noisette pour passer ma nouvelle variable mais ça ne change rien. Il me manque un truc mais je ne trouve pas pour le moment !
Répondre à ce message
j’ai découvert ce plugin avant de commencer à développer mon site et je l’ai trouvé génial pour moi car j’envisageais une navigation par mots clés uniquement. J’y ai donc tout de suite vu une très bonne manière pour l’utilisateur de rajouter ou d’enlever des filtres de navigation.
Mais voilà, j’ai fait des choix lors de mon développement, notamment celui d’utiliser le plugin-squelette zpip et de démarrer avec un thème de départ à modifier.
Seulement voilà, au moment de mettre en place le plugin, je réalise qu’il ne fonctionne plus. Le formulaire affiche le select pour les groupes mais apres le choix, le select pour les mots du groupe ne s’affiche pas.
Apres avoir longtemps cherché, j’ai réalisé que le plugin fonctionnait si je changeais simplement le thème appliqué. j’en déduit donc que le thèmes tincrédible est coupable. Seulement voilà, j’en suis à un stade où je ne peux plus m’en passer. je dois donc trouver le pkoi du comment.
Si vous aviez une piste ou deux à explorer !!! Merci d’avance !
cela m’étonne que le thème trincredible empêche l’affichage. Un thème gère la présentation, pas le contenu. Vous auriez un site exemple ?
Je peux le mettre en ligne sur mon pc si vous êtes encore là !
http://78.230.32.35/
J’ai mis le switcher de thèmes ! La preuve est qu’il suffit de changer de thèmes pour que cela fonctionne.
effectivement !
pour le coup je pense que c’est thincredible qui met du js qui pose des soucis avec l’ajax natif de spip. Tu a essayer une pagination ajax par exemple ? ou un autre formulaire en ajax ?
le mieux serait de demander sur le forum de tincredible
Les paginations fonctionnent et j’ai fait d’autres inclusions en ajax avec passage de variables qui fonctionnent.
En tous cas merci d’avoir regardé !
Ben voilà ! Tu m’as mis sur la piste ! C’est bien le script pour le slider de la page d’accueil et qui était chargé dans le header directement depuis la surcharge du thèmes qui était en conflit ! Ce qui est étonnant car l’ajax fonctionnait malgré tout jusque là !
Bref ! j’ai déplacé le script sur la noisette du slider et le tou est joué !
Merci
Répondre à ce message
Bonjour,
En utilisant ce plugin de la manière décrite avec un paramètre d’inclusion je rencontre un écueil :
Dans un premier squelette je calcule un tableau criteres avec #SET et j’aimerais le passer comme paramètre à mon inclusion.
tabCriteres est un filtre qui me renvoie un tableau, cette partie fonctionne.
....
Dans le second squelette inclus se trouve ma boucle :
Ma boucle ne me donne pas de résultats. Avant l’inclusion le tableau compte pourtant bien plusieurs éléments. Quelque chose m’échappe ?
Les parenthèses surnuméraires sont une étourdrier de ma part, je voulais mettre en gras.
le passage des #SET ne se fait pas automatiquement dans les squelettes inclus. Ce sont les #ENV qui le font.
Donc pour toi il faudrait que tu fasse :
Cela signifie que tu passe comme paramètre d’environnement
criteres
le contenu de#GET{criteres}
et dans le squelette inclus :
Merci Maieul, ca m’avait complètement échappé.
Si en plus le critère est optionnel
{mots? 100% #ENV{criteres}}
fonctionne très bien.
Comme ça n’allait pas de soi en ce qui me concerne, ça peut peut être servir à d’autres.
Répondre à ce message
Bonjour
J’aimerais afficher la liste complète des mots clefs discriminants.
J’arrive à récupérer une liste d’articles associée à des mots clefs,
mais comment peut on récupérer les mots cléfs supplémentaires utiles pour affiner la recherche ?
C’est à dire qu’après avoir récupérer les articles ayant le mot clef A,
une liste me propose les mots clefs B et C car un article possède les mot A et B
et un autre les mots A et C.
C’est ce que semble faire l’exemple fourni dans le plugins dans les SELECT,
mais j’aimerais afficher une liste directement cliquable des mots clefs « ajoutables »
comme l’est actuellement celle des mots clef « supprimables » dans l’exemple.
Cela serait extremement pratique comme mode de recherche.
Est ce possible ?
Merci beaucoup
oui c’est possible (même si je ne comprend pas tout ce que tu veux). Tu connais un peu ou pas du tout le système de boucles de SPIP ?
je connais un peu oui, je me débrouille avec les boucles de base
pour préciser mon idée :
cas pratique :
Merci
Alors il faut que tu stocke dans un tableau (#ARRAY) les id_article associés aux mots déjà sélèctionnés. Puis que tu fasse une boucle mots en prenant comme critère les id_articles de ce tableau.
Quelquechose du genre :
merci je vais tester ca
Répondre à ce message
salut,
J’ai mis en place un moteur de recherche voir l’image jointe, mais en dehors des mots j’ai un champ input que l’internaute doit remplir. Pour l’instant si je choisis les mots clés j’ai un résultat par contre si je cherche la présence d’un mot dans les titres des articles ou dans les textes en tapant un mot dans le champ input j’ai pas de résultat. Est ce quelqu’un peut m’aider ??
les mots qu’on frappe dans le input doivent être cherché parmis les mot clefs ou dans le corps du texte ?
tu a ton code ?
Merci de votre réponse
finalement ca marche, les mots qu’on frappe dans le input doit cherché dans le corps du texte
voici quand même le formulaire :
Pour la page resultat :
Répondre à ce message
Salut tout le monde,
J’utilise ce plugin pour afficher le resultat de la recherche sur un carte googlemaps, mais jusque là j’ai pas le resultat correcte est ce quelqu’un sy connait et voudrait bien m’aider.
voici mon formulaire
et voici ce que j’ai sur la page resultat.html
Comme vous le voyez j’ai bien mis mots ? sur l’inclusion du modele de la carte et pourtant j’ai pas les bons resultats. Ou bien cela ne marcherai qu’avec les boucles articles et NON sur une carte googlemaps ???
PS : sur la carte je dois avoir les articles attachés aux mots clés choisit
Merci de votre réponse
a tu hasard : ton #MODELE est-il appelé dans un fichier lui même inclus. Si oui, lui passe tu correctement l’option mots ?
Merci de votre réponse mais je suis toujours dans la galère. Le modèle carte_gis est dans un dossier modele qui se trouve à la racine du plugin gis. Alors je sais que si j’appel le modèle en faisant #MODELEcarte_gis je dois ajouter mots ? ce que j’ai fais mais rien ne marche.
je parlais du squelette qui appel
#MODELE{carte_gis}
: est-il lui même appelé par un autre squelette ?le modele carte_gis est appelé unique dans le squelette resultat.html pour afficher les articles sur la carte. et le squelette resultat est utilisé dans le formulaire
<form method="post" name="mot" action="spip.php?page=resultat">
Alors est ce que je dois passer l’option mots sur
"spip.php?page=resultat"
? si oui comment.?Merci encore pour votre aide, je ne suis pas bien en dev je me débrouille tout simplement
Répondre à ce message
Bonjour tout le monde,
J’utilise un formulaire, j’affiche 3 groupes et chaque groupe a ses propres mots clés. Mais je ne sais ce qu’il faut faire (quelle boucle) pour afficher les resultats correctement.
1/ si on choisit un mot clé que les articles attaché a ce mot s’affichent
2/ si on choisit deux mots clés qu’on ai la liste des articles qui sont attachés a ces deux mots clé(uniquement) sinon rien ....etc etc
voici le code qui affiche mon formulaire :
dans la page recherche2 j’ai ca :
mais j’ai pas le resultat que je cherche, surtout pour les 2 point que j’ai cité en haut par contre si je choisis 3 mots clé ,s’ils ont un article commun il s’affiche
Merci de votre aide
Je pense qu’il faudrait que vous ne mettiez pas de value à la balise option affichant le titre des groupes.
Bonjour,
J’ai une question suivant cette logique....Et si ma recherche se limiter dans une rubrique ??? parce qu’ avec ce formulaire la recherche se fait dans tout le site mais je me demande si on devait se limiter dans une seule rubrique ?
j’ai essayé de changer la boucle du resultat comme ca mais sans succer :
Merci de votre réponse
si votre boucle n’est pas dans un boucle rubriques, il ne va pas savoir de quelle rubrique on parle.
il faudrait que vous mettiez
{id_rubrique=NNN}
où NNN est le numéro de la rubrique.Il faudrait pour plus détail le contexte de boucle.
Répondre à ce message
Bonjour,
étant débutant sur spip, je n’ai pas bien compris comment marche le plugin critères.
Mon objectif : sur ma page articles, avoir une zone « voir aussi » avec des articles partageant des mot clés avec l’article courant.
Un bout de code-test où j’essaye d’ afficher le titre des articles ayant les mots clés n°33 et 30)
Rien ne passe et dans le debug de spip j’obtiens ceci pour le résultat de la boucle :
Merci beaucoup pour votre aide
Bon,
c’est expliqué dans la documentation, mais je reprend.
<BOUCLE_articles(ARTICLES){mots}>
En l’état, cela va utiliser le tableau mots passés en Environnement (voir mon article sur la balise #ENV), là vous avez mis non dans un tableau d’environnement mais dans une variable de type SET / GET.
Suiant le manuel dans la partie « les paramètres supplémentaires », vous devez passer un tableau en 3 paramètre.
Ce qui donne :
Tout marche ! Merci beaucoup pour l’aide et ce plugin !
Dernières question:s
Dans la boucle
Si je rajoute en critères 0,5, les articles listés seront affichés dans quel ordre ? au hazard ?
Existe-t-il une astuce pour que les 5 articles listés soient triés des plus « similaires » aux moins similaires ?
Clem
par défaut les articles seraient triés par identifiant (numero).
vous pouvez utiliser n’importe quel filtre de tri de SPIP.
Par contre, pour « du plus similaire au moins similaire » je vois pas, ne comprenant pas ce que vous entendez par « similaire ».
Un exemple pour ilustrer le mot « similaire »
Un article A possède ces mots clés :
- toto
- blibli
- blabla
Un article B possède ces mots clés :
- toto
- blibli
- dsqgcdsqg
Un article C possède ces mots clés :
- toto
- sdbsdh
- hgsqjdgsd
L’article B est « similaire » à 66% avec l’article A
L’article C est « similaire » à 33% avec l’article A
Existe-t-il un critère de tri ou une astuce pour mettre l’article B en premier et l’article C en deuxième ?
désolé, là comme cela je ne vois pas.
il faudrait que je creuse le SQL pour améliorer le plugins, mais je crois pas avoir le tps :(
Dommage :/ Tant pis on fera de l’aléatoire, ça marchera déjà très très bien.
Encore merci pour ce joli plugin !
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 :
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 : |