SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

286 Plugins, 197 contribs sur SPIP-Zone, 284 visiteurs en ce moment

Accueil > Navigation > Critère mots > Critère mots

Critère {mots}

6 août 2009 – par Fil, Maïeul, RealET – 316 commentaires

39 votes

Permettre de sélectionner facilement des objets SPIP ayant un ou des mots clefs en communs.

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 « 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}

Il ne faut utiliser qu’une seule fois par boucle l’un de ces critères.

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 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.

PNG - 8.5 ko
Le formulaire critère mots en action

Usage du formulaire

-  Sur une seule page

  • en affichant tous les groupes de mots :
    1. <div class="ajax">
    2. [(#FORMULAIRE_RECHERCHE_PAR_MOTS)]
    3. </div>

    Télécharger

  • en n’affichant que certains groupes de mots :
    1. #SET{FiltreGroupes,#ARRAY}
    2. <BOUCLE_FiltreGroupes(GROUPES_MOTS){titre==^[^_]}>
    3. #SET{FiltreGroupes,
    4. #GET{FiltreGroupes}|push{#ID_GROUPE}}
    5. </BOUCLE_FiltreGroupes>
    6. <div class="ajax">
    7. [(#FORMULAIRE_RECHERCHE_PAR_MOTS{#GET{FiltreGroupes}})]
    8. </div>

    Télécharger

    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 :

  1. [(#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.

Voir en ligne : http://plugins.spip.net/critere_mots

P.-S.

Attention : la partie formulaire de ce plugin ne fonctionnera pas avec la version 2.0.10 de SPIP. Il faut :

On pourra utiliser le plugin pour, par exemple afficher les articles connexes.

Notes

[1Pour des pages incluses, il suffit de passer {mots} comme paramètre d’inclusion.

[2Car un nombre entre 0 et 1 est un pourcentage

[3Si vous n’avez pas désactivé javascript

Dernière modification de cette page le 28 novembre 2016

Retour en haut de la page

Tout afficher

Vos commentaires

  • Le 5 décembre à 17:16, par Julien En réponse à : Critère {mots}

    Utilisation de mots dans un include.

    Je souhaite utiliser ce critères mots ? dans un fichier include.

    inclusion : [(#INCLUREfond=inc_ressource_mot_and id_rubrique=#ENVidrubriquerechercheid_motid_auteurenvajax)]

    Boucle dans le include :

    -  peut-on mettre un ? comme pour un autre critère optionnel ?
    -  à première vue il ne comprend pas si on ajoute simplement id_mot à l’include. Faut-il refaire le tableau id_mot ?

    Merci de votre aide.
    Julien

    Répondre à ce message

  • Le 21 novembre à 14:09, par Spipmalion En réponse à : Critère {mots}

    Bonjour,

    Depuis la maj vers plugin SPIP critère mots 3.0.1 le critère  !id_mot ne fonctionne plus

    Fait planter le site, erreur SQL :

    1. <BOUCLEa(MONOBJET){!id_mot=5}{mots}>

    Le critère !id_mot n’est pas pris en compte :

    1. <BOUCLEa(MONOBJET){mots}{!id_mot=5}>

    On dirait en revanche que les requêtes SQL sont plus rapides.

    • Le 21 novembre à 17:59, par Maïeul En réponse à : Critère {mots}

      oui, les requetes SQL sont plus rapides. C’était du reste le but de l’optimisation.

      Faut que je vois pour la question du critère {!id_mot}, mais celui-ci est déjà piègeux dans certains cas.

      Bref, je vais essayer de voir cela ce week-end. N’hésite pas àme relancer si besoin.

    • Le 22 novembre à 07:12, par Spipmalion En réponse à : Critère {mots}

      Up up relance urgent, site foutu sans !id_mot= ; normalement il devrait y avoir des centaines de milliers de sites foutus suite à cette maj, avec des boucles qui séléctionnent n’importe quoi

      Une autre manière d’exclure un mot d’une boucle en attendant que celui-ci refonctionne ?

      Merci d’avance

    • Le 22 novembre à 10:17, par Maïeul En réponse à : Critère {mots}

      mettre

      define ('_CRITERE_MOTS_OPTIMISE',0);

      dans mes_options.php. Cela rebasculera sur l’ancien système, plus lent mais visiblement fonctionnel. Désolé mais je peux pas m’occuper de voir comment utiliser le système optimisé avant dimanche.

    • Le 24 novembre à 00:13, par Maïeul En réponse à : Critère {mots}

      bon, j’ai pu me dégager du temps. La version 4.0.0 évite ce problème tout en optimisant la requete (ou plus précisement, en contournant un bug de mysql 5)

    • Le 1er décembre à 16:48, par Maïeul En réponse à : Critère {mots}

      un petit retour sur la version 4.0.0 ? apparemment ce n’était pas si urgent que cela…

    • Le 1er décembre à 22:00, par Spipmalion En réponse à : Critère {mots}

      Bonjour Maïeul,

      J’ai du recoder en urgence le site en utilisant un autre système suite à la défaillance du plugin
      Je vais le réutiliser et te donnerais un retour
      Merci pour la mise à jour

      Bien cordialement

    • Le 1er décembre à 22:13, par Maïeul En réponse à : Critère {mots}

      pourtant je t’ai donné en 4 heure la réponse pour revenir à l’ancien systeme…

      et franchement ton cas est à mon avis vraiment exceptionnel…

    • Le 2 décembre à 05:57, par Spipmalion En réponse à : Critère {mots}

      Les joies de l’informatique !

    • Le 2 décembre à 09:57, par 1138 En réponse à : Critère {mots}

      Oui, {!id_mot=XX} est parfois piégeux. Pour des boucles de recherches, notamment, j’ai dû utiliser {!titre_mot=exclure} pour avoir le résultat voulu. Ce n’est pas l’idéal mais ça fonctionne.

    Répondre à ce message

  • Le 1er décembre à 15:50, par 1138 En réponse à : Critère {mots}

    Bonjour.

    Sur mon site de tests, après passage de la version 3.0.1 à 4.0.0, et sur une page utilisant le critère mots, j’ai le contenu de l’array qui s’affiche au-dessus du doctype (et sur la page !) :

    array(14) {
     [0]=>
     string(5) "13192"
     [1]=>
     string(5) "13210"
     [2]=>
     string(5) "13218"

    […]

     [12]=>
     string(5) "13365"
     [13]=>
     string(5) "13594"
    }

    Les strings correspondent bien aux articles (publiés ou non) ayant le mot-clé demandé. Je n’ai pas vu d’autre problème : le reste de la page s’affiche correctement.

    SPIP 3.1.3, PHP 5.3.3 (Je sais, je dois demander à notre hébergeur de faire un upgrade…)

    Joyeux décembre !

    1138.

    • Le 1er décembre à 16:48, par Maïeul En réponse à : Critère {mots}

      la version 4.0.1 corrige cela, elle devrait être disponible vers 18h.

    • Le 1er décembre à 17:50, par 1138 En réponse à : Critère {mots}

      Testé et approuvé. 👍

    Répondre à ce message

  • Le 28 octobre à 11:56, par Vero En réponse à : Critère {mots}

    Bonjour,

    La mise à jour de la version 2.1.6 à 3.0.0 sur un spip 3.1.3 plante complètement le site (obligé de supprimer le répertoire du plugin en ftp ...)

    Le problème se produit sur le site en production, en revanche, la mise à jour ne me pose aucun problème sur une copie locale.

    Je n’ai aucune traces dans les logs. Problème version PHP, MySQL ???

    Merci pour vos lumières ... et pour ce plugin.

    • Le 28 octobre à 12:04, par Maïeul En réponse à : Critère {mots}

      A priori cette mise à jour devrait plutôt être bénéfique. Il faudrait voir quelle est la boucle qui pose souci. Vider le cache aussi. Et activer les logs détaillés pour plus de détails. Voir le dernier paragraphe de cet article : http://www.spip.net/fr_article4453.html

    • Le 28 octobre à 12:25, par Vero En réponse à : Critère {mots}

      Merci pour la rapidité de la réponse !
      Je vais attendre une heure de moindre activité pour reprendre calmement cette tentative.
      Quoiqu’il arrive, je reviens vers vous pour le bilan.

    • Le 28 octobre à 16:51, par 1138 En réponse à : Critère {mots}

      J’ai eu exactement le même problème que Vero avec un Spip 3.0.24, et je l’ai corrigé de la même manière qu’elle.

      J’essayerai après ce long weekend sur le site de dev (3.1.3).

    • Le 28 octobre à 16:55, par Maïeul En réponse à : Critère {mots}

      Vero n’indique pas comment elle a corrigé…

    • Le 28 octobre à 17:16, par 1138 En réponse à : Critère {mots}

      En effet, ce n’est pas vraiment corrigé : elle a viré la version 3.0.0 par FTP 😉. J’ai fait pareil et remis la 2.1.6…

    • Le 28 octobre à 22:58, par Vero En réponse à : Critère {mots}

      J’ai refait une tentative :

      1. Désinstaller la version 2.6
      2. Vider les caches
      3. Logs détailles
      4. Installer version 3.0

      Rien à faire : tout plante, le site devient totalement inaccessible côté public et côté privé.

      Je n’ai rien trouvé dans les logs ... ceci étant, SPIP plante dès l’activation.

    • Le 29 octobre à 09:11, par Maïeul En réponse à : Critère {mots}

      il faudrait voir s’il y a pas de conflit avec d’autres plugins. Chez moi aucun souci pour activer.

    • Le 29 octobre à 09:17, par Maïeul En réponse à : Critère {mots}

      il faudrait voir si le fait de mettre

      define('_INTERDIRE_COMPACTE_HEAD_ECRIRE', 1);
      define('SPIP_ERREUR_REPORT',E_ALL);
      error_reporting(E_ALL^E_NOTICE);

      dans mes_options.php affiche des messages d’erreurs spécifiques.

    • Le 29 octobre à 14:21, par vero En réponse à : Critère {mots}

      Le problème se produit sur un site en production.

      La même configuration SPIP (version, plugins installés) sur mon serveur local ne pose aucun problème.

      Activer toutes les erreurs sur le site en production et le planter est un peu délicat ...

      En revanche, les 2 configurations APACHE sont différentes.
      Je peux vous donner le détails.

      Url en ligne : http: // www . enviroboite . net

    • Le 29 octobre à 14:22, par Maïeul En réponse à : Critère {mots}

      effectivement des details serait pas mal.

      Mais sinon installer spip dans un sous dossier le temps des tests ?

    • Le 29 octobre à 15:46, par Vero En réponse à : Critère {mots}

      Oui, j’y ai pensé ... mais il faut que je trouve la fenêtre de temps.

      En attendant, j’ai les 2 phpinfos en version html, comment vous les faire parvenir ?

      Faire un zip des 2 et le renommer en png ? C’est peut-être moyen pour le fil si cela passe ...

    • Le 29 octobre à 15:51, par Maïeul En réponse à : Critère {mots}

      imprimer en PDF et m’envoyer un courriel monprenom@monprenom.net

    • Le 29 octobre à 16:41, par Vero En réponse à : Critère {mots}

      Je vous ai envoyé les phpinfo par mail ... et je viens de tester sur une nouvelle installation, sans autre plugin, histoire de trouver l’éventuel « coupable », et avec tous les reports activés.

      Il se passe exactement la même chose : plantage puis rien.

       ???

      En scannant les logs, j’ai trouvé ceci dans spip.log

      Activer le plugin « @plugin@ » (version : @version@) : variables inutilisees version_maj

      Suivi de

      redirige 302 : http://www.enviroboite.net/test/ecrire/?exec=admin_plugin&action=actionner&redirect=http%3A%2F%2Fwww.enviroboite.net%2Ftest%2Fecrire%2F%3Fexec%3Dadmin_plugin

      Je ne sais pas si cela peut aider ?

      Je vous envoie les logs par mail.

    • Le 30 octobre à 12:48, par Maïeul En réponse à : Critère {mots}

      lA version 3.0.1 corrige ce bug, qui concerne uniquement les versions de PHP < 5.4

    • Le 4 novembre à 15:36, par 1138 En réponse à : Critère {mots}

      Ça marche au poil. 👍

      Merci !

    Répondre à ce message

  • Le 6 mars 2013 à 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 2013 à 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 2013 à 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 2013 à 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 2013 à 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 2013 à 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 2013 à 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 2013 à 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 2013 à 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}} ........etc

      Un lien pour voir le résultat : http://www.librairie-interactive.com/spip.php?page=mot&mots[]

    • Le 6 mars 2013 à 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 s

      SELECT 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.lang
      FROM 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,5s

      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

      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

    • Le 18 octobre à 11:39, par Maïeul En réponse à : Critère {mots}

      bon, je viens de retomber sur cette comparaison.
      La différence tient principalement à la question de SUM(1) >= 3. Ceci est lié au paramètre de boucle qui permet de faire la recherche y compris s’il n’y a pas 100 % des mots qui sont affecté à l’objet.

      Etant donné que ce cas est facilement detectable, on pourrait effectivement mettre un comportement différent pour gagner en vitesse.

    • Le 21 octobre à 11:35, par Maïeul En réponse à : Critère {mots}

      il n’est techniquement pas possible d’avoir un critère qui produise ta requete, du à des limites du compilateur de SPIP (ou alors à mes propres limite), mais la version 3.0.0 du plugin produit une requete qui contourne le bug de mysql.

      SELECT articles.titre, articles.id_article, articles.lang FROM `mu_localhost`.spip_articles AS `articles` INNER JOIN `mu_localhost`.spip_mots_liens AS mots_liens ON ( mots_liens.id_objet = articles.id_article AND mots_liens.objet='article') WHERE (articles.statut = 'publie') AND ((mots_liens.id_mot=1) OR (mots_liens.id_mot=2) OR (mots_liens.id_mot=3) OR (mots_liens.id_mot=4) OR (mots_liens.id_mot=5) OR (mots_liens.id_mot=6) OR (mots_liens.id_mot=7) OR (mots_liens.id_mot=8) OR (mots_liens.id_mot=9) OR (mots_liens.id_mot=10)) GROUP BY articles.id_article HAVING COUNT(mots_liens.id_objet) >= 10

      à la place de

      SELECT articles.id_article, articles.titre, articles.lang FROM `mu_localhost`.spip_articles AS `articles` WHERE (articles.statut = 'publie') AND articles.id_article IN ( SELECT id_objet FROM `mu_localhost`.spip_mots_liens WHERE id_mot=1 and objet='article' OR id_mot=2 and objet='article' OR id_mot=3 and objet='article' OR id_mot=4 and objet='article' OR id_mot=5 and objet='article' OR id_mot=6 and objet='article' OR id_mot=7 and objet='article' OR id_mot=8 and objet='article' OR id_mot=9 and objet='article' OR id_mot=10 and objet='article' GROUP BY id_objet,objet HAVING SUM(1) >= 10 )

      La première requete est cent fois plus rapide que la seconde.

      A noter que la lenteur est du à un bug de mysql, résolu dans les nouvelles versions (6.x) https://bugs.mysql.com/bug.php?id=32665

    Répondre à ce message

  • Le 1er septembre à 21:32, par RealET En réponse à : Critère {mots}

    Bonjour,

    Je rencontre un problème de réantrance.
    Je m’explique : je veux :

    • avoir 3 listes de mots sélectionnables (cases à cocher)
    • récupérer les événements qui ont au moins un mot de chaque liste (ou pas de filtre sur cette liste si aucun mot n’est sélectionné dans une liste)

    Autrement dit, un filtre à la LDLC.com

    Côté formulaire, c’est bon !

    Côté boucle, en lisant la doc, j’en ai conclus que

    1. <BOUCLE_Evt2(EVENEMENTS)
    2. {par date_debut}
    3. {mots? 0 #ENV{motstheme}}
    4. {mots? 0 #ENV{motscible}}
    5. {mots? 0 #ENV{motszone}}
    6. >

    Télécharger

    devrait marcher.

    Le Code SQL généré est presque bon, à un détail près : il prend en compte 3 fois les mots sélectionnés dans la 3e liste :

    1. SELECT evenements.id_evenement, evenements.date_debut, evenements.titre
    2. FROM spip_evenements AS `evenements`
    3. WHERE (evenements.statut = 'publie')
    4. AND evenements.id_evenement IN (
    5. SELECT id_objet FROM spip_mots_liens WHERE id_mot=27 and objet='evenement' OR id_mot=31 and objet='evenement' GROUP BY id_objet,objet HAVING SUM(1) >= 0
    6. )
    7. AND evenements.id_evenement IN (
    8. SELECT id_objet FROM spip_mots_liens WHERE id_mot=27 and objet='evenement' OR id_mot=31 and objet='evenement' GROUP BY id_objet,objet HAVING SUM(1) >= 0
    9. )
    10. AND evenements.id_evenement IN (
    11. SELECT id_objet FROM spip_mots_liens WHERE id_mot=27 and objet='evenement' OR id_mot=31 and objet='evenement' GROUP BY id_objet,objet HAVING SUM(1) >= 0
    12. )
    13. ORDER BY evenements.date_debut

    Télécharger

    J’ai essayer de regarde le code du critère, mais je ne sais pas pourquoi $quoi n’est pas pris en compte pour différencier les 3 IN (SELECT...

    • Le 18 octobre à 11:27, par Maïeul En réponse à : Critère {mots}

      salut,
      je viens de voir ton message. Comme cela je ne sais pas. Il me faudrait vraiment une base de test et un formulaire pour y voir plus clair.

    Répondre à ce message

  • Le 6 décembre 2014 à 22:05, par flouvel En réponse à : Critère {mots}

    Bonjour,
    un mixte des 2 cas précédents : sélection selon 2 groupes de mots clés avec des cases à cocher. Pour le 1er groupe un seul mot peut être choisi, pour le 2nd on peut en choisir plusieurs. recherche_blocs . cool ! merci Maïeul

    Le critére {mot} se traduit donc par des & sur les mots clés sélectionnés
    Dois-je abandonner son utilisation pour essayer de faire des « ou » ? comme le ferait :
    <BOUCLE_objets(OBJETS) {id_mot IN gpe1} {id_mot IN gpe2}>
    (avec {mot} selectionner Enfant + Caramel abouti à 0 résultat car un circuit ne peut pas être les 2 . J’ai vainement longuement essayé de faire sortir ceux qui était l’un ou l’autre, l’idée me semblait de renvoyer 2 #GET, un pour le gpe1 et un pour le gpe2 , mais je m’en sors pas, (et c’est déjà pas si mal comme ça ! ) mais si vous avez des suggestions, doc plus concrète que programmer.spip , des exemples plus simple à décrypter que page=demo/parmots (qui ne marche pas), je suis preneur.

    • Le 5 mars 2015 à 21:09, par flouvel En réponse à : Critère {mots}

      Bonjour,
      m’agace, ça marche (liens ci-dessus, code ci-dessous) mais, pourquoi ?!
      (et toute mes tentatives de faire autrement, de décomposer le pb, se solde par des échecs. Pourtant ça devrait pas marcher avec name=mots[] pour tous les checkbox ?...)
      le code (qui marche) :

      1. <form class="form-inline" role="form" method="get" action="#SELF">
      2. [(#SELF|parametre_url{mots,''}|form_hidden)]
      3. <BOUCLE_mots1(MOTS){id_groupe=1} {par num titre} {2,11} >
      4. <label class="checkbox-inline" for="mot#ID_MOT">
      5. <input type="radio" class="checkbox" name="mots[]" id="mot#ID_MOT"
      6. value="#ID_MOT"[(#ENV{mots}|find{#ID_MOT}|oui) checked="checked"] />
      7. #TITRE</label>
      8. </BOUCLE_mots1>
      9. <!-- type="checkbox" type="radio" -->
      10. <BOUCLE_mots4(MOTS){id_groupe=4} {par num titre}{", "}>
      11. <label class="checkbox-inline" for="mot#ID_MOT">
      12. <input type="checkbox" class="checkbox" name="mots[]" id="mot#ID_MOT"
      13. value="#ID_MOT"[(#ENV{mots}|find{#ID_MOT}|oui) checked="checked"] />
      14. #TITRE</label>
      15. </BOUCLE_mots4>
      16. <p class="boutons">
      17. <input type="submit" class="submit" value="<:bouton_chercher:>" /></p>
      18. </form>
      19.  
      20. [(#REM) Albums trouves ]
      21. <BOUCLE_albums(ALBUMS) {mots} {branche?} {0,100} {pagination 10}>
      22. ...

      Télécharger

    • Le 7 mars 2015 à 14:52, par flouvel En réponse à : Critère {mots}

      Bonjour,
      oui pourquoi ? je me suis plongé calmement dans cet ardu code, avec la doc officiel, et des infos glanées sur le net (d’autres tournent sur le pb), et beaucoup de persévérance je commence à y comprendre un petit peu qcq chose. Je propose cette article pour les débutants (je l’ai publié, comme ébauche wiki de contribution pédagogique, il m’’a été personnellement utile de le faire, mais je ne me vexerai pas si on juge que c’est trop simple et succin)

    • Le 7 mars 2015 à 19:12, par Maïeul En réponse à : Critère {mots}

      je ne saisi pas le rapport entre votre problème et l’article. L’un parle de {mots} l’autre de CVT.

    • Le 14 mars 2015 à 21:29, par flouvel En réponse à : Critère {mots}

      Bonjour Maïeul,
      je ne suis pas parvenu à faire fonctionner le formulaire CVT demo/parmots, aussi je n’ai pu utiliser {mots} que grâce à tes explications dans ce forum. Donc oui mon article pour « débutant CVT », n’a pas de rapport exclusif avec {mots}, mais ce serait bien d’avoir (et j’espère parvenir à) un ou des formulaires CVT fonctionnelles pour {mots}, non ?

    • Le 14 mars 2015 à 21:33, par Maïeul En réponse à : Critère {mots}

      il y a le formulaire deja proposé, mais ce n’est pas mois l’auteur ... je ne sais pas je n’ai pas trop le tps en ce moment ...

    Répondre à ce message

  • Le 16 septembre 2014 à 14:04, par -orl- En réponse à : Critère {mots}

    Bonjour,

    J’ai besoin de ce plugins pour insérer un formulaire de recherche sur un site que je suis en train de réaliser.
    Voilà un bon moment que je me casse les dents dessus.

    Mon objectif :
    Sur une page réunissant plusieurs brèves, je souhaite que les visiteurs puissent effectuer un trie de ces brèves selon les mots clefs qu’ils auront choisie.
    J’ai 3 groupes de mots clefs et je souhaite que le trie soit effectué selon deux de ces groupes (le troisième me servant ailleurs, mais pas dans ce cas présent).
    Mes deux groupes comportes chacun plusieurs mots clefs :
    Il y a le groupe « Age » qui a pour mots clefs : « chaton », « junior », « adulte », « senior ».
    Et le groupe « Sexe » qui a pour mots clefs : « mâle » et « femelle »

    Les visiteurs peuvent ne choisir que l’un des deux groupes s’il le souhaite (par exemple il recherche un chaton, mais n’ont pas de préférence sur le sexe), ou les deux (si par exemple ils recherchent précisement un chat adulte femelle).

    Je veux donc que sur un même page, par défaut toutes les brèves s’affichent, et que si le visiteur le désire, un tri soit effectué selon ses critères et que cela recharge la liste des brèves sur cette même page.

    Pour afficher mes brèves j’ai ce code :

    1. <B_breves>
    2. <ul>
    3. <BOUCLE_breves(BREVES) {id_rubrique} {!par date}}>
    4. <li class="adoption">
    5. <div class="breveleft">
    6. <a href="#URL_BREVE">[(#LOGO_BREVE|image_reduire{190,0}|image_recadre{140,140,center})]</a>
    7. </div>
    8. <div class="breveright">
    9. [<a href="#URL_BREVE"><span class="titre_chat">(#TITRE)<span></a>]
    10. [<span><strong>Sexe :</strong> (#LISTER_VALEURS{sexe})</span>]
    11. [<span><strong>Date de naissance :</strong> (#DATE_NAISSANCE|date_relative)</span>]
    12. [<span><strong>Lieu :</strong> (#LIEU)</span>]
    13. [<span>(#COURT_DESCRIPTIF)</span>]
    14. </div>
    15. <div class="nettoyeur"></div>
    16. </li>
    17. </BOUCLE_breves>
    18. </ul>
    19. </B_breves>

    Télécharger

    Et mon formulaire ressemblerait à quelque chose comme ça (il n’est pas fonctionnel pour le moment) :

    1. Vous recherchez...
    2. <div class='ajax'>
    3. <form>
    4. <select>
    5. <BOUCLE_triesexe(MOTS) {type=sexe} ><option>#TITRE</option></BOUCLE_triesexe>
    6. </select>
    7. <select>
    8. <BOUCLE_trieage(MOTS) {type=age}><option>#TITRE</option></BOUCLE_trieage>
    9. </select>
    10. <input type='submit' name='ok' value='ok' />
    11. </form>
    12. </div>

    Télécharger

    J’ai essayée toute sorte de chose pour faire fonctionner le plugin critère mot, sans résultat.
    Juste pour info j’utilise SPIP 3.

    Et après vérification sur la page de démo du plugins, je peux choisir parmi mes 3 groupes de mots clefs (Age, Sexe et Date adoption - ce dernier groupe ne m’étant pas utile sur cette page -), mais ensuite, une fois un groupe sélectionné, je ne peux pas choisir de mot clef y correspondant (j’ai juste un « mot clef même groupe » affiché).

    Donc voilà ou j’en suis, si vous pouvez apporter de l’aide (et des explications) je suis preneuse, parce que là, je suis complètement bloquée et désespérée. Snif !

    Merci par avance.

    • Le 16 septembre 2014 à 15:12, par Maïeul En réponse à : Critère {mots}

      Commençons par le formulaire. Je te conseille très fortement de lire une documentation sur comment fonctionnent les formulaires en HTML, parce que là ton formulaire, en l’état, ne peux rien faire.

      deja, virons le ajax, pour le moment. On verra cela plus tard.

      Ensuite, il faut que le formulaire poste quelque part, donc

      <form method="get" action="#SELF">

      On va repasser également tous les paramètres de la page, sauf mots qui change d’une fois sur l’autre. Pour cela on utilise le filtre |form_hidden appliqué sur un #SELF (url de la page) lui même filtré du paramètre « mots » :

      1. [(#SELF|parametre_url{mots,''}|form_hidden)]

      Il faut enfin préciser la variable où sera transmis la valeur de chaque menu déroulant, en l’occurance « mots[] » : <select name="mots[]">. Reste ensuite à indiquer la valeur passé pour chaque option du select : <option value="#ID_MOT">#TITRE</option>.

      En affinant un peu pour permettre que le formulaire propose de ne pas choisir dans un mot et utilise les précédentes valeurs comme valeurs par défaut, on obtient le formulaire suivant :

      1. <form method="get" action="#SELF">
      2. Vous recherchez...
      3. [(#SELF|parametre_url{mots,''}|form_hidden)]
      4. <B_triesexe>
      5. <select name="mots[]">
      6. <option value=""></option>
      7. <BOUCLE_triesexe(MOTS) {type=sexe} >
      8. <option [(#ENV{mots}|find{#ID_MOT}|oui) selected="selected"] value="#ID_MOT">#TITRE</option>
      9. </BOUCLE_triesexe>
      10. </select>
      11. </B_triesexe>
      12.  
      13. <B_trieage>
      14. <select name="mots[]">
      15. <option value=""></option>
      16. <BOUCLE_trieage(MOTS) {type=age}>
      17. <option [(#ENV{mots}|find{#ID_MOT}|oui) selected="selected"] value="#ID_MOT">#TITRE</option>
      18. </BOUCLE_trieage>
      19. </select>
      20. </B_trieage>
      21. <input type='submit' />
      22. </form>

      Télécharger

      (Bon, il faudrait affiner pour avoir une structure html correcte. Voir http://www.spip.net/fr_article3791.html.

      Reste ensuite à passer le critère {mots} :

      1. <B_breves>
      2. <ul>
      3. <BOUCLE_breves(BREVES) {id_rubrique} {!par date}{mots}>
      4. <li class="adoption">
      5. <div class="breveleft">
      6. <a href="#URL_BREVE">[(#LOGO_BREVE|image_reduire{190,0}|image_recadre{140,140,center})]</a>
      7. </div>
      8. <div class="breveright">
      9. [<a href="#URL_BREVE"><span class="titre_chat">(#TITRE)<span></a>]
      10. [<span><strong>Sexe :</strong> (#LISTER_VALEURS{sexe})</span>]
      11. [<span><strong>Date de naissance :</strong> (#DATE_NAISSANCE|date_relative)</span>]
      12. [<span><strong>Lieu :</strong> (#LIEU)</span>]
      13. [<span>(#COURT_DESCRIPTIF)</span>]
      14. </div>
      15. <div class="nettoyeur"></div>
      16. </li>
      17. </BOUCLE_breves>
      18. </ul>
      19. </B_breves>

      Télécharger

    • Le 17 septembre 2014 à 17:15, par -orl- En réponse à : Critère {mots}

      Un grand Merciiii Maïeul pour ton aide ! (En plus tu es super réactif !)

      Du coup si je comprends bien, avec ta solution on utilise pas le plugin enfin de compte ? En tout cas je ne vois pas la balise qui s’y rapporte ?

      Concernant mon formulaire, effectivement en l’état il n’était pas fonctionnel, je l’avais fais juste pour voir ce que ça donnerait sur la page web en question. Puis, de toute façon, je n’aurais pas su qu’il fallait utiliser la boucle SELF, les formulaires c’est effectivement pas ma spécialité comme tu peux constater. lol

      En gros, moi je me cassais les dents sur ça « [(#FORMULAIRE_RECHERCHE_PAR_MOTS)] » pensant que ce serait la clé de mon problème.

      Du coup encore merci pour le code, car non seulement il fonctionne mais en plus c’est bien expliqué pour que je comprenne (et puisse le réutiliser si besoin).

      J’aurais encore une question, comment afficher sur ma page par défaut toutes les brèves ?
      En gros, ce que je souhaite, c’est que si l’utilisateur n’utilise pas le formulaire (et donc ne passe pas de mot clef en URL), toutes les brefs soient par défaut afficher sur la page.
      Le formulaire ayant pour but juste de faire une sélection pour facilité les recherches de l’utilisateur, mais il reste facultatif.

    • Le 18 septembre 2014 à 21:23, par -orl- En réponse à : Critère {mots}

      C’est encore moi.

      J’ai trouvée la réponse à ma dernière question.

      Pour afficher par défaut toute les brèves j’ai utilisées un code alternatif avec la balise /B_nom_de_ma_boucle>, j’ai juste retirée le critère « mots » sur cette boucle qui est strictement identique à la première.
      Par contre, du coup, si je n’obtiens aucun résultat (imaginons que l’utilisateur cherche un chaton mâle et qu’il n’y en a pas, du coup le résultat affiche toutes les brèves).

      Du coup je ne pense pas que ce soit la solution idéale, car il faudrait que par défaut cela affiche toutes les brèves, mais que si le formulaire ne donne aucun résultat, cela affiche toutes les brèves, mais en affichant aussi un message du type « Aucun résultat » pour que l’utilisateur ne pense pas que le formulaire ne fonctionne pas.

      Du coup je ne sais pas comment procéder. Une idée ?

    • Le 19 septembre 2014 à 13:50, par Maïeul En réponse à : Critère {mots}

      a ben si mon code utilise le plugin : c’est le critère {mots}. je ne suis pas responsable de la création du formulaire en question, et j’ignore comment il fonctionne.

      Pour ta question, les critères de spip peuvent avoir un ?, ce qui signifie qu’ils sont optionnels : si les paramètres nécessaires sont passés en environnement, alors le critère est utilisé, sinon non. Voir http://programmer.spip.net/Criteres-optionnels.

      Donc dans ton cas : {mots?}

    • Le 30 septembre 2014 à 00:17, par -orl- En réponse à : Critère {mots}

      Bonsoir,

      Alors j’ai testée le critère optionnel en remplaçant mots par mots ? cela semble fonctionner, mais je n’ai pas le résultat attendu.
      En faite, je veux afficher par défaut toutes les brèves, puisque le formulaire reste optionnel (sinon les visiteurs ne vont pas comprendre pourquoi ils arrivent sur une page vide).

      Or, si j’utilise le critère mots ? vu qu’aucun paramètre n’est passé en environnement quand on arrive sur la page, et bien je me retrouve effectivement avec une page vide.
      Par contre ça fonctionne bien, si jamais je lance une recherche sur le formulaire pour sélectionner par exemple des « chatons » « mâles » et qu’il y en a pas cela ne rend aucun résultat. Cependant, j’aimerais alors afficher toutes les brèves, mais en précisant que la recherche n’a pas donnée de résultat (histoire que les visiteurs ne pensent pas qu’il y a un problème avec le formulaire).

      Avec le code alternatif de la balise /B>, j’arrive à afficher par défaut l’ensemble de mes brèves, le formulaire est fonctionnel, cependant, si je lance une recherche qui ne donne aucun résultat, j’ai alors toutes mes brèves qui s’affichent (jusque là c’est ce que je veux) MAIS je n’ai pas possibilité de laisser un message pour dire que la recherche n’a aboutie sur aucun résultat (car si je mets ce message dans mon code alternatif, alors il apparaît aussi quand les visiteurs arrivent sur la page, sans même avoir utiliser le formulaire).

      Je sais pas si je suis claire dans mes explications, mais je ne vois pas tellement comment solutionner ce soucis.

    • Le 30 septembre 2014 à 01:58, par Maïeul En réponse à : Critère {mots}

      si j’ai bien compris ton besoin, alors dans la parti optionell utilise

      [(#ENV{mots}|oui) texte à afficher si le formulaire a bien été rempli mais ne fournit pas de résultat].

    • Le 30 septembre 2014 à 19:07, par -orl- En réponse à : Critère {mots}

      Merci Maïeul, c’est exactement ce qu’il me fallait, ça marche niquel. Encore merci !

    Répondre à ce message

  • Le 14 septembre 2011 à 12:17, par jeromelt En réponse à : Critère {mots}

    Le FORMULAIRE_RECHERCHE_PAR_MOTS permet de sélectionner les mots clés d’un groupe de mot.

    Cette sélection se fait assez lentement car il faut d’abord choisir 1 mot, le calcul se fait... les résultats s’affichent.

    Ensuite on peut choisir un autre mot, etc.

    Est il possible plutot qu’un menu déroulant d’afficher la liste des mots clés sous forme de liste à cocher afin d’effectuer une recherche multicritère en une seule fois ?

    ou à défaut permettre de sélectionner plusieurs mots clés dans le menu déroulant ?

    Pouvez vous m’aider à réaliser cela ?

    • Le 14 septembre 2011 à 12:23, par Maïeul En réponse à : Critère {mots}

      tu connais les boucles de SPIP ou pas ? pour savoir quel degrees d’explication je dois fournir …

    • Le 14 septembre 2011 à 14:29, par jeromelt En réponse à : Critère {mots}

      oui je connais le fonctionnement général.
      à mon sens il s’agirait de modifier la page recherche_par_mot.html ou d’en créer une autre à partir de celle ci recherche_par_mot2.html que je rangerais dans mon dossier squelette/formulaires ?

      ensuite suffit t’il de modifier le type de select ?

    • Le 14 septembre 2011 à 18:34, par Maïeul En réponse à : Critère {mots}

      c’est ca. tu peux opter pour l’une ou l’autre des solutions, du moment que tu place tout cela dans ton dossier squelettes.

      Il suffit de modifier le squelette du formulaire et celui qui affiche les mots à la sortie du formulaire. Normalment la doc permet à une personne qui connaît les boucles de faire les modifs. Si tu bloque envoie moi ton code.

    • Le 31 juillet 2014 à 16:31, par bebe En réponse à : Critère {mots}

      Bonjour, petit up pour ce post.
      Je souhaiterais moi aussi pouvoir avoir une liste à cocher plutôt qu’un/deux menu(s) déroulant et pouvoir choisir en même temps dans deux listes de mots clés. Les explications fournies ne suffisent pas à mon niveau !
      Pourrais-je avoir plus d’explications ?

      Et pour ajouter une difficulté, je souhaiterais que d’abord tous les articles (de la rubrique concernée par ma recherche) apparaissent dans la page et qu’ensuite en sélectionnant les mots clés, la sélection devienne plus restrictive. Alors qu’actuellement seule la sélection de mots fait apparaitre une liste d’articles, en commençant par une page vide.

      J’espère être assez claire.
      Merci d’avance.

    • Le 31 juillet 2014 à 16:35, par Maïeul En réponse à : Critère {mots}

      quelles connaissances SPIP avez vous ?

    • Le 31 juillet 2014 à 16:55, par bebe En réponse à : Critère {mots}

      Plutôt débutante !
      J’arrive à faire quelques boucles simples pour appeler des articles ou des documents dans mes squelettes mais je me base souvent sur les codes fournis pour essayer de les comprendre.

    • Le 31 juillet 2014 à 17:37, par Maïeul En réponse à : Critère {mots}

      Bon, alors on va faire une chose simple : je vous donne un code qui marche. Ce qu’il fait :

      -  lister les mots clefs avec case à cocher
      -  afficher les articles avec ces mots clefs, sauf si aucun mot clefs n’a été choisi, dans ce cas il affiche tout.

      Vous testez ce code, et ensuite vous me faite un retour en m’indiquant lignes par lignes ce que fait le code. Comme cela je vous fournis un code déjà prêt ET en plus vous vous formez.

      Avec la doc de base de SPIP + du plugins + notions de HTML vous devrez le comprendre. Et sinon vous posez des questions.

      1. <B_mots>
      2. <div class="formulaire_spip formulaire_recherche_mot">
      3. <form method="post" action="#SELF">
      4. [(#SELF|form_hidden)]
      5. <ul>
      6. <BOUCLE_mots(MOTS){par titre}{objet=article}>
      7. <li>
      8. <label for="mot#ID_MOT">#TITRE</label>
      9. <input type="checkbox" class="checkbox" name="mots[]" id="mot#ID_MOT" value="#ID_MOT"[(#ID_MOT|in_array{#ENV{mots}}|oui) checked="checked"] />
      10. </li>
      11. </BOUCLE_mots>
      12. </ul>
      13.  
      14. <p class="boutons"><input type="submit" class="submit" value="<:bouton_enregistrer:>" /></p>
      15. </form>
      16. </div>
      17. </B_mots>
      18.  
      19. <B_articles>
      20. <ul>
      21. <BOUCLE_articles(ARTICLES){mots?}{par titre}>
      22. <li><a href="#URL_ARTICLE">#TITRE</a></li>
      23. </BOUCLE_articles>
      24. </ul>
      25. </B_articles>

      Télécharger

    • Le 31 juillet 2014 à 17:51, par bebe En réponse à : Critère {mots}

      Aie... déjà erreur à la 1e ligne !
      Spip m’indique :

      1 Erreur(s) dans le squelette (...)
      Critère inconnu = _mots

      Et sinon, tous les articles de mon site apparaissent.

    • Le 31 juillet 2014 à 17:55, par Maïeul En réponse à : Critère {mots}

      heu, je vous assure que j’ai testé cela avant de vous envoyé.

      Quelle config de SPIP avez vous ? où avez vous mis le code ?

    • Le 31 juillet 2014 à 18:03, par bebe En réponse à : Critère {mots}

      SPIP 2.1.23

      Et j’ai mis le code dans le fichier « recherche_par_mots.html » dans mon dossier squelettes. J’ai même testé de le mettre dans le dossier plugin directement. Rien à faire. J’ai l’impression que le critère « mots » n’est pas accepté ! A chaque fois ça me renvoi un bug !

    • Le 31 juillet 2014 à 18:17, par Maïeul En réponse à : Critère {mots}

      ne surtout jamais modifié le dossier squelette.

      A tout hasard, le plugin est bien activé ?

      Sinon pour SPIP 2.1, il faut mettre

      1. <B_mots>
      2. <div class="formulaire_spip formulaire_recherche_mot">
      3. <form method="post" action="#SELF">
      4. [(#SELF|form_hidden)]
      5. <ul>
      6. <BOUCLE_mots(MOTS spip_mots_articles){par titre}{id_article>0}>
      7. <li>
      8. <label for="mot#ID_MOT">#TITRE</label>
      9. <input type="checkbox" class="checkbox" name="mots[]" id="mot#ID_MOT" value="#ID_MOT"[(#ID_MOT|in_array{#ENV{mots}}|oui) checked="checked"] />
      10. </li>
      11. </BOUCLE_mots>
      12. </ul>
      13.  
      14. <p class="boutons"><input type="submit" class="submit" value="<:bouton_enregistrer:>" /></p>
      15. </form>
      16. </div>
      17. </B_mots>
      18.  
      19. <B_articles>
      20. <ul>
      21. <BOUCLE_articles(ARTICLES){mots}{par titre}>
      22. <li><a href="#URL_ARTICLE">#TITRE</a></li>
      23. </BOUCLE_articles>
      24. </ul>
      25. </B_articles>

      Télécharger

    • Le 31 juillet 2014 à 18:19, par Maïeul En réponse à : Critère {mots}

      videz le cache le cas échéant ...

    • Le 31 juillet 2014 à 18:24, par bebe En réponse à : Critère {mots}

      Ca y est presque !
      Juste ceci apparait au dessus de ma liste a choix multiple :

      Warning: in_array() [function.in-array]: Wrong datatype for second argument in /home/<toto>/www/ecrire/public/composer.php(69) : eval()'d code on line 45

    • Le 31 juillet 2014 à 18:30, par Maïeul En réponse à : Critère {mots}

      quelle version de PHP (allez dans http://urldusite/ecrire/?exec=info pour savoir).

    • Le 1er août 2014 à 09:02, par bebe En réponse à : Critère {mots}

      Excusez moi de la réponse tardive...
      PHP Version 5.2.17

      ne surtout jamais modifié le dossier squelette.

      Pas d’inquiétude, je ne modifie pas le dossier squelette dist, mais j’insère mes squelettes dans un dossier squelettes personnels :)

    • Le 1er août 2014 à 11:17, par bebe En réponse à : Critère {mots}

      J’ai trouvé ceci dans cet article spip sur #ARRAY (dans les notes de bas de page) :

      « |find correspond à la fonction PHP in_array, à la différence que ce filtre ne produit pas le message d’erreur "Warning : in_array() [function.in-array] : Wrong datatype for second argument." si la variable n’est finalement pas un tableau. En effet, lorsqu’une variable est générée dynamiquement, on ne sait pas toujours si elle existera et s’il s’agira bien d’un tableau. »

      Ca parle de mon problème, mais par contre, ça dépasse mes compétences là !

    • Le 1er août 2014 à 13:44, par Maïeul En réponse à : Critère {mots}

      a mais oui,

      c’est le code

      1. [(#ID_MOT|in_array{#ENV{mots}}|oui) checked="checked"]

      qui est mauvais. Le but c’est de tester si le mot courant se trouve dans la liste des mots du précédent formulaire. Si oui, on coche la case.

      Mais sauf que ca va pas.

      Et donc la doc sur #ARRAY que vous avez trouvé donne la solution. Désolé un peu fatigué (et chez moi les messages d’erreurs sont désactivés.

      La solution est de remplacer par :

      1. [(#ENV{mots}|find{#ID_MOT}|oui) checked="checked"]
    • Le 1er août 2014 à 14:35, par bebe En réponse à : Critère {mots}

      Super ! Plus de message d’erreur !

      Une fois le mot clé sélectionné, la liste apparait bien.
      Par contre, vous disiez plus haut que ce code doit faire apparaitre tous les articles si aucun mot clé n’est sélectionné, ce n’est pas le cas.

    • Le 1er août 2014 à 15:47, par Maïeul En réponse à : Critère {mots}

      oui, parce que dans mes testes suite au fait que le plugin n’était pas activé, j’ai oublié le ? dans {mots?}.

      Ca devrait aller mieux comme cela.

      Et maintenant, la réponse de l’exercice ;-)

    • Le 1er août 2014 à 16:33, par bebe En réponse à : Critère {mots}

      C’est super !!

      J’ai ajouté {id_rubrique} pour permettre de faire la recherche uniquement dans la rubrique que je souhaite et le tour est joué.

      Un grand merci ! :D

    Répondre à ce message

  • Le 19 décembre 2013 à 14:02, par goony En réponse à : Critère {mots}

    Pour ceux qui ont des problemes de performance avec ce plugin j’ai mis au point un systeme de boucles recursives qui fait le travail, mais au lieu d’une requete complexe ca decompose le probleme en requetes simples, ce qui evite les lenteurs pour certains, voire les crashs SQL pour ceux qui comme moi travaillent sur une base de donnees de grande taille. Ce systeme ne permet pas de specifier des pourcentages ou autres options de tri, ca affiche simplement les articles associes a TOUS les mots cles de la liste. Le principe est assez simple, j’ai decompose le code par etapes en mettant des commentaires pour que vous saisissiez facilement le principe. Nous avons un tableau #KW qui contient la liste des id_mots, un compteur « n » qui nous permet de progresser dans ce tableau, un tableau « tab2 » qui sert aux traitements, et un tableau « tab » qui contiendra la liste finale des articles. Vous noterez que le tableau #KW peut directement provenir d’un tableau specifie dans l’URL de la sorte : ?kw[]=id_mot1&kw[]=id_mot2&kw=...

    • Le 19 décembre 2013 à 14:04, par Maïeul En réponse à : Critère {mots}

      tu pourrais proposer un article ? là les infos sont coupées ...

    • Le 19 décembre 2013 à 14:12, par goony En réponse à : Critère {mots}

      le code :

      #SET{n,0}
      [(#SET{next_kw,[(#KW|table_valeur{#GET{n}})]})]
      #SET{tab,#ARRAY{0,0}}
      <BOUCLE_test_rec(MOTS){id_mot=#GET{next_kw}}{0,1}>       
                                     
         [(#REM)
         --- on remplit tab2 avec tous les articles du mot en cours
         ---]
         #SET{tab2,#ARRAY}       
         <BOUCLE_articles(ARTICLES){id_mot}>
             [(#SET{tab2,[(#GET{tab2}|array_merge{#ARRAY{0,#ID_ARTICLE}})]})]
         </BOUCLE_articles>
                                     
         [(#REM)
         --- si c'est la premiere passe, on copie tab2 vers tab
         --- sinon on place dans tab l intersection entre les deux tableaux
         ---]
         [(#GET{n}|=={0}|?{
             #SET{tab,#GET{tab2}},
              [(#SET{tab,[(#GET{tab}|array_intersect{#GET{tab2}})]})]
         })]
                                     
         [(#REM)
         --- on incremente le compteur et recupere le prochain mot cle
         ---]
         #SET{n,#GET{n}|plus{1}}
         [(#SET{next_kw,[(#KW|table_valeur{#GET{n}})]})]
                                     
         [(#REM)
         --- on apelle a nouveau la boucle en passant en parametre le nouveau id_mot
         --- c est ici que se fait la recursivite de la fonction
         ---]
         <BOUCLE_test_rec1(BOUCLE_test_rec){id_mot=#GET{next_kw}}{0,1}>
         </BOUCLE_test_rec1>
      </BOUCLE_test_rec>

      Ensuite il suffit d’utiliser le tableau « tab » dans une boucle article basique, cette fois ci avec un tri si on le souhaite car ca ne prend plus autant de ressources :

      <BOUCLE_page(ARTICLES){par date}{inverse}{id_article IN #GET{tab}}....
    • Le 23 décembre 2013 à 12:56, par goony En réponse à : Critère {mots}

      Mon code est vieux, et a l’epoque je n’avais pas connaissance de la boucle DATA sur les tableaux. On peut transformer cette solution en faisant une boucle sur le tableau de mots directement au lieu d’une boucle recursive. L’important c’est la decomposition de la requete faite par le plugin en requetes simples : les jointures se font principalement en PHP lors de l’intersection des tableaux, et les criteres de tri ne s’appliquent qu’a la fin, une fois la liste des articles bien etablie (plus de jointures dans la requete des lors).

    • Le 2 avril 2014 à 16:20, par Beurt En réponse à : Critère {mots}

      Salut,

      Je lis ton message un peu tardivement...

      Tu trouveras une ancienne technique similaire (ancienne aussi) ici : article 1538 et qui est détaillée pour un usage similaire au critère mots ici : http://thread.gmane.org/gmane.comp.....

      Pour moi, ça s’est avéré environ 10x plus rapide à l’exécution que critère mots... Toutefois c’est moins souple (ou plus difficile à manipuler).

      Voici le code :

      1. [
      2. (#REM)
      3. Une première boucle qui prépare
      4. une pile avec doublons nommée liste_0
      5. (Ici on peut rajouter des critères si on veut
      6. choisir des articles en particulier à filtrer avec des mots)
      7.  
      8. Ça peut marcher aussi pour d'autres boucles que ARTICLES...
      9. ]
      10. <BOUCLE_Une_pile(ARTICLES){doublons liste_0} ></BOUCLE_Une_pile>
      11. [
      12. (#REM)
      13. Ensuite pour chaque mot de mon tableau...
      14. "ma_liste_de_mots" contient une liste de mots
      15. qui servent de filtres
      16. ]
      17. <BOUCLE_Les_mots(MOTS){id_mot IN #GET{ma_liste_de_mots}}>
      18. [(#SET{moinsun,[(#_Les_mots:COMPTEUR_BOUCLE|moins{1})]})]
      19. [
      20. (#REM)
      21. on choisi parmi les articles de la pile précédente
      22. (liste_x où x est compteur_boucle-1)
      23. les articles qui sont rattachés au mot. Et on
      24. les empile avec un doublons dans la pile suivante
      25. (liste_y où y=compteur de boucle)
      26. ]
      27. <BOUCLE_les_articles_du_mot(ARTICLES){id_mot}
      28. {!doublons liste_#GET{moinsun}}
      29. {doublons liste_#_Les_mots:COMPTEUR_BOUCLE} ></BOUCLE_les_articles_du_mot>
      30. </BOUCLE_Les_mots>
      31. [
      32. (#REM)
      33. Au final, on a une pile
      34. (nommée liste_z où z=nombre de tour de boucle "Les_mots")
      35. qui contient bien seulement les articles qui ont
      36. tous les mots du tableau
      37.  
      38. C'est ce que liste la boucle d'après.
      39. (ça peut être l'occasion de les trier d'une
      40. façon ou d'une autre...)
      41. ]
      42. <BOUCLE_Articles_empile(ARTICLES){!doublons
      43. liste_#_Les_mots:COMPTEUR_BOUCLE}>
      44. #TITRE<br>
      45. </BOUCLE_Articles_empile>

      Télécharger

    • Le 24 avril 2014 à 15:02, par Beurt En réponse à : Critère {mots}

      Oups petite erreur de lien dans mon commentaire précédent : Afficher les articles connexes, triés par pertinence...

    Répondre à ce message

Répondre à cet article

Qui êtes-vous ?

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 Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Mailsubscribers

    16 janvier 2013 – 274 commentaires

    Ce plugin permet de gérer les inscriptions (ou abonnements) à la diffusion de contenu par email. Mailsubscribers permet de gérer les inscriptions par Opt-in simple ou double et la désinscription par URL. Ce plugin gère également plusieurs listes (...)

  • noiZetier v2

    9 novembre 2012 – 36 commentaires

    Le noiZetier offre une interface d’administration permettant d’insérer au choix des éléments modulaires de squelettes (noisettes) et de les ajouter ainsi à ses squelettes. Compatibilité La version 2 du noizetier fonctionne sous SPIP 3. Elle est (...)

  • cirr : plugin « rédacteur restreint »

    29 octobre 2010 – 60 commentaires

    Ce plugin « cirr : rédacteur restreint » permet d’affecter des rubriques aux rédacteurs et modifie les droits afin qu’un rédacteur restreint (ou un administrateur restreint) voit dans l’espace privé uniquement les rubriques qui lui sont affectées (et leur (...)

  • Un retour d’expérience d’utilisation de Formidable

    26 octobre – commentaires

    Il s’agissait de créer un formulaire d’inscription à un évènement modérer les inscriptions dans le privé publier les inscriptions dans le public Nous avons discuté de cette présentation lors de l’apéro SPIP du 15 février 2016 à la Cantine (...)

  • Métas +

    3 décembre – 14 commentaires

    Améliorez l’indexation de vos articles dans les moteurs et leur affichage sur les réseaux sociaux grâce aux métadonnées Dublin Core, Open Graph et Twitter Card. Installation Activer le plugin dans le menu dédié. Dans le panel de configuration, (...)

Ça spipe par là