Il peut arriver parfois de vouloir sélectionner des objets SPIP (articles, rubriques, sites etc.), ayant un certains nombre de mot clefs connus.
Par exemple, je voudrais sélectionner les articles ayant les mots clefs « fruits » et « desserts », mais pas ceux qui n’ont que « déserts » 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}
Le critère {mots}
Prenons un exemple :
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 deux paramètres : ’score’ et ’tableau’. 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 en 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.
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.

- Le formulaire critère mots en action
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.



Version 1.2.3
Vos commentaires
# Le 17 juin à 22:44, par Julien Lanfrey
En réponse à : Critère {mots}
Bonjour,
Il semble y avoir un problème (v1.2.3 sous SPIP 2.1.21).
Si j’effectue un simple :
#TITRE avec les mots 1 ET 2<br />
</BOUCLE_art>
Et qu’AUCUN article n’a les 2, ça retourne tous les articles au lieu de n’en retourner aucun !!
Debug :
J’avoue que c’est un peu obscur pour moi...
Une idée ?
Julien
# Le 17 juin à 23:14, par Julien Lanfrey
En réponse à : Critère {mots}
Précisions sur le debug :
Dans la fonction « critere_mots_dist », si je rajoute le code suivant après le $boucle->hash .= ’....’ :
$prepare_mots = charger_fonction('prepare_mots', 'inc');
$mots_where = $prepare_mots($quoi, $boucle->id_table, $crit->cond, $score, $boucle->sql_serveur, $id_ou_titre);
Du coup, le $mots_where est bien connu...
Mais pour que ça fonctionne il faut de plus remplacer la ligne
$boucle->where[] = "\n\t\t".'$mots_where';par$boucle->where[] = "\n\t\t"."'$mots_where'";Sachant que si on le fait, ça ne fonctionnera plus dans le cas ou il y a effectivement au moins un article avec les 2 mots clés...
# Le 17 juin à 23:16, par Maïeul
En réponse à : Critère {mots}
il faudrait que je fasse des tests. J’essaierai de le faire demain après le boulot. N’hésitez pas seulement à me relancer sur le sujet
# Le 18 juin à 13:47, par Julien Lanfrey
En réponse à : Critère {mots}
Super, merci Maïeul !
# Le 18 juin à 19:49, par Maïeul
En réponse à : Critère {mots}
Je pense que spip filtre certains test trop stupide, du type WHERE 1=0.
Bref, http://zone.spip.org/trac/spip-zone/changeset/73711 permet de résoudre le pb. Le zip à jour sera disponible peu après 20h
# Le 19 juin à 18:55, par Julien Lanfrey
En réponse à : Critère {mots}
Et ben j’aurai pu chercher longtemps !
Ça fonctionne parfaitement désormais. Un grand merci pour pour ta réactivité.
Julien
Répondre à ce message
# Le 14 juin à 16:09, par Horetol
En réponse à : Critère {mots}
Bonjour,
Je n’ai peut-être pas compris comment faire fonctionner ce plugin.
La page de demo
/?page=demo/parmotstrouve bien tous les groupes de mots et tous les mots.Par contre si j’insère dans ma page sommaire ou dans une page article, selon votre exemple le code :
<div class="ajax">[(#FORMULAIRE_RECHERCHE_PAR_MOTS)]
</div>
Rien ne s’affiche, ni groupes de mots ni mots.
Où est mon erreur ?
Merci
# Le 14 juin à 16:26, par Maïeul
En réponse à : Critère {mots}
salut,
je ne comprend ton pb, vu que la copie d’écran affiche bien quelque chose (même si pb de chaînes de langues, j’en conviens)
Tu peux fournir une URL ?
malheureusement je ne suis pas l’auteur de cette fonctionnalité et du coup je ne sais pas trop comment cela fonctionne.
# Le 14 juin à 16:30, par Maïeul
En réponse à : Critère {mots}
salut,
je m’apercois que je n’ai pas répondu...
le pb est-t-il tjr là ?
# Le 14 juin à 16:48, par Horetol
En réponse à : Critère {mots}
Rien ne s’affichait. Après changement de navigateur et plusieurs recalcules un choix s’affiche dans la liste déroulante.
Par contre, il n’y pas la déclinaison proposée au-delà d’un premier mot, donc cela n’apporte à priori rien de plus.
Un lien vers une page d’essai du plugin : www.abipro95.com/ ?page=sommaire2
Merci
Répondre à ce message
# Le 27 mars à 21:46, par DD
En réponse à : Critère {mots}
Bonjour,
Ce plugin me sauve ! merci. Par contre je n’arrive pas à le faire fonctionne lorsque
[(#FORMULAIRE_RECHERCHE_PAR_MOTS{'',#URL_PAGE{pagederesultats}})]est placé dans le bloc navigation des pages articles (j’utilise ZPIP et composition) : il ne détecte aucun groupe de mots clés alors que situé dans une page indépendante cela fonctionne très bien.
Il y a sûrement un critère d’environnement ou autre qui restreint la sélection mais je ne trouve pas comment le résoudre.
Merci
# Le 27 mars à 21:56, par Maïeul
En réponse à : Critère {mots}
hum, malheureusement je ne suis pas spécialiste de zpip, mais a priori comme cela, je dirais qu’il faut vérifier que le fichier
body.htmldu thème actif inclus bien le bloc de navigation via<INCLURE{fond=navigation/#ENV{type},env}>, avec le env complet.# Le 27 mars à 23:49, par DD
En réponse à : Critère {mots}
Bonsoir,
merci de ta réponse. Oui le body est conforme (je n’y ai pas touché).
Lorsque je suis sur la page
site/?page=recherche_mot(construite avec Z) tout fonctionne avec :#SET{FiltreGroupes,#ARRAY}<BOUCLE_FiltreGroupes(GROUPES_MOTS)>
#SET{FiltreGroupes,
#GET{FiltreGroupes}|push{#ID_GROUPE}}
</BOUCLE_FiltreGroupes>
<div class="ajax">
[(#FORMULAIRE_RECHERCHE_PAR_MOTS{#GET{FiltreGroupes}}{#URL_PAGE{recherche_mot}})]
</div>
Si je suis sur un squelette d’article je peux choisir mes groupes de mots et les mots clés mais l’URL rechargée donne :
site/?article12&mots[]=94et donc on reste sur la même page sans avoir les résultats.
dd
Répondre à ce message
# Le 6 mars à 15:17, par Michaël
En réponse à : Critère {mots}
Bonjour !
J’utilise une navigation exclusivement par mots clés, avec beaucoup de mots clés attribués à chaque article (près de 100 mots en tout en en moyenne 10 à 15 mots par article).
Plus le temps passe et plus la boucle avec le critère mots devient lente.
J’ai donc fait un test et constaté que si le tableau mots contient les valeurs 1,2,3,
<Ma_boucle (articles) {mots}>#TITRE </Ma_boucle>est 2 à 3 fois plus lente (plus de 20s) que
<Ma_boucle (articles) {id_mot=1}{id_mot=2}{id_mot=3}> #TITRE </Ma_boucle>C’est encore pire si on augmente encore le nombre de mots.
J’ai donc tenté de monter ma boucle sur ce modèle, en php :
<?php
echo "<BOUCLE_articles(ARTICLES)";
echo "{id_mot=1}{id_mot=2}{id_mot=3}>";
echo "#TITRE</BOUCLE_articles>";
?>
Ca marche très bien mais le problème c’est que ça coince lorsque je généralise le code :
<?php
$mots = array();
$mots = $_GET["mots"];
echo "<BOUCLE_articles(ARTICLES)";
foreach($mots as $mot) {echo "{id_mot=$mot} ";}
echo ">";
echo "#TITRE</BOUCLE_articles>";
?>
Le problème semble vraiment venir de cette ligne :
echo ">";mais je ne vois pas pourquoi ! Le PHP et moi ne sommes pas très copains ;)
Quelqu’un aurait-il une idée, une explication, une piste pour soit utiliser le critère mots de manière plus rapide soit pour modifier mon code erroné !
Merci d’avance !
Michaël
# Le 6 mars à 18:35, par Michaël
En réponse à : Critère {mots}
Bon ça ne peut pas marcher comme ça car le php n’est interprété qu’apès les boucles !
Un coup pour rien ! Comment faire alors ?
# Le 6 mars à 18:40, par Maïeul
En réponse à : Critère {mots}
malheureusement quelque soit la solution le problème sera le même : faire des requete avec beaucoup de mot. Il faudrait avoir le code de la requete pour voir ce que ca donne et où est le problème exactement.
# Le 6 mars à 18:56, par Michaël
En réponse à : Critère {mots}
Je comprends bien que le nombre de mots fait que les requetes sont lourdes.
Mais malgré tout, si la tableau « mots » contient les mots (1,2,3) les deux boucles suivantes devraient s’executer à la meme vitesse :
<BOUCLE_articles(ARTICLES){id_mot=1}{id_mot=2}{id_mot=3}>#TITRE
</BOUCLE_articles>
<BOUCLE_articles(ARTICLES){mots}>#TITRE
</BOUCLE_articles>
Or la première est très nettement plus rapide et ce même lorsque l’on utilise la page démo. C’est ça qui m’interpelle !
# Le 6 mars à 18:59, par Maïeul
En réponse à : Critère {mots}
non car la requete généré n’a rien à voir
# Le 6 mars à 19:02, par Michaël
En réponse à : Critère {mots}
D’accord !
Par contre, le résultat est bien le même non ?
# Le 6 mars à 19:07, par RealET
En réponse à : Critère {mots}
var_mode=debug pour comparer permettra de voir que dans un cas, c’est un OU entre les id_mot, alors que
{mots}fait un ET# Le 6 mars à 20:10, par Michaël
En réponse à : Critère {mots}
Je confirme que non !
Je confirme que les résultats sont les mêmes et sont différents de ce que j’aurais obtenu avec un ou genre id_mot IN 1,2,3
# Le 6 mars à 20:31, par Michaël
En réponse à : Critère {mots}
Réponse apportée par « var_mode=debug »
Voici ma boucle :
<BOUCLE_articles(articles){id_mot=(#ENV{mots}|table_valeur{0})}{id_mot=(#ENV{mots}|table_valeur{1})}{id_mot=(#ENV{mots}|table_valeur{2})}{!par #ENV{tri,date}}{notation}{!par date}{pagination 10 }>et voici le début de la requete
SELECT articles.id_article, articles.id_secteur, rand() AS hasard, COUNT(notations.note) AS nombre_votes, ROUND(AVG(notations.note),2) AS moyenne, ROUND(AVG(notations.note)*(1-EXP(-5*COUNT(notations.note)/20)),2) AS moyenne_ponderee, articles.date, articles.id_rubrique, articles.titre, articles.descriptif, articles.id_rubrique, articles.lang
FROM spip_articles AS `articles`
LEFT JOIN spip_notations AS notations ON ( notations.id_objet = articles.id_article AND notations.objet=’article’)
INNER JOIN spip_mots_liens AS L3 ON ( L3.id_objet = articles.id_article AND L3.objet=’article’)
INNER JOIN spip_mots_liens AS L2 ON ( L2.id_objet = articles.id_article AND L2.objet=’article’)
INNER JOIN spip_mots_liens AS L1 ON ( L1.id_objet = articles.id_article AND L1.objet=’article’)
WHERE (articles.statut = ’publie’)
AND (L1.id_mot = 14)
AND (L2.id_mot = 22)
AND (L3.id_mot = 18)
GROUP BY articles.id_article,articles.id_article
ORDER BY articles.date DESC, articles.date DESC
Il s’agit bien d’un & !
En attendant de trouver une manière plus intelligente (que je ne suis pas capable de trouver tout seul), j’ai donc fait ça à la main ! Si ça peut aider quelqu’un.
1) J’ai pris pour hypothèse que sur mon site, personne ne voudra plus de 10 mots.
2) J’ai ensuite testé le nombre d’entrées de la variable MOTS crées par le formulaire. En fonction de cette valeur, j’appelle une noisette différente pour afficher les résultats.
#SET{filtre,0}
[(#ENV{mots}|table_valeur{0}|oui)#SET{filtre,1}]
[(#ENV{mots}|table_valeur{1}|oui)#SET{filtre,2}]
[(#ENV{mots}|table_valeur{2}|oui)#SET{filtre,3}]
[(#ENV{mots}|table_valeur{3}|oui)#SET{filtre,4}]
[(#ENV{mots}|table_valeur{4}|oui)#SET{filtre,5}]
[(#ENV{mots}|table_valeur{5}|oui)#SET{filtre,6}]
[(#ENV{mots}|table_valeur{6}|oui)#SET{filtre,7}]
[(#ENV{mots}|table_valeur{7}|oui)#SET{filtre,8}]
[(#ENV{mots}|table_valeur{8}|oui)#SET{filtre,9}]
[(#ENV{mots}|table_valeur{9}|oui)#SET{filtre,10}]
#INCLURE{fond=inclure/mots_result/page_mot_mots_result#GET{filtre},env,ajax,tri=#GET{valeur},}
Enfin, sur les différents fichiers résultats, je modifie mes boucles en fonction du nombres de mots clés
<BOUCLE_articles(ARTICLES) {id_mot=#ENV{mots}|table_valeur{0}} {id_mot=#ENV{mots}|table_valeur{1}} ........etcUn lien pour voir le résultat : http://www.librairie-interactive.com/spip.php?page=mot&mots[]
# Le 6 mars à 20:56, par Michaël
En réponse à : Critère {mots}
Si ça peut faire avancer, voici les deux requetes avec les 3 mêmes mots clés sélectionnés.
1) Avec
{mots}, qui s’execute en 26 sSELECT articles.id_article, articles.id_secteur, COUNT(notations.note) AS nombre_votes, ROUND(AVG(notations.note),2) AS moyenne, ROUND(AVG(notations.note)*(1-EXP(-5*COUNT(notations.note)/20)),2) AS moyenne_ponderee, articles.date, articles.id_rubrique, articles.titre, articles.descriptif, articles.id_rubrique, articles.langFROM spip_articles AS `articles`
LEFT JOIN spip_notations AS notations ON ( notations.id_objet = articles.id_article AND notations.objet='article')
WHERE (articles.statut = 'publie')
AND articles.id_article IN (
SELECT id_objet FROM spip_mots_liens WHERE id_mot=14 and objet='article' OR id_mot=22 and objet='article' OR id_mot=18 and objet='article' GROUP BY id_objet,objet HAVING SUM(1) >= 3
)
GROUP BY articles.id_article
ORDER BY articles.date DESC
2) En remplaçant
{mots} par {id_mot=...}{id_mot=...}{id_mot=...}qui s’execute en 1,5sSELECT articles.id_article, articles.id_secteur, rand() AS hasard, COUNT(notations.note) AS nombre_votes, ROUND(AVG(notations.note),2) AS moyenne, ROUND(AVG(notations.note)*(1-EXP(-5*COUNT(notations.note)/20)),2) AS moyenne_ponderee, articles.date, articles.id_rubrique, articles.titre, articles.descriptif, articles.id_rubrique, articles.langFROM spip_articles AS `articles`
LEFT JOIN spip_notations AS notations ON ( notations.id_objet = articles.id_article AND notations.objet='article')
INNER JOIN spip_mots_liens AS L3 ON ( L3.id_objet = articles.id_article AND L3.objet='article')
INNER JOIN spip_mots_liens AS L2 ON ( L2.id_objet = articles.id_article AND L2.objet='article')
INNER JOIN spip_mots_liens AS L1 ON ( L1.id_objet = articles.id_article AND L1.objet='article')
WHERE (articles.statut = 'publie')
AND (L1.id_mot = 14)
AND (L2.id_mot = 22)
AND (L3.id_mot = 18)
GROUP BY articles.id_article,articles.id_article
ORDER BY articles.date DESC, articles.date DESC
Je ne suis pas très doué en php et en sql mais ne serait-il pas possible d’utiliser cette requete directement avec le plugin ?
Amicalement !
Michaël
Répondre à ce message
# Le 21 février à 12:45, par christophe
En réponse à : Critère {mots}
bonjour,
avec spip 3.0.5, le plugin et une boucle SITES, il y a un bug dans la requête sur la table spip_mots_liens, l’objet recherché est « syndi » alors que dans la table, l’objet enregistré est « site »
SELECT syndic.id_syndic, syndic.url_site, syndic.nom_siteFROM spip_syndic AS `syndic`
WHERE (syndic.statut = 'publie')
AND (syndic.id_rubrique = 392)
AND syndic.id_syndic IN (
SELECT id_objet FROM spip_mots_liens WHERE id_mot=71 and objet='syndi' GROUP BY id_objet,objet HAVING SUM(1) >= 1
)
# Le 21 février à 13:01, par Maïeul
En réponse à : Critère {mots}
bien vu ;-)
j’ai reperé où était le problème, j’essaierai de le résoudre ce week-end.
# Le 23 février à 17:38, par Maïeul
En réponse à : Critère {mots}
je viens d’apporter le correctif.
http://zone.spip.org/trac/spip-zone/changeset/70134
le zip devrait normalement être prêt à 18h.
Répondre à ce message
# Le 28 août 2012 à 18:02, par Mike
En réponse à : Critère {mots}
Besoin d’un avis.
J’ai adapté le plugin pour ma navigation. Au départ c’était très efficace mais plus le site prend de l’empleur et plus il y a de visites et plus je trouve la navigation lente... trop lente pour ajouter plusieurs critères.
http://www.librairie-interactive.com/spip.php?page=mot&mots[]=27
je vous mets mon code issu du formulaire du plugin :
<div id="filtrerecherche">
<B_Tags>
<div id="postDetailInfos" >
<a class="bouton_supprimer" href="#URL_PAGE{mot,id_groupe=2}"
title="supprimer tous les filtres"><img src="/images/croix2.png"/></a>
<div class="titre_filtre"><h4>Filtre(s) activé(s) : </h4></div>
<BOUCLE_Tags(MOTS){id_mot IN #ENV{mots}} {par titre}{" "}>[(#SET{lesautresmots,[(#ENV{mots}|critere_mots_enleve_mot_de_liste{#ID_MOT})]})]
<div>
<a class ="filtre" href="[(#ENV{action}|parametre_url{mots,#GET{lesautresmots}}
|parametre_url{id_groupe,2})]"title="<:ecrire:info_supprimer_mot|ucfirst|attribut_html:> ([(#TITRE|ucfirst|textebrut|attribut_html)])" class="tags">
[(#TITRE|ucfirst)]</a>
</div>
</BOUCLE_Tags>
</div>
</B_Tags>
<form action='[(#ENV{action})]' method="post" id="formulaire_recherche_par_mot" class="formulaire_spip formulaire_recherche_par_mot">
<div>
#ACTION_FORMULAIRE{#ENV{action}}
<BOUCLE_Tagshidden(MOTS){id_mot IN #ENV{mots}}>
<input type="hidden" name="mots[]" value="#ID_MOT" />
</BOUCLE_Tagshidden>
[(#REM) N'afficher le choix du groupe que s'il y en a plusieurs ]
<BOUCLE_PlusieursGroupes(GROUPES_MOTS)
{id_groupe ?IN #ENV**{id_groupe}}{1,1}>
[(#ENV{le_groupe}|non)<input type="hidden" name="choixmot" value="1" />]
<label class="bloclabel1" for="recherchegroupe">
Ajouter un filtre dans la catégorie :</label>
<div id="recherchegroupe">
<BOUCLE_RechercheMot(GROUPES_MOTS){par num titre, titre}{id_groupe ?IN #ENV**{id_groupe}}>
<input type="radio" id="recherchegroupe"
name="le_groupe" class="searchfield" onclick="if ((this.value != '')
[ && (this.value != (#ENV{le_groupe}))]) { $('#formulaire_recherche_par_mot').submit();}"value="#ID_GROUPE"
[ (#ID_GROUPE|=={#ENV{le_groupe}}|?{'checked="checked"'})]/>
[(#TITRE|supprimer_tags)]
</BOUCLE_RechercheMot>
</div>
</BOUCLE_PlusieursGroupes>
<BOUCLE_LeGroupe(GROUPES_MOTS){id_groupe ?IN #ENV**{id_groupe}}>
<input type="hidden" name="legroupe" value="#ID_GROUPE" />
#SET{legroupe,#ID_GROUPE}
</BOUCLE_LeGroupe>
<input type="hidden" name="choixmot" value="1" />
<//B_PlusieursGroupes>
<B_MotsDuGroupe>
<label class="bloclabel2" >Avec le mot:</label>
<select id="recherchemot" name="mots[]" class="searchfield"
onclick="if ((this.value != '')[ && (this.value != (#ENV{id_mot}))]) {$('#formulaire_recherche_par_mot').submit();}">
<option value="">Choisissez un mot</option>
<BOUCLE_MotsDuGroupe(MOTS){id_groupe=#ENV{le_groupe,#GET{legroupe}}}{par titre}
{id_mot !IN #ENV{mots, #ARRAY{}}}>
#SET{avecunmotdeplus, #ARRAY{}}
[(#SET{avecunmotdeplus,[(#ENV{mots, #ARRAY{}}|push{#ID_MOT})]})]
<INCLURE{fond=formulaires/recherche_par_mots_compteur, mots=#GET{avecunmotdeplus}, id_mot=#_MotsDuGroupe:ID_MOT, titre=(#_MotsDuGroupe:TITRE|supprimer_tags)}>
</BOUCLE_MotsDuGroupe>
</select>
</B_MotsDuGroupe>
<noscript><div style="display:inline;"><input type="submit"
id="sendsearchmc" class="okfield form_submit" value="<:pass_ok:>" />
</div></noscript>
</div>
</form>
</div>
Merci d’avance pour votre aide.
# Le 28 août 2012 à 23:48, par Maïeul
En réponse à : Critère {mots}
heu, d’abord je vous déconseille d’utiliser
#ENV**.Ensuite j’ai du mal à voir la lenteur. Par contre le formulaire n’a pas l’air de marcher (ou alors c’est cela la lenteur, tellement lent qu’on a l’impression que c’est pété).
Par ailleurs, je ne vous voix pas utiliser le critère
{mots}, docn j’avoue ne pas saisir pourquoi vous écrivez ici.Je vous conseille pour tester vos problème d’utiliser le ?var_profile de spip (vous trouverez de la doc sur internet) qui vous permettra de savoir quels est la boucle problématique.
Bref, tout cela pour dire que j’ai un peu du mal à vous aider. Désolé =(
# Le 29 août 2012 à 15:45, par Mike
En réponse à : Critère {mots}
Je pense bien poster au bon endroit puisqu’il s’agit du formulaire du plugin présenté sur cet article.
Je ne suis pas l’auteur du ENV** qui vient du code d’origine.
Je ne connaissais pas ?var_profile mais ça ne semble pas fonctionner sur mon site. Je colle le code à la suite de mon url, en étant logué en admin mais la page du site s’affiche normalement et n’apporte donc aucune information.
j’imagine que je rate quelque chose ?
Pour ce qui est du formulaire, il fonctionne, très lentement parfois et à priori, cela est en lien avec le nombre de personnes sur le site.
# Le 29 août 2012 à 15:48, par Maïeul
En réponse à : Critère {mots}
il faudrait voir avec Real3T qui est à l’origine du forme. Je le previens.
# Le 14 février à 23:21, par Mike
En réponse à : Critère {mots}
Si ça peut aider quelqu’un j’ai un peu avancé. J’’ai modifié le fichier du formulaire « recherche_par_mots.html » en remplaçant l’inclusion de « recherche_par_mots_compteur » par
<option value="#_MotsDuGroupe:ID_MOT">[ (#_MotsDuGroupe:TITRE|supprimer_tags)]</option>Le squelette en question utilisait une boucle article avec une pagination de 1 et un grand total qui ralentissait énormément (trop) la requête.
Du coup, ça marche beaucoup plus vite (mais on perd) l’information sur le nombre d’articles que l’on va obtenir en choisissant d’ajouter le mot clé en question.
@Maïeul
« tellement lent qu’on a l’impression que c’est pété » je crois que le gardien du SQL privé OVH devait stopper la requête trop longue !
Malheureusement je n’ai pas encore complètement résolu mon problème. Le choix d’un nouveau mot clé est rapide à présent (2 à 3 secondes) mais plus on rajoute de mots clés, plus l’affichage des résultats devient long (dès que l’on dépasse 2-3 mots) alors que normalement, le nombre d’articles concernés allant en diminuant (du fait d’un filtre plus précis), l’affichage des résultats devrait être plus rapide (au pire aussi rapide qu’au début).
Même la pagination devient de plus en plus lente (voir extrèmement lente) lorsqu’il y a plusieurs mots sélectionnés !
Je ne sais pas du tout de quel côté chercher ! Je suis preneur de toute proposition.
Pour test : http://www.librairie-interactive.com/spip.php?page=mot&mots[]=14
Merci d’avance
Répondre à ce message
# Le 19 novembre 2012 à 15:19, par ???
En réponse à : Critère {mots}
Bonjour,
J’utilise ce plugin, j’ai 3 groupes de mots de clés et la recherche se passe bien, mais j’aimerai afficher dans la page résultat le titre des mots clés choisi pour la recherche et cela me pause problème. Pourtant j’ai mis la boucle mot mais rien ne s’affiche. Merci de votre aide. Voici la boucle de mon résultat :
<div id="annonces-liste">
[(#REM) Articles trouves ]
#ANCRE_PAGINATION
<BOUCLE_articles(ARTICLES) {recherche?} {!par #ENV{tri,points}} {mots?} {id_rubrique !IN 2} {pagination 10}>
<h2><a href="#URL_ARTICLE"><span class="prix">12 000 F à débattre</span>[(#TITRE)]</a></h2>
<div class="annonce-contenu">
[(#LOGO_ARTICLE|image_reduire{130,86}|image_passe_partout{130,86})]<span class="annonce-date">[(#DATE|affdate)]</span>[(#CHAPO)]<span class="annonce-date"><BOUCLE_g(GROUPES_MOTS){id_groupe IN 1,2,3}{" | "}>
<BOUCLE_m(MOTS){id_groupe}{id_article}><a href="#URL_MOT">[(#TITRE)]</a></BOUCLE_m>
</BOUCLE_g>
</span> </div></BOUCLE_articles>
</div>
[<div id="pagination">(#PAGINATION)</div>]
</B_articles>
</div>
# Le 20 novembre 2012 à 10:35, par Maïeul
En réponse à : Critère {mots}
je suis assez étonné : je ne vois rien de problematique dans la boucle.
Il faudrait regarder la requete SQL générée, via le
?var_mode=debug# Le 21 novembre 2012 à 22:44, par ???
En réponse à : Critère {mots}
Merci pour votre réponse la boucle est correcte et les résultats sont bon aussi. Ce que j’aimerai c’est d’afficher les titres des mots choisit. Par exemple kan je choisis les mots clés : mot1, mot2 et mot3, j’aimerai afficher dans ma page resultat dans une balise
<h1></h1>les mots clés choisis séparé par une virgule et afficher juste en bas la liste de tous les articles liés aux mots choisis :mot1, mot2, mot3
liste article
j’ai fais ces boucles mais j’arrive tjrs pas a récupéré le titre des mots clés :
<BOUCLE_mot(MOTS){id_mot=#ENV{mots}}>#TITRE</BOUCLE_m>et
<BOUCLE_mot(MOTS){id_mot=#ENV{id_mot}}>#TITRE</BOUCLE_m>
Merci de votre aide
# Le 23 novembre 2012 à 13:49, par ???
En réponse à : Critère {mots}
Bonjour tout le monde et à Maïeul,
Vous n’avez toujours pas de réponse à ma question
# Le 23 novembre 2012 à 13:50, par ???
En réponse à : Critère {mots}
J’ai essayé toutes les boucles possibles en mots clés, mais toujours pas de résultat. Merci encore de votre aide
# Le 23 novembre 2012 à 14:43, par Maïeul
En réponse à : Critère {mots}
a je comprend mieux ce que vous voulez. Votre présentation de départ n’était pas claire : je croyais que la boucle vous retournait un mauvais résultat. En fait vous voulez une nouvelle boucle pour autre chose.
La solution :
<BOUCLE_mots(MOTS){id_mot in #ENV{id_mot}}>...# Le 26 novembre 2012 à 14:29, par ???
En réponse à : Critère {mots}
bonjour Maïeul,
La solution n’affiche rien malheureusement, je ne sais pas ce qui cloche. voici mon formulaire :
<form method="get" action="spip.php?page=resultat"><input name='page' value='rechercheannonce' type='hidden' />
<B_g1>
<select name="mots[0]">
<BOUCLE_g1(GROUPES_MOTS){id_groupe IN 1}>
<option value="">#TITRE</option>
<BOUCLE_surmot(MOTS){id_groupe}>
<option value="#ID_MOT" [(#ENV{id_mot}|=={#ID_MOT}?{"SELECTED"})]>#TITRE </option>
</BOUCLE_surmot>
</select>
</BOUCLE_g1>
</B_g1>
<B_g2>
<select name="mots[1]">
<BOUCLE_g2(GROUPES_MOTS){id_groupe IN 2}>
<option value="">#TITRE</option>
<BOUCLE_surmot2(MOTS){id_groupe}>
<option value="#ID_MOT" [(#ENV{id_mot}|=={#ID_MOT}?{"SELECTED"})]>#TITRE </option>
</BOUCLE_surmot2>
</select>
</BOUCLE_g2>
</B_2>
<B_g3>
<select name="mots[2]">
<BOUCLE_g3(GROUPES_MOTS){id_groupe IN 3}>
<option value="">#TITRE</option>
<BOUCLE_surmot3(MOTS){id_groupe}>
<option value="#ID_MOT" [(#ENV{id_mot}|=={#ID_MOT}?{"SELECTED"})]>#TITRE </option>
</BOUCLE_surmot3>
</select>
</BOUCLE_g3>
</B_3>
<input type="submit" class="bouton" value="<:rechercher:>" />
</form>
et voici la page du resultat.html
<B_articles><h1><BOUCLE_mots(MOTS){id_mot in #ENV{id_mot}}>#TITRE</BOUCLE_mots></h1>
<div id="annonces-liste">
[(#REM) Articles trouves ]
#ANCRE_PAGINATION
<BOUCLE_articles(ARTICLES) {recherche?} {!par #ENV{tri,points}} {mots?} {id_rubrique !IN 2} {pagination 10}>
<h2><a href="#URL_ARTICLE"><span class="prix">12 000 F à débattre</span>[(#TITRE)]</a></h2>
<div class="annonce-contenu">
[(#LOGO_ARTICLE|image_reduire{130,86}|image_passe_partout{130,86})]<span class="annonce-date">[(#DATE|affdate)]</span>[(#CHAPO)]<span class="annonce-date"><BOUCLE_g(GROUPES_MOTS){id_groupe IN 1,2,3}{" | "}>
<BOUCLE_m(MOTS){id_groupe}{id_article}><a href="#URL_MOT">[(#TITRE)]</a></BOUCLE_m>
</BOUCLE_g>
</span> </div></BOUCLE_articles>
</div>
[<div id="pagination">(#PAGINATION)</div>]
</B_articles>
comme tu le vois dans le
<h1></h1>j’ai bien mis la solution de la boucle mot pour afficher les titres mais rien ne s’affiche. Merci de ton aide# Le 26 novembre 2012 à 14:36, par Maïeul
En réponse à : Critère {mots}
en fait vu votre formulaire, il vous faut
<BOUCLE_mots(MOTS){id_mot in #ENV{mots}}>....Je vous invite à lire La balise #ENV
# Le 26 novembre 2012 à 16:53, par ???
En réponse à : Critère {mots}
Salut Maïeul,
Merci pour la réponse, j’y était presque en faisant :
<BOUCLE_mot(MOTS){id_mot=#ENV{mots}}>#TITRE</BOUCLE_m>au lieu de ta boucle
<BOUCLE_mot(MOTS){id_mot in #ENV{mots}}>#TITRE</BOUCLE_m>Mais je ne comprend toujours pas pourquoi il ya que le titre du group1 qui est affiché, même si
je choisis 2 ou 3 mots clés...où se trouve le problème ? Merci encore de ton aide
# Le 26 novembre 2012 à 16:57, par Maïeul
En réponse à : Critère {mots}
tu aurais un url de demo ?
# Le 27 novembre 2012 à 17:03, par ???
En réponse à : Critère {mots}
Salut,
voici l’url URL
Merci de ton aide !
PS : Il ya que le titre du mot clé de groupe1 qui s’affiche, sinon les autres ne s’affichent pas. Même si on choisit 2 ou 3 mots clés, seul le tire de groupe1 s’affiche
# Le 28 novembre 2012 à 23:15, par ???
En réponse à : Critère {mots}
Bonjour Maïeul,
vous avez vu l’url ?
# Le 30 novembre 2012 à 12:06, par Maïeul
En réponse à : Critère {mots}
je tombe sur une erreur 404.
le mieux serait que vous me fassiez parvenir un dump de votre base et vos squelette par email
# Le 4 décembre 2012 à 22:09, par Maïeul
En réponse à : Critère {mots}
ok, mea culpa.
Donc c’est
{id_mot IN #ENV{mots}}avec le IN en majuscule.Répondre à ce message
# Le 3 septembre 2012 à 18:03, par Sh2o
En réponse à : Critère {mots}
Bonjour,
Je viens d’installer le plugin, il fonctionne très bien lorsque je ne choisis qu’un critère. En revanche il m’affiche systématiquement tous les articles dès que je choisi plusieurs mots-clefs... j’ai essayé de suivre les différentes préconisations mais rien à faire.... help please !!
# Le 3 septembre 2012 à 22:31, par Maïeul
En réponse à : Critère {mots}
peut tu expliquer un peu plus ? est-ce que le bug n’est pas celui décrit par RealET ci dessous. ?
ps : inutile de crier, ca ne fait pas plus venir les gens.
Répondre à ce message
# Le 27 avril 2012 à 12:34, par RealET
En réponse à : Critère {mots}
Bonjour,
J’ai trouvé un « bug » du plugin.
Soit un mot affecté à autre chose qu’un article (chez moi, c’est valable si c’est un auteur, une rubrique, un site).
À ce moment là,
<BOUCLE_recherche_par(ARTICLES){mots_selon_id}{pagination 1}>[<option value="(#ENV{id_mot})">[ (#ENV{titre})][ ((#GRAND_TOTAL))]</option>]</BOUCLE_recherche_par>Renvoie tous les articles.
Testé avec mots_selon_id et aussi avec mots.
Autrement dit, dès qu’un mot est affecté à autre chose qu’un article, le critère utilisé dans une boucle article renvoie tous les articles alors qu’il devrait n’en renvoyer que ceux qui ont les mots clefs cherchés.
# Le 2 mai 2012 à 16:40, par Maïeul
En réponse à : Critère {mots}
quel version de SPIP ? j’avoue que je ne suis pas fort dans ce domaine, c’est fil le responsable du code, moi je me suis juste contenter d’établir la syntaxe.
# Le 2 mai 2012 à 16:54, par RealET
En réponse à : Critère {mots}
Il s’agit de SPIP 2.1.13
# Le 30 août 2012 à 11:56, par Sylvie59
En réponse à : Critère {mots}
Bonjour
Avez-vous réussi à résoudre ou contourner ce bug. J’ai un souci ressemblant et je ne peux pas croiser les critères des différents groupes.
Soit les actions suivantes :
- un mot-clé A est sélectionné dans l’un des groupes de mot-clés ;
- les articles associés au mot-clé A choisi s’affichent ;
- on choisit un deuxième groupe de mots-clés dans lequel sélectionner un nouveau critère ;
- les mots-clés de ce deuxième groupe réagissent alors selon deux cas de figure : s’il existe des articles qui sont associés à la fois à un mot-clé de ce deuxième groupe ET au mot-clé A précédemment choisi , le mot-clé s’affiche avec un GRAND_TOTAL exact ; s’il n’existe pas d’articles associés à un mot-clé de ce deuxième groupe ET au mot-clé A précédemment choisi, le mot-clé s’affiche avec un GRAND TOTAL incohérent.
- si on choisit en deuxième critère le mot-clé dont le GRAND TOTAL est incohérent, on provoque l’affichage de tous les articles.
J’utilise SPIP 2.1.10.
Je ne trouve pas la raison de ce problème.
Merci de votre réponse
# Le 30 août 2012 à 12:41, par Maïeul
En réponse à : Critère {mots}
malheureusement non, je n’ai pas eu le tps de me pencher dessus.
Il faudrait que vous m’envoyiez un extrait de la base de donnée qui pose pb, que j’ai de quoi bosser.
Répondre à ce message
# Le 1er août 2012 à 12:30, par John
En réponse à : Critère {mots}
Bonjour,
ce plugin est-il vraiment utilisable avec Spip 3.0 ?
J’essaie d’installer la version 1.2.3 (la seule disponible au téléchargement) sur mon site en Spip 3.0, et le gestionnaire des plugins m’informe qu’il ne peut pas être installé car il est incompatible.
Est-il possible de récupérer une version compatible dans ce cas ?
Merci
# Le 1er août 2012 à 13:13, par Maïeul
En réponse à : Critère {mots}
oui, il existe une version, que je n’ai pas personellement testée. Je viens de dire à la zone de générer le zip. Il faut que vous attendiez 18h pour l’avoir via le chargeur automatique, ou 14h pour la récuperer directement sur http://plugins.spip.net (version 2.0)
Répondre à ce message