Plugin « Critère {mots} »

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

Présentation

Il peut arriver parfois de vouloir sélectionner des objets SPIP (articles, rubriques, sites etc.), ayant un certains nombre de mot clefs communs.

Par exemple, je voudrais sélectionner les articles ayant les mots clefs « fruits » et « desserts », mais pas ceux qui n’ont que « desserts » ou que « fruits ».

Une telle opération, bien que possible, est assez difficile en SPIP ... sauf si vous utilisez ce plugin.

Il s’installe comme n’importe quel plugin.

Il propose trois critères :
-  {mots}
-  {mots_selon_id}
-  {mots_selon_titre}

Dans une boucle, il ne faut utiliser qu’un seul de ces critères.

Le critère {mots}

Prenons un exemple :

<BOUCLE_art(ARTICLES){mots}>
#TITRE
</BOUCLE_art>

Cette boucle sélectionnera les articles ayant tous les mots clefs passés en paramètres d’environnement dans un tableau « mots ».

Comment passer ces mots-clefs en paramètres d’environnement ?

Typiquement, sur une page principale (non incluse), via des paramètres dans l’url. Par exemple : http://www.toto.fr/?page=toto&amp;mots[0]=1&amp;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.

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.

Usage avec le plugin Mots arborescents

Par défaut, seul le mot-clé demandé est recherché.

Mais il est possible de trouver via n’importe quel mot-clé de la branche du mot-clé demandé en mettant dans mes_options.php :

if (!defined('_CRITERE_MOTS_ARBO_BRANCHE'))
    define('_CRITERE_MOTS_ARBO_BRANCHE', true); 

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

NOTA SPIP branche 2.*

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.

Discussion

73 discussions

  • 2

    Bonjour,

    j’ai un peu de mal à comprendre le principe du critère mot...

    dans une page d’article, je souhaite afficher un autre article qui a le m^me mot clé que l’article où on se trouve :

    j’essaie cela :

    <BOUCLE_mot_cle(ARTICLES) {mots 2 100%}>
    	<a href="#URL_ARTICLE">#TITRE</a>
    </BOUCLE_mot_cle>

    mais rien, nada

    Merci pour de l’aide
    Pirlo

    • Tu n’a a priori pas besoin de critères {mots} pour cela. Le critère {mots} au pluriel permet de récuperer les articles ayant un certain nombre de mot clés passés en environnement (voir https://programmer.spip.net/L-environnement-ENV ou https://contrib.spip.net/La-balise-ENV).

      Mais ton besoin toi c’est de récuperer un article qui a un mot clé commun. S’il suffit d’avoir un mot clé commun, alors :

      <BOUCLE_principal(ARTICLES){id_article}>
      ICI l'article principal
        <BOUCLE_mots(MOTS){id_article}>
          Ici les mots de l'article
          <BOUCLE_annexe(ARTICLES){id_mots}{doublon}>
          Ici les articles qui ont le mot de la rubrique parente
         </BOUCLE_annexe>
        </BOUCLE_mots>
      </BOUCLE_principal>
      
    • oui pourquoi se compliquer la vie :)

       <BOUCLE_mots(MOTS){id_article}>
      	<BOUCLE_annexe(ARTICLES){id_mot}>
      		[(#REM) Gestion du portfolio et des documents ]
      		[(#INCLURE{fond=inclure/documents,id_article,id_rubrique='',env})]
      	</BOUCLE_annexe>
      </BOUCLE_mots>

      je voulais afficher le portfolio de son « binôme » et cela fonctionne bien
      MERCI

    Répondre à ce message

  • 1

    Bonjour et merci pour ce plugin... Y a-t-il un retour pour l’utilisation de ce plugin sous spip 4.2 ? Quelqu’un a-t-il déjà essayé en modifiant les bornes de version ?

    Répondre à ce message

  • Je ne sais pas si ce plugin est pertinent pour ce que je veux faire ?
    Tout se passe du côté public.
    Chaque administrateur restreint possède un groupe de mots-clés ayant exactement le même nom que l’auteur. Le premier mot généré dans son groupe est son nom. Ce mot-clé est attribué à l’auteur. De plus avec MOTUS le groupe de mots clés est lié à la rubrique restreinte de l’auteur.
    Dans son groupe, sur une page mots.html ou auteur.html je voudrais qu’il puisse ajouter des sous-groupes et des mots, puis lorsqu’il est dans un article ou un document ... qu’il puisse assigner le mot clé de son choix. Enfin je voudrais que la recherche se fasse uniquement dans son groupe de mots.
    J’arrive en partie à faire ce que je veux avec spipiculous et choix mots mais les mots-clés générés dans -tag- ne sont pas spécifiques à chaque utilisateur.
    Je pensais qu’une boucle MOTS dans un boucle auteurs ayant {id_auteur=#SESSION{id_auteur}} ferait l’affaire mais non.Dans tous mes essais il n’y a que ce code (trouvé dans spip@rezo.net) permet d’afficher pour chaque auteur son groupe et ses mots-clés utilisés.

    [(#REM) On crée le tableau ]
    #SET{mots, #ARRAY}
    
    [(#REM) On remplit le tableau avec les titres des mots liés à l'auteur connecté ]
    <BOUCLE_mots_auteur(MOTS){id_auteur=#SESSION{id_auteur}}>
        #SET{mots, #GET{mots}|push{#TITRE}}
    </BOUCLE_mots_auteur>
    
    <h3>Le contenu du tableau (pour info)</h3>
    [(#GET{mots}|foreach)]
    
    <hr />
    
    [(#REM) On sort les articles dont le mot est dans le tableau ]
    <h3>Les articles</h3>
    <BOUCLE_articles_mots(ARTICLES){titre_mot IN #GET{mots}}>
        <p>#TITRE</p>      
    </BOUCLE_articles_mots>

    Répondre à ce message

  • 3
    formatec

    J’ai besoin des conseils de la communauté car plusieurs pistes se dessinent, mais je ne sais pas pour laquelle opter.

    OBJECTIF : les visiteurs peuvent accéder à leur profil et modifier leurs centres d’intérêts. Ceux ci se présentent dans des groupes de mots clés. Les mêmes que ceux attribués aux articles, les boucles articles et evenements seront par la suite adaptées pour que chaque auteur/visiteur recoivent un contenu perso.

    -  j’ai ajouté un champs extra ’mot clé’ sur la table auteur, mais impossible de faire des choix multiples (ai-je mal vu ? est ce possible ?).

    -  autre possibilité : faut il opter pour un champs extra ’input’ qui recevra une array des choix persos de l’auteur et seront envoyés sur la table via :

           $preferences = implode(',', $preferences);     
          $set = array(
              'preferences ' => $preferences ,
         );
         sql_updateq(
             "spip_auteurs",
             $set,
    (...)

    -  mes recherches m’ont mené sur ce plugin ’critère mot’ , serait il une autre piste exploitable ?

    Je cherche le plus simple et efficace, mais j’avoue que je suis un peu perdu....

    Merci de votre aide.

    K
    • Il y a deux points différents :
      -  comment tu stocke les mot clefs pour chaque utilisateur. La piste champ extra est une piste possible, à mon avis la plus pertinente, mais tu pourrais aussi associer des mots clefs aux utilisateurs.
      Inconvénient et avantage des deux solutions :
      L’avantage de champ extra est que l’interface sans doute plus simple à mettre en place côté publique (juste un formulaire), et les données seraient stockées sous forme de tableau, donc plus simple pour ta future requete. L’inconvénient est que pour le moment la saisie « Mot clefs » ne permet pas de saisir plusieurs mot clefs. A priori cela ne devrait pas être hyper compliqué de l’adapter, mais il faut quand même un peu de temps. Je te propose de le faire toi même, ou de poser la question sur le forum du plugin saisies si tu ne t’en sent pas les compétences.-
      -  comment tu t’en sert pour ensuite afficher un contenu personnalisé. Le plugin critères mots te permettra de faire cela.

    • formatec

      Merci pour tes conseils Maïeul, cela m’a provoqué une chouette nuit de code... ;-)

      J’ai donc exploré la piste du champs extra input qui conserve l’array de mes choix.

      J’ai fait une page de récap’ étape par étape. Avec les scripts et boucles utilisées pour ceux que cela intéresse : http://lakesapp.formatec.be/?page=t...

      Je coince sur deux choses :

      -  à l’etape3, comment faire pour que mon tableau de choix soit en statut « checked » si c’est le cas dans mon array de preferences ?

      -  et à l’étape 5, là ont est au coeur du plugin « critere mot » que je ne maitrise pas encore bien. Comment faire pour que cette boucle agenda devienne un agenda perso en fonction de mes mots favoris ? Je pense que ton plugin est le meilleur moyen, mais je ne vois pas bien comment mettre en oeuvre.

    • Bon,

      en fait idéalement, il aurait mieux value la saisie (au sens du plugins saisie) mots pour que ton champs extra permette de gérer plusieurs mots. Là tu courcircuite le mecanisme de construction automatique de formulaire par le plugin champ extra. Mais passons.

      Deja, je serais toi je stocker l’identifiant du mot clef, et pas le titre, lequel est susceptible de changer.

      Dans ta boucle auteur, tu dois pouvoir récuperer ce qui est stocké dans le champ preferences, via la balise #PREFERENCES. Comme c’est un tableau, tu peux utiliser le filtre |in_array pour tester si cela correspond au mot courant. Voir exemple ici

      https://www.spip.net/fr_article4009.html

      Ensuite, puisque tu stocke tes id de mots dans un tableau #PREFERENCES d’une boucle auteur, il te suffit pour ta recherche d’avoir le critère {mots_selon_id #PREFERENCES} pour la boucle d’evebnement, elle même intégré dans la boucle d’auteur.

    Répondre à ce message

  • Bonjour,
    J’utilise ce plugin, mais je rencontre un problème, je m’explique :
    Je travaille avec deux groupes de mots clés : groupe1 et groupe2
    -  Pour groupe1 sont des case a coché et on peut sélectionner un ou plusieurs mots
    -  Pour groupe2 c’est juste une liste déroulant
    Voici mon formulaire :

      <BOUCLE_groupes(GROUPES_MOTS){id_groupe=1}>
             <ul>
             <h4>#TITRE</h4>
               <BOUCLE_mots(MOTS){id_groupe}{par titre}><li>
    <span class="logotheme"> </li><label>#TITRE</label><input type="checkbox" name="mots[0]" value="#ID_MOT" /></span></li>
              </BOUCLE_mots>
             </ul>
             </BOUCLE_groupes>
    	 
    	   <select name="mots[1]">
    		<option value=""> Votre choix</option>
    		<BOUCLE_select_grp(GROUPES_MOTS){id_groupe=2}>
    		<BOUCLE_motg(MOTS){id_groupe}{par titre}>     
    		<option value="#ID_MOT">#TITRE </option>
    		</BOUCLE_motg>
    		</BOUCLE_select_grp>
    		 </select>

    Si je choisis un mot dans groupe1 et un dans le groupe 2, le résultat s’affiche correctement....Par contre si je choisis plusieurs mots dans le groupe1(case cochet), le résultat est erroné

    Voici la boucle du résultat

    <B_articles>
    				   <h2>#GRAND_TOTAL </h2>
    				
         				<ul>
    <BOUCLE_articles(ARTICLES) {recherche?} {!par #ENV{tri,points}} {mots?}>
    <li><a href="#URL_ARTICLE">#TITRE</a></li>
    					</BOUCLE_articles>
    					</ul>
    					</B_articles>
    			<h2><em>Pas de résultat trouvé</em></h2>
    				<//B_articles>

    En gros sont les case a cochet qui pose probléme
    Merci de votre aide

    Répondre à ce message

  • 3

    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

    <BOUCLE_Evt2(EVENEMENTS)
      {par date_debut}
      {mots? 0 #ENV{motstheme}}
      {mots? 0 #ENV{motscible}}
      {mots? 0 #ENV{motszone}}
    >

    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 :

    SELECT evenements.id_evenement, evenements.date_debut, evenements.titre
    FROM spip_evenements AS <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZXZlbmVtZW50czwvY29kZT4="></span>
    WHERE (evenements.statut = 'publie')
    	AND evenements.id_evenement IN (
    		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
    	)
    	AND evenements.id_evenement IN (
    		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
    	)
    	AND evenements.id_evenement IN (
    		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
    	)
    ORDER BY evenements.date_debut

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

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

    • Quelque chose me dit qu’il faudrait incrémenter dans critere_mots_dist() la variable $mots_where à chaque usage du critère dans une même boucle.

      Si on savait la position du critère dans la boucle, ça suffirait d’ailleurs comme suffixe.

    • Bon, voilà qui devrait résoudre ce point :
      https://zone.spip.org/trac/spip-zone/changeset/104950

      Note : ça marche chez moi.

      <BOUCLE_circuits(XXXS)
      	{id_xxx ?}
      	{mots_selon_id? 100% #ENV{mots}}
      	{mots_selon_id? 1 #ENV{mots_ou_1}}
      	{mots_selon_id? 1 #ENV{mots_ou_2}}
      	{mots_selon_id? 1 #ENV{mots_ou_3}}
      	{recherche ?}
      	{","}
      >

      Où :
      -  mots est une liste optionnelle d’identifiants de mots où je fais des ET systématiques entre eux
      -  mots_ou_n est une liste optionnelle d’identifiants ou je fais des OU entre eux.

    Répondre à ce message

  • 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

  • 9
    Spipmalion

    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 :

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

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

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

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

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

    • Spipmalion

      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

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

    • 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)

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

    • Spipmalion

      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

    • 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…

    • Spipmalion

      Les joies de l’informatique !

    • 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

  • 2

    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.

    Répondre à ce message

  • 15

    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.

    • 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

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

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

    • Vero n’indique pas comment elle a corrigé…

    • 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…

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

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

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

    • effectivement des details serait pas mal.

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

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

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

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

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

    • Ça marche au poil. 👍

      Merci !

    Répondre à ce message

  • 11
    Michaël

    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

    • Michaël

      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 ?

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

    • Michaël

      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 !

    • non car la requete généré n’a rien à voir

    • Michaël

      D’accord !

      Par contre, le résultat est bien le même non ?

    • 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

    • Michaël

      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

    • Michaël

      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[]

    • Michaël

      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 <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YXJ0aWNsZXM8L2NvZGU+"></span>  
      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 <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YXJ0aWNsZXM8L2NvZGU+"></span>  
      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

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

    • 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 <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bXVfbG9jYWxob3N0PC9jb2RlPg=="></span>.spip_articles AS <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YXJ0aWNsZXM8L2NvZGU+"></span> INNER JOIN <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bXVfbG9jYWxob3N0PC9jb2RlPg=="></span>.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 <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bXVfbG9jYWxob3N0PC9jb2RlPg=="></span>.spip_articles AS <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YXJ0aWNsZXM8L2NvZGU+"></span> WHERE (articles.statut = 'publie') AND articles.id_article IN ( SELECT id_objet FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bXVfbG9jYWxob3N0PC9jb2RlPg=="></span>.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

  • 5

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

    • 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) :

      <form class="form-inline" role="form" method="get" action="#SELF">
      	[(#SELF|parametre_url{mots,''}|form_hidden)]
      <BOUCLE_mots1(MOTS){id_groupe=1} {par num titre} {2,11} >
      <label class="checkbox-inline" for="mot#ID_MOT">
      <input type="radio" class="checkbox" name="mots[]" id="mot#ID_MOT"
       value="#ID_MOT"[(#ENV{mots}|find{#ID_MOT}|oui) checked="checked"] />
        #TITRE</label>
      </BOUCLE_mots1>
      <!-- type="checkbox" type="radio" -->
      <BOUCLE_mots4(MOTS){id_groupe=4} {par num titre}{", "}>
      <label class="checkbox-inline" for="mot#ID_MOT">
      <input type="checkbox" class="checkbox" name="mots[]" id="mot#ID_MOT"
       value="#ID_MOT"[(#ENV{mots}|find{#ID_MOT}|oui) checked="checked"] />
        #TITRE</label> 
      </BOUCLE_mots4>
      <p class="boutons">
      <input type="submit" class="submit" value="<:bouton_chercher:>" /></p>
      </form>
      
      [(#REM) Albums trouves ]
      <BOUCLE_albums(ALBUMS) {mots} {branche?} {0,100} {pagination 10}>
      ...
    • 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)

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

    • 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 ?

    • 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

  • 7

    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 :

    <B_breves>
    <ul>
    <BOUCLE_breves(BREVES) {id_rubrique} {!par date}}>
    <li class="adoption">
    <div class="breveleft">
    <a href="#URL_BREVE">[(#LOGO_BREVE|image_reduire{190,0}|image_recadre{140,140,center})]</a>
    </div>
    <div class="breveright">
    [<a href="#URL_BREVE"><span class="titre_chat">(#TITRE)<span></a>]
    [<span><strong>Sexe :</strong> (#LISTER_VALEURS{sexe})</span>]
    [<span><strong>Date de naissance :</strong> (#DATE_NAISSANCE|date_relative)</span>]
    [<span><strong>Lieu :</strong> (#LIEU)</span>]
    [<span>(#COURT_DESCRIPTIF)</span>]
    </div>
    <div class="nettoyeur"></div>
    </li>
    </BOUCLE_breves>
    </ul>
    </B_breves>

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

    Vous recherchez...
    <div class='ajax'>
    <form>
    <select>
    <BOUCLE_triesexe(MOTS) {type=sexe} ><option>#TITRE</option></BOUCLE_triesexe>
    </select>
    <select>
    <BOUCLE_trieage(MOTS) {type=age}><option>#TITRE</option></BOUCLE_trieage>
    </select>				
    <input type='submit' name='ok' value='ok' />
    </form>
    </div>

    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.

    • 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 » :

      [(#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 :

      <form method="get" action="#SELF">
      Vous recherchez...
      [(#SELF|parametre_url{mots,''}|form_hidden)]
      <B_triesexe>
      <select name="mots[]">
      	<option value=""></option>
      	<BOUCLE_triesexe(MOTS) {type=sexe} >
      		<option [(#ENV{mots}|find{#ID_MOT}|oui) selected="selected"] value="#ID_MOT">#TITRE</option>
      	</BOUCLE_triesexe>
      </select>
      </B_triesexe>
      
      <B_trieage>
      <select name="mots[]">
      	<option  value=""></option>
      	<BOUCLE_trieage(MOTS) {type=age}>
      		<option [(#ENV{mots}|find{#ID_MOT}|oui) selected="selected"]  value="#ID_MOT">#TITRE</option>
      	 </BOUCLE_trieage>
      </select>	
      </B_trieage>			
      <input type='submit' />
      </form>

      (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} :

      <B_breves>
      <ul>
      <BOUCLE_breves(BREVES) {id_rubrique} {!par date}{mots}>
      <li class="adoption">
      <div class="breveleft">
      <a href="#URL_BREVE">[(#LOGO_BREVE|image_reduire{190,0}|image_recadre{140,140,center})]</a>
      </div>
      <div class="breveright">
      [<a href="#URL_BREVE"><span class="titre_chat">(#TITRE)<span></a>]
      [<span><strong>Sexe :</strong> (#LISTER_VALEURS{sexe})</span>]
      [<span><strong>Date de naissance :</strong> (#DATE_NAISSANCE|date_relative)</span>]
      [<span><strong>Lieu :</strong> (#LIEU)</span>]
      [<span>(#COURT_DESCRIPTIF)</span>]
      </div>
      <div class="nettoyeur"></div>
      </li>
      </BOUCLE_breves>
      </ul>
      </B_breves>
    • 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.

    • 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 ?

    • 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?}

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

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

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

    Répondre à ce message

  • 20

    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 ?

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

    • 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 ?

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

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

    • quelles connaissances SPIP avez vous ?

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

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

      <B_mots>
      <div class="formulaire_spip formulaire_recherche_mot">
      <form method="post" action="#SELF">
      	[(#SELF|form_hidden)]
      	<ul>
      	<BOUCLE_mots(MOTS){par titre}{objet=article}>
      		<li>
      			<label for="mot#ID_MOT">#TITRE</label>
      			<input type="checkbox" class="checkbox" name="mots[]" id="mot#ID_MOT" value="#ID_MOT"[(#ID_MOT|in_array{#ENV{mots}}|oui) checked="checked"] />
      		</li>
      	</BOUCLE_mots>
      	</ul>
      
      <p class="boutons"><input type="submit" class="submit" value="<:bouton_enregistrer:>" /></p>
      </form>
      </div>
      </B_mots>
      
      <B_articles>
      	<ul>
      	<BOUCLE_articles(ARTICLES){mots?}{par titre}>
      		<li><a href="#URL_ARTICLE">#TITRE</a></li>
      	</BOUCLE_articles>
      	</ul>
      </B_articles>
    • 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.

    • 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 ?

    • 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 !

    • ne surtout jamais modifié le dossier squelette.

      A tout hasard, le plugin est bien activé ?

      Sinon pour SPIP 2.1, il faut mettre

      <B_mots>
      <div class="formulaire_spip formulaire_recherche_mot">
      <form method="post" action="#SELF">
      	[(#SELF|form_hidden)]
      	<ul>
      	<BOUCLE_mots(MOTS spip_mots_articles){par titre}{id_article>0}>
      		<li>
      			<label for="mot#ID_MOT">#TITRE</label>
      			<input type="checkbox" class="checkbox" name="mots[]" id="mot#ID_MOT" value="#ID_MOT"[(#ID_MOT|in_array{#ENV{mots}}|oui) checked="checked"] />
      		</li>
      	</BOUCLE_mots>
      	</ul>
      
      <p class="boutons"><input type="submit" class="submit" value="<:bouton_enregistrer:>" /></p>
      </form>
      </div>
      </B_mots>
      
      <B_articles>
      	<ul>
      	<BOUCLE_articles(ARTICLES){mots}{par titre}>
      		<li><a href="#URL_ARTICLE">#TITRE</a></li>
      	</BOUCLE_articles>
      	</ul>
      </B_articles>
    • videz le cache le cas échéant ...

    • 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

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

    • 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 :)

    • 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à !

    • a mais oui,

      c’est le code

      [(#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 :

      [(#ENV{mots}|find{#ID_MOT}|oui) checked="checked"]
    • 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.

    • 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 ;-)

    • 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

  • 5

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

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

    • 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}}....
    • 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).

    • 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 :

      [
      (#REM)
      	Une première boucle qui prépare
      	une pile avec doublons nommée liste_0
      	(Ici on peut rajouter des critères si on veut
      	choisir des articles en particulier à filtrer avec des mots)
      
      	Ça peut marcher aussi pour d'autres boucles que ARTICLES...
      ]
      <BOUCLE_Une_pile(ARTICLES){doublons liste_0} ></BOUCLE_Une_pile>
      [
      (#REM)
      	Ensuite pour chaque mot de mon tableau...
      	"ma_liste_de_mots" contient une liste de mots
      	qui servent de filtres
      ]
      <BOUCLE_Les_mots(MOTS){id_mot IN #GET{ma_liste_de_mots}}>
      [(#SET{moinsun,[(#_Les_mots:COMPTEUR_BOUCLE|moins{1})]})]
      	[
      	(#REM)
      		on choisi parmi les articles de la pile précédente
      		(liste_x où x est compteur_boucle-1) 
      		les articles qui sont rattachés au mot. Et on
      		les empile avec un doublons dans la pile suivante
      		(liste_y où y=compteur de boucle)
      	]
      	<BOUCLE_les_articles_du_mot(ARTICLES){id_mot}
      				{!doublons liste_#GET{moinsun}}
      				{doublons liste_#_Les_mots:COMPTEUR_BOUCLE} ></BOUCLE_les_articles_du_mot>
      </BOUCLE_Les_mots>
      [
      (#REM)
      	Au final, on a une pile
      	(nommée liste_z où z=nombre de tour de boucle "Les_mots")
      	qui contient bien seulement les articles qui ont
      	tous les mots du tableau
      
      	C'est ce que liste la boucle d'après.
      	(ça peut être l'occasion de les trier d'une
      	façon ou d'une autre...)
      ]
      <BOUCLE_Articles_empile(ARTICLES){!doublons
      liste_#_Les_mots:COMPTEUR_BOUCLE}>
      	#TITRE<br>
      </BOUCLE_Articles_empile>
    • Oups petite erreur de lien dans mon commentaire précédent : Afficher les articles connexes, triés par pertinence...

    Répondre à ce message

  • 3

    Bonjour,

    Je rencontre un problème très étrange de pagination erratique sur boucle imbriquée avec critère_mots.

    Je suis sur une page mot.html
    revue pour lister tous les articles d’une certaine rubrique, classés par familles.

    Mes familles sont dans un autre groupe de mot-clé

    Une première boucle récupère le nom d’une famille,
    Une seconde boucle imbriquée, récupère les article tagué à la fois par l’id_mot sur lequel on se trouve ET l’id_mot de la famille remontée par le premier niveau.

    Tout fonctionne sauf la pagination. Si j’essaie d’utiliser la pagin sur un des blocs de résultats, en fait elle affecte TOUS les blocs de résultats.

    Le code :

    <BOUCLE_mot_principal(MOTS){id_mot}>
    <h1>#TITRE</h1>
      <BOUCLE_familles(MOTS){id_groupe = 19}{par num titre}>
        
        <BOUCLE_affiche_famille(ARTICLES){id_rubrique=2}{mots 100% #ARRAY{0,#_mot_principal:ID_MOT,1,#_familles:ID_MOT}}{0,1}>
        <h3 class="header">#_familles:TITRE</h3>
        </BOUCLE_affiche_famille>
        
        [(#REM) Listes des formations mot + famille <!-- INCLURE{fond=liste/formations-resume,env}/ --> ]
        [(#REM) Articles de la rubrique Formations lies au mot-cle ]
        <B_list_formations>
          #ANCRE_PAGINATION
                <BOUCLE_list_formations(ARTICLES){id_rubrique=2}{mots 100% #ARRAY{0,#_mot_principal:ID_MOT,1,#_familles:ID_MOT}}{par num titre}{pagination 4}>
    
                      [<div class="h3"><a rel="bookmark" href="[(#URL_ARTICLE|url_absolue)]">(#TITRE)</a></div>]
    
                  </BOUCLE_list_formations>
    
            <p class="pagination">#PAGINATION{page_precedent_suivant}</p>
    
          </B_list_formations>
          	<p>Pas de formation disponible</p>
          <//B_list_formations>
          <div class="clear"></div> 
        
      </BOUCLE_familles>  	
      
    
      </BOUCLE_mot_principal>

    Si quelqu’un a une idée de où ca merdoie...

    Merci d’avance ;)

    Répondre à ce message

  • 10

    Bonjour,

    Est-il possible de limiter le résultat de la recherche à une rubrique ? La solution donnée sur le post du 27 mai 2011 à 15:59 ne semble pas fonctionner.

    • le critère s’appliquant à une boucle, il suffit de mettre le critère classique {id_rubrique=XXX} sur cette boucle.

    • Voici le formulaire :

      <form action="spip.php?page=recherche3" method="post" name="mot" >
      
      <select name="mots[0]">
      <BOUCLE_gr1(GROUPES_MOTS){id_groupe=4}>
      [<option>#TITRE</option>]
      <BOUCLE_mots4(MOTS){id_groupe}>
      <option value="#ID_MOT">#TITRE</option>
      </BOUCLE_mots4>
      </BOUCLE_gr1>
      </select>
      
      <select name="mots[1]">
      <BOUCLE_gr2(GROUPES_MOTS){id_groupe=5}>
      [<option>#TITRE</option>]
      <BOUCLE_mots5(MOTS) {id_groupe}>
      <option value="#ID_MOT">#TITRE</option>
      </BOUCLE_mots5>
      </BOUCLE_gr2>
      </select>
      
      <select name="mots[2]">
      <BOUCLE_gr3(GROUPES_MOTS){id_groupe=6}>
      [<option>#TITRE</option>]
      <BOUCLE_mots6(MOTS) {id_groupe}>
      <option value="#ID_MOT">#TITRE</option>
      </BOUCLE_mots6>
      </BOUCLE_gr3>
      </select>
      
      <input type="submit" value="chercher" name="ok">
      </form>

      Et voici la page de résultats :

      <BOUCLE_mot(MOTS){id_mot in #ENV{mots}}>#TITRE </BOUCLE_mot>
      
      <B_recherche_par>
      <div classe="liste">
      	<h3><:resultats_recherche:></h3>
      	
      	<ul class="liste-items">
      	<BOUCLE_recherche_par(ARTICLES){mots}{pagination 5}>
      		<li class="item">
      			<a href="#URL_ARTICLE">#TITRE</a>
      		</li>
      	</BOUCLE_recherche_par>
      	</ul>
      <p id="pagination" class="clearfix pagination nettoyeur">
      	#PAGINATION
      </p><!-- #pagination -->
      </div>
      
      </B_recherche_par>
         

      J’ai deux problèmes :

      1. Le formulaire passe les mots via #ENV à la page de résultats (et les mots sont affichés sur cette page) mais les articles ne s’affichent pas, sauf si j’écris dans l’URL "&mot[]=10&mot[1]=3...

      2. Si j’ajoute {id_rubrique=XXX} à ma boucle « recherche_par », il n’ a plus de résultat.

      Merci de toute lumière !

    • 1. Sans être expert en la question, je pense que tu devrait remplacer method="post" par method="get". Cela passera correctement les variables à l’URL.
      2. {id_rubrique=XXX} tu as bien remplacé XXX par la rubrique où tu veux limiter ?

    • Merci du retour rapide.

      La méthode get me renvoie à la page d’accueil car l’url créée donne ceci :

      spip.php ?mots%5B0%5D=12&mots%5B1%5D=17&mots%5B2%5D=2&ok=chercher

      Sinon oui, j’ai bien mis le numéro de rubrique.
      Petite précision, le site fonctionne avec zpip, cela peut éventuellement expliquer ces problèmes ?

    • Pour la rubrique, cela fonctionne, erreur d’étourderie ma part, il fallait mettre id_secteur=XXX, car les articles étaient dans des sous rubrique de la rubrique en question. Mais pour le passage des variables à l’URL, je ne vois pas comment faire...

    • il faut que tu mette l’url de page en hidden

      <input type="hidden" name="page" value="recherche3" />

      le fait d’être en zpip ne change rien à la question.

      (bon dans l’idéal faudrait faire un vrai form propre sous la forme de CVT)

    • Merci, cela appelle en effet la bonne page mais les crochets restent transformés dans l’URL ( &mots%5B2%5D=1), du coup la page résultats ne donne toujours rien.

    • les crochets ne sont pas responsables du problème. Ils sont normaux.

      Le pb doit venir d’ailleurs. Exemple là sur une page toto.html

      <form method="get">
      <input type="hidden" name="page" value="toto" />
      <B_mots>
      <select name="mots[1]">
      <BOUCLE_mots(MOTS){par titre}>
      	<option value="#ID_MOT">#TITRE</option>
      </BOUCLE_mots>
      </select>
      </B_mots>
      
      <BOUCLE_articles(ARTICLES){mots}{par titre}>
      #TITRE
      </BOUCLE_articles>	
      <input type="submit" value="chercher" name="ok">
      </form>

      Fonctionne parfaitement.

    • J’ai essayé avec cet exemple. Les crochets ne passent pas plus. Il sont systématiquement encodé en %5B et %5D dans l’Url. Test fait en local et sur serveur. Si quelqu’un a une piste....

    • je confirme avoir essayé cet exemple chez moi avant de te l’envoyer. Et même si les crochets sont encodés dans l’URL cela n’empêche pas le bon fonctionnement du critère.

      Du reste tu n’a qu’à vérifer en faisant [(#ENV{mots}|var_dump)] > tu verra que tu a bien affaire à un tableau.

      Ton pb doit venir d’ailleur, mais de quoi ?

    Répondre à ce message

  • ce plugin de fou...

    J’ai passé des centaines d’heures pour réaliser divers moteurs multicritères ces dernières années. Et ce soir je tombe sur ce plugin, tout fait, tout simple, tout bête et en 5mn j’ai un moteur qui fonctionne...

    Pourquoi j’avais jamais cherché avant ??? Pourquoi ???

    Merci !!!!

    Répondre à ce message

  • 6

    Hello ! :)

    Bon... plus j’utilise ce plugin et plus je le trouve génial.

    Mais là j’ai un cas de conscience. Sur une page rubrique, je liste un *très* grand nombre d’articles paginés par 15 que je souhaite pouvoir trier par mot clés, lesquels appartiennent à 2 groupes. Le premier exemple me parait approprié :

    http://www.toto.fr/?page=toto&amp;amp;mots[0]=XX&amp;amp;mots[1]=YY.

    Mais je cherche à savoir si l’on peut obtenir la même transmission de variable au contexte avec des paramètres ajax (donc passés avec des !# plutôt que des ? et des &) ?

    soit une écriture du style

    http://www.toto.fr/ma-rubrique#!mots[0]=XX&amp;amp;mots[1]=YY.

    Dans le but d’éviter des duplications de contenus malheureuse, ce qui arrive quasi systématiquement dès que l’on joue avec les paramètres d’url

    Une idée ?

    Merci d’avance ;)

    • heu, je vois pas en quoi ajax change quoique ce soit à ce pb. L’ajax made in spip passe automatiquement les params get...

    • L’ajax made in spip passe automatiquement les params get...

      C’est à dire ?

      je vois pas en quoi ajax change quoique ce soit à ce pb

      En fait, si, ca change quand même pas mal de chose à mon niveau :)

      En substance, quand Google croise page.html, page.html ?plop=pwet et page.html ?truc=machin&bidule=schmurtz, pour lui ca fait 3 pages distinctes à indexer même si chaque paramètre ne change réellement que 2 mots dans la page (donc contenu dupliqué à plus de 99% pour autant de page qu’il y a de valeur à chaque paramètre = pas bon pour ton ref !

      Alors que page.html, page.html# !plop=pwet etc... ne seront bien reconnue que comme une seule et même page (les fragments indépendants s’affichant en mode noJS pouvant alors être facilement non indexés

      Je ne sais pas si je suis clair là ? :D )

    • oui tu es clair, mais alors c’est un pb plus général à l’ajaxation, pas spécifique ici. A mon avis tu devrais en discuter sur user.

    • Bah en fait non c’est vraiment pas un problème lié à l’ajax. Moi le fonctionement ajax me convient bien mieux que des params d’url classiques.

      Là justement, je cherche à savoir si on peut ajaxer un peu le fonctionnement de ce plugin en fait ?

    • je comprend rien à tes propos...

      c’est pas compliqué l’ajax avec spip : <INCLURE{toto}{ajax}{env}>. Il suffit juste que ton form de select des mots clef soit dans toto et ca roule ...

    • OK je vais creuser par là alors. Je sais pas pourquoi je m’étais immaginé un truc plus compliqué. Je vais voir ça, merci :)

    Répondre à ce message

  • Je viens de tester le cas où on applique plusieurs fois le critère {mots} sur la même boucle

    <BOUCLE_a(ARTICLES)
        {mots 1 #LISTE{1,2}}
        {mots 1 #LISTE{3,4}}
        {mots 1 #LISTE{5,6}}>
    	<li>#ID_ARTICLE</li>
    </BOUCLE_a>

    Dans ce cas, seul le dernier critère ({mots 1 #LISTE{5,6}}) est pris en compte et les précédents ({mots 1 #LISTE{1,2}}{mots 1 #LISTE{3,4}}) sont ignorés.

    Peut-être pourrait-on ajouter un paragraphe pour le préciser.

    Répondre à ce message

  • Bonjour

    Je me sers de ce plugin efficace d’ailleurs, pour créer un moteur de recherche multicritères sur plusieurs groupes de mots clés. Je souhaiterai modifier le formulaire de sélection pour faire afficher directement les 4 groupes de mots clé que j’utilise :
    -  Groupe 1 -> menu déroulant avec les mots clés du groupe
    -  Groupe 2 -> menu déroulant avec les mots clés du groupe
    -  Groupe 3 -> menu déroulant avec les mots clés du groupe
    -  Groupe 4 -> menu déroulant avec les mots clés du groupe
    Actuellement il propose d’abord -> Dans le groupe : liste déroulante avec Groupe 1, Groupe 2, Groupe 3, etc. puis un autre choix, etc.

    J’ai regardé la page recherche_par_mot.html, mais je n’y arrive pas vraiment...
    Quelqu’un pourrait il m’aider ?

    Répondre à ce message

  • À noter : le critère {mots} ne s’applique pas à... la boucle MOTS ! Dans ce cas, il suffit de faire :

    <BOUCLE_mots(MOTS){id_mot IN #MOTS}>
    	#TITRE
    </BOUCLE_mots>

    Répondre à ce message

  • 1

    Une alternative qui ne nécessite pas le plugin, via @denisb

    @@@ s'il existe, le tableau id_mot[] contient 1, 2 ou 3 éléments
    @@@ on peut avoir id_mot[]=xx 3 fois maximum en url
    
    <BOUCLE_test(ARTICLES)
    	{id_mot == ^(#ENV{id_mot}|table_valeur{0}|sinon{.*})$}
    	{id_mot == ^(#ENV{id_mot}|table_valeur{1}|sinon{.*})$}
    	{id_mot == ^(#ENV{id_mot}|table_valeur{2}|sinon{.*})$}
    	>
    
    @@@ ne sort *que* les articles associés à *tous* les id_mot passés en url
    • intéressant ! utile effectivement, mais ne permet pas de gérer les cas avec un nombre potentiellement illimité de mot.

    Répondre à ce message

  • 5

    Bonjour,

    Il semble y avoir un problème (v1.2.3 sous SPIP 2.1.21).

    Si j’effectue un simple :

    <BOUCLE_art(ARTICLES){mots 100% #ARRAY{0,1,1,2}}>
            #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 :

    • inc_prepare_mots_dist : retourne bien ’1=0’
    • critere_mots_dist : si je fais afficher $mots_where juste avant
      $boucle->where[] = "ntt".'$mots_where';
      j’obtiens ’’ (chaine vide) donc pas de condition au lieu d’une condition fausse... (mais même en le fixant en dur, cela ne change pas grand chose...)

    J’avoue que c’est un peu obscur pour moi...

    Une idée ?

    Julien

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

    • 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

    • Super, merci Maïeul !

    • 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

    • 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

  • 3
    Horetol

    Bonjour,

    Je n’ai peut-être pas compris comment faire fonctionner ce plugin.

    La page de demo /?page=demo/parmots trouve 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

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

    • salut,

      je m’apercois que je n’ai pas répondu...
      le pb est-t-il tjr là ?

    • Horetol

      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

  • 2

    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

    • 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.html du thème actif inclus bien le bloc de navigation via <INCLURE{fond=navigation/#ENV{type},env}>, avec le env complet.

    • 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[]=94       

      et donc on reste sur la même page sans avoir les résultats.

      dd

    Répondre à ce message

  • 2

    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_site
    FROM spip_syndic AS <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3luZGljPC9jb2RlPg=="></span>
    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
    	)

    Répondre à ce message

  • 4

    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.

    • 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é =(

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

    • il faudrait voir avec Real3T qui est à l’origine du forme. Je le previens.

    • 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">[&nbsp;(#_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

  • 13

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

    • 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

    • Bonjour tout le monde et à Maïeul,

      Vous n’avez toujours pas de réponse à ma question

    • J’ai essayé toutes les boucles possibles en mots clés, mais toujours pas de résultat. Merci encore de votre aide

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

    • 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

    • en fait vu votre formulaire, il vous faut <BOUCLE_mots(MOTS){id_mot in #ENV{mots}}>....

      Je vous invite à lire La balise #ENV

    • 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

    • tu aurais un url de demo ?

    • 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

    • Bonjour Maïeul,

      vous avez vu l’url ?

    • je tombe sur une erreur 404.

      le mieux serait que vous me fassiez parvenir un dump de votre base et vos squelette par email

    • ok, mea culpa.

      Donc c’est {id_mot IN #ENV{mots}} avec le IN en majuscule.

    Répondre à ce message

  • 1

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

    • 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

  • 4

    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})">[&nbsp;(#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.

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

    • Il s’agit de SPIP 2.1.13

    • 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

    • 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

  • 1

    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

    • 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

  • Merci pour ce plug que j’ai pris à la place de la recherche avancée. Cependant j’ai un inconvénient :
    -  affichage des articles que si les 2 mots des groupes sont sélectionnés dès le départ.
    -  pas d’affichage des articles avec 1 seul mot de sélectionné
    -  pas de possibilité de rajouter un mot quand un seul a été sélectionné.

    #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},#SELF})]
    </div>
    
    
    <B_recherche_par>
    <div class="menu articles">
    	<BOUCLE_recherche_par(ARTICLES){mots}{!par date}{pagination 5}>
    		<div class="clubs"><h3>#TITRE</h3> #TEXTE
    				
    				<BOUCLE_lesmots2(MOTS) {id_groupe=1} {id_article}>
    				<span> >> <b>Activités</b> : #TITRE</span>
    				</BOUCLE_lesmots2></div>
    	</BOUCLE_recherche_par>
    	
    <p id="pagination" class="clearfix pagination nettoyeur">
    	#PAGINATION
    </p><!-- #pagination -->
    </div>
    </B_recherche_par>

    Je bloque un peu et vous remercie pour votre aide. :)

    Répondre à ce message

  • 4

    Bonsoir !

    J’utilise ce plugin génial depuis un bon moment ! Il est au coeur de la navigation de mon site. Seulement voilà, je viens de m’apercevoir qu’il y avait un problème sous IE8.

    J’avais jusqu’alors testé mon site sous les dernières versions de Firefox, Chrome, Safari, Opéra ainsi que sous une version de IE9 sans aucun pb.

    Sous IE8, d’une part, en cliquant sur les boutons radio, l’ajax ne se met pas en route (il faut cliquer deux fois) et d’autre part, après l’ajout d’un mot dans le tableau, l’affichage de la page plante !

    Je vous mets un lien de l’une des pages utilisant le code !

    http://www.librairie-interactive.com/spip.php?page=mot&id_groupe=3

    Merci d’avance pour le temps que vous accorderez à mon pb !

    • Personne n’a ie8 pour voir le pb et surtout une idée pour me donner un piste de recherche ?

    • Pour ceux que ça pourraît aider, j’ai résolu le premier problème qui était lié à l’interprétation du « onchange » par ie7 et 8.

      http://webbugtrack.blogspot.fr/2007/11/bug-193-onchange-does-not-fire-properly.html

      Le problème se resoud facilement en remplaçant le onchange par onclick !

      Par contre, je n’ai pas encore résolu le problème de destructuration de la page au moment de choisir le mot. Il semble que l’ensemble du code n’est pas chargé (problème d’ajax ?)

      Je suis toujours preuneur d’un coup de pouce !

    • merci,

      je ne peux aider, n’étant pas à l’origine de cette fonctionalité.

    • Bon ! Pour le problème d’affichage, c’était bien de ma faute ! Après un moment de recherche, une simple balise h4 fermante sans le slash... Seul IE 7 et 8 l’interprétaient !

      Merci à ceux qui ont regardé !

      mike

    Répondre à ce message

  • 8

    Bonjour j’utilise ce plugin qui est hyper intéressante, je n’ai jamais eu de problème sauf maintenant. J’ai un champ avec les mots clé du groupe 3 et un autre champ qui sélectionne une date avec « datepicker » , voici ma boucle resultat

    <BOUCLE_agenda(ARTICLES) {recherche?} {!par #ENV{tri,points}} {mots?} {!par date} {pagination 5} {id_rubrique IN 1}>
     <li>
     <a href="#URL_ARTICLE" title="[(#ETABLISSEMENT|textebrut)]">[(#LOGO_ARTICLE|image_reduire{190,0}|image_recadre{75,90,center})]
              </a>
         </li>		
    </BOUCLE_art>

    Si je choisit une date j’ai pas le bon resultat. Chaque article a un évènement dont les date sont géré par le plugin agenda. Merci de votre réponse

    • qu’entendez vous par « je n’ai pas le bon résultat » ? quel résultat avez vous vous et à quel résultat souhaitez vous aller ?

    • Merci pour votre réponse, si je choisis une date j’aimerai afficher les articles qui ont un événement à cette date. Alors j’aimerai savoir qu’est ce qu’il faut ajouter dans ma boucle de resultat pour que cela marche.

      PS : j’ai utilisé le plugin agenda pour creer les évènements dans les articles, alors les dates sont géré par ce plugin. Merci pour votre réponse

    • Hum,

      ce n’est pas un problème spécifique au critère mot, mais plutôt au plugin agenda ;-)

      Je suis un peu fatigué ce soir, donc je préfére ne pas écrire de bêtises, parceque c’est un code un chouilla complexe (il faut d’abord séléctionner les evenements à une date donnée, puis les articles liés à ces agendas).

      Pourquoi ne posez vous pas la question sur la liste de discussion de SPIP ? Sinon j’essaierai de trouver le code correct ce week-end (ce n’est pas compliqué, mais il faut faire les choses posément).

    • Merci beaucoup, j’ai posé la question sur la liste de discussion mais j’ai pas encore de réponse. Vous aurez une réponse avec la tête reposée. Merci encore

    • Bonjour Maïeul,
      Je compte sur vous pour le resultat de la recherche avec la datepicker, jusqu’à présent j’ai pas de réponse de la liste. Voici mon champ input de la date

      <input name="date1" id="datepicker" class="date-pick dp-applied" type="text" />

      les autres input sont des mots clés. Merci de votre aide

    • bon, déjà il faudrait que votre name soit égale à date_debut, car c’est le nom de du champ pour l’évenement.

      ensuite un code suivant devrais faire l’affaire, si j’ai bien compris le pb

      <BOUCLE_agenda(EVENEMENTS){jour_relatif_debut=0}>
      
      <BOUCLE_art(ARTICLES) {recherche?} {mots?}  {!par #ENV{tri,points}} {!par date} {pagination 5} {id_rubrique IN 1}{id_article}{doublons evenement}>
      <li>
      <a href="#URL_ARTICLE" title="[(#ETABLISSEMENT|textebrut)]">[(#LOGO_ARTICLE|image_reduire{190,0}|image_recadre{75,90,center})]
               </a>
          </li>                
      </BOUCLE_art>
      </BOUCLE_agenda>

      -  boucle evenements permet de selectionner les evenements du jour courant
      -  le id_article permet de selectionner l’article correspondant aux évenements, et le doublon évite de selectionner 2 fois l’article si celui ci a 2 evt le même jour

      Encore une fois, ce n’est pas un pb de critères mots, mais d’agenda : vous devriez demande plutôt sur le plugin agenda. Voyiez aussi http://www.spip.net/fr_article1971.html

    • Bonjour Maïeul, mille merci pour ton aide, J’ai testé la solution que vous m’avez proposé sans succès. Mais je reviens encore vers vous. J’ai changé de méthode, maintenant les mots clés sont attachés directement aux évènements et non pas aux articles (je penses que serait plus simple avec ce plugin). Alors j’avance bien, je rencontre un seule problème
      1/ quand je choisis une date, résultat OK (affiche les événements qui ont la date choisi)
      2/ quand je choisis une date et un mot clé , résultat OK (affiche les événements lié à la date choisis)
      3/ quand je choisis mot clé, PROBLEME (rien ne s’affiche, alors que ya bien des événement qui sont attaché a ce mot)

      Voici ma formulaire :

      <form action="spip.php?page=resultat" method="get" >
      <input name='page' value='resultat' type='hidden' />           
            <input name="date_debut" id="datepicker" class="date-pick dp-applied" type="text" />
            
      	<select name="mots[0]">
              <option value="0" selected="selected">Choisir une cat&eacute;gorie</option>		
              <optgroup label="Culture">
      		<BOUCLE_g1(GROUPES_MOTS){id_groupe IN 2}>
              <BOUCLE_surmot(MOTS){id_groupe}{par titre}>
              <BOUCLE_articledesmotscles(ARTICLES){id_mot}>
      		</BOUCLE_articledesmotscles>
      		<option value="#ID_MOT" [(#ENV{id_mot}|=={#ID_MOT}?{"SELECTED"})]>#TITRE </option>
              </BOUCLE_surmot>
      		</BOUCLE_g1>
      		</optgroup>
      </select>
      <input name="submit" type="submit" class="search" title="Rechercher dans l'agenda" value="Rechercher" />
      </form>

      Voici ma boucle resultat :

      <div id="resulta">
      Recuperation date choisie: [(#ENV{date_debut}|affdate)]
      Recuperation  mot choisis?
      
      [(#SET{annee,#ENV{date_debut}|affdate{annee}})]
      [(#SET{mois,#ENV{date_debut}|affdate{mois}})]
      [(#SET{jour,#ENV{date_debut}|affdate{jour}})]
      
      <B_agenda>
      <ul>
      <BOUCLE_agenda(EVENEMENTS){mots?} {recherche?} {!par #ENV{tri,points}} {agendafull date_debut, date_fin, jour, #GET{annee}, #GET{mois}, #GET{jour}?} {pagination 5}>
      <BOUCLE_art(ARTICLES) {id_rubrique IN 1}{id_article}>
       <li>
       <a href="#URL_ARTICLE" title="[(#ETAB|sinon{#LIEU2}|textebrut|couper{30})]">[(#LOGO_ARTICLE|image_passe_partout{75,90}|image_recadre{75,90,center})]
            <span class="titre entry-title">#TITRE</span>      
        [<span class="date">(#DATE_DEBUT|Agenda_affdate_debut_fin{#DATE_FIN,#HORAIRE=non})</span>]
              [<span class="descriptif entry-content">(#CHAPO|TEXTEBRUT|COUPER{150})</span>]
              <hr />
              </a>
           </li>		            
      </BOUCLE_art>
      </BOUCLE_agenda>
      </ul>
      </B_agenda>
      </div>

      Pour finir comment récupérer dans la page résultat le titre du mot clé choisi ??

    • pas compris : vous voulez faire une recherche sur un mot clef ou sur plusieurs en même temps ? car si un seul mot clef, pas besoin du plugins. Sur plusieurs, je n’ai jamais testé avec evenements.

      Pour afficher le titre du mot clef, utilisez une boucle mot classique de SPIP

    Répondre à ce message

  • Bonjour Maïeul,
    Je compte sur vous pour le resultat de la recherche avec la datepicker, jusqu’à présent j’ai pas de réponse de la liste. Voici mon champ input de la date

    <input name="date1" id="datepicker" class="date-pick dp-applied" type="text" />

    les autres input sont des mots clés. Merci de votre aide

    Répondre à ce message

  • 3

    J’essaie de faire fonctionner ce plugin mais je n’arrive à avoir les bons résultats, qui ne correspondant pas du tout.

    <BOUCLE_article(ARTICLES) {id_article}>
    ...
    #SET{mots,#ARRAY}
    <BOUCLE_mot_travaux(MOTS){id_article}{par titre}{id_groupe==5}>
    #SET{mots,#GET{mots}|push{#id_mot}}
    <a href = "#URL_MOT">#TITRE</a></BOUCLE_mot_travaux> 
    ...
    <BOUCLE_article_lies(ARTICLES){mots 100% #GET{mots}}{par date}{inverse}>#TITRE</BOUCLE_article_lies>
    ...
    </BOUCLE_article>

    Mon article de test a 11 mots-clefs, j’attends donc que ma deuxième boucle articles ne sélectionne que les articles liés qui on 100% de ces 11 motfs-clefs

    Mais j’ai pourtant une longue liste d’article qui ne correspond pas du tout à ce critère.

    Une erreur dans ma boucle, une mauvaise compréhension du critère ?

    • mettre #ID_MOT en majuscule dans le push devrait résoudre l’affaire ?

    • Non, ça ne change rien ...

      En fait, le plugin (version 1.2.3) installé via http://files.spip.org/spip-zone/archives.xml ne fonctionne pas en spip3 comme indiqué.

      Il produisait des erreurs : Erreur 1146 de mysql : Table ’etraces_spip3.spip_mots_articles’ doesn’t exist

      RastaPopoulos a réglé ça http://zone.spip.org/trac/spip-zone/changeset/59904

      La version 1.3 fonctionne mais demande vraiment trop de ressources pour être utilisable.

      100% de cpu utilisé, Query_time : 608.329400

    • hum, malheureusement je n’ai pas assez de compétence mysql pour régler ce pb. C’était fil qui avait fait le code initiale, je m’étais contenté de l’adapter à la syntaxe.

    Répondre à ce message

  • LENTEUR

    Bonjour,

    j’utilise le formulaire « n’affichant que certains groupes de mots » , il s’agit d’un groupe de mot contenant une centaine de mots clés.

    lorsque je sélectionne un mot clé dans le menu déroulant j’ai un appercu du nombre d’articles qui répondent à ce critère, le temps d’affichage de ces articles est tes long, anormalement long, 15/20 secondes,

    avez vous une astuce pour améliorer cette efficacité ?

    merci

    Répondre à ce message

  • 6

    Bonjour à tous,

    J’arrive à filtrer en fonction d’un mot clef quand je le mets en dur dans le squelette.
    Mais comment faire si je veux qu’il soit en variable sans qu’il passe par l’URL ?

    je m’explique, c’est tout simple mais je n’ai pas trouvé comment faire :

    je suis sur un article qui a pour mot clef « aaa » comment faire une boucle qui me donne tous les articles ayant le même mot clef ?

    mon code pour le moment avec le mot en dur :

    <BOUCLE_mot (MOTS) {id_article}>
                                        #SET{mots, #ARRAY{0,aaa}}
                                        <BOUCLE_article_mot (ARTICLES){id_rubrique!=11}{mots 100% #GET{mots}}>
                                            <a href="[(#URL_RUBRIQUE|parametre_url{art,#ID_ARTICLE})]">#TITRE, </a>
                                        </BOUCLE_article_mot>
                                    </BOUCLE_mot>

    merci !

    • Il faut que vous remplissiez dynamiquement le tableau mots.

      Pour ce faire

      #SET{mots,#ARRAY}
      <BOUCLE_mots>
      #SET{mots,#GET{mots}|push{id_mot}}
      </BOUCLE_mots>

      Par ailleurs il faut que vous sortiez la boucle articles_mots de la boucle mot, sinonvous elle sera affichée autant de fois qu’il y a de mois à l’article.

    • Merci pour cette réponse rapide !

      J’ai essayé ça, mais je ne dois pas avoir tout compris...

            	#SET{mots,#ARRAY}
                                                                    
                                     <BOUCLE_mot (MOTS) {id_article}>
                                          #SET{mots,#GET{mots}|push{id_mot}}
                                      </BOUCLE_mot>
                                      
                                      <BOUCLE_article_mot (ARTICLES){id_rubrique!=11}{mots 100% #GET{mots}}>
                                      	<a href="[(#URL_RUBRIQUE|parametre_url{art,#ID_ARTICLE})]">#TITRE, </a>
                                      </BOUCLE_article_mot>

      j’ai l’impression que de cette manière il ne comprend pas à quel mot l’array doit faire référence, je me trompe ?

      Merci beaucoup du temps que vous m’accordez en tout cas

    • J’ai finalement réussi mais en laissant la boucle article dans la boucle mot
      Je n’ai pas de problème de répétitions, même quand j’ai plusieurs mots clefs associés. Bizarre mais ça fonctionne

      Le code pour ceux que ça intéresserait :

           #SET{mots,#ARRAY}                   
                                     <BOUCLE_mot (MOTS) {id_article}>
                                          #SET{mots,#GET{mots}|push{id_mot}}
                                          <BOUCLE_article_mot (ARTICLES){id_rubrique!=11}{id_mot}{exclus}>
                                          <a href="[(#URL_RUBRIQUE|parametre_url{art,#ID_ARTICLE})]">#TITRE, </a>
                                      </BOUCLE_article_mot>
                                      </BOUCLE_mot>

      Merci pour ce plugin et pour ton aide précieuse

    • votre seconde solution effectivement fonctionne … mais n’utilise pas ce plugin (pas de critères mots)

      il utilise juste les possibilités standard de SPIP. Et le pb de répétition absent est normal, grâce au critère exclus.

      par contre je ne comprend pas que le premier exemple n’ai pas fonctionné : est)ce que par hasard vous auriez #SETmots,#ARRAY dans la partie optionnelle d’une boucle ?

    • Ah ok... !

      Non, je n’ai jamais utilisé #SET ou #ARRAY ailleurs que pour cette boucle dans les conditions énoncées plus haut. Mais mon niveau de développement est tellement proche de 0 qu’il est possible qu’une erreur quelque part ailleurs empêche votre solution de fonctionner !

      Merci

    • Eerik Wissenz

      J’avais la meme besoins : juste afficher les articles qui on tout (et que tout) les mots clef du context (genre les mots clef d’un rubriques ou un articles), puis ordre tout ca par date inverse.

      Maïeul propose biens la bonned solution, merci, mais a oublier un « # » avant id_mots « push », et « id_mot » devrais etre « ID_MOT ».

      #SET{mots,#ARRAY}                                
                                     <BOUCLE_mot (MOTS) {id_article}>
                                          #SET{mots,#GET{mots}|push{#ID_MOT}}
                                      </BOUCLE_mot>
                                      
                                      <BOUCLE_article_mot (ARTICLES){mots 100% #GET{mots}}{par date}{inverse}>
                                      	<a href="#URL_ARTICLE">#TITRE, </a>
      </BOUCLE_article_mot>

      Remarque, dans un context rubriques, just change « id_article » avec « id_rubrique » dans la premier boucle. Aussi, oublie pas de cocher dans la mot clefs groupe que tu peur associer ce les mots clef de ce group a des rubrique (c’est possible que pour des article par default, Spip 2.1.12).

      Pardon mon francais, je suis Anglophone mais je me debroille en francais assez pour bien Spiper. Vive Spip !

    Répondre à ce message

  • 3

    Excellent !

    Est-ce que vous pensez possible de rajouter un critère de tri par nombre de mots trouvés ?

    Par exemple, je demande à avoir au moins 1 mot en commun, mais je voudrais mettre en avant ceux qui en ont plus...

    • heu desolé, je ne connais pas assez le mysql pour faire cela. Peut-être que c’est possible, mais il faudrait que je me plonge dedans. Peut-être cet été.

    • Bonjour et merci,
      tres utile
      La nouvelle version permet-elle de resoudre ce pb
      Bruno

    • pas à ma connaissance

    Répondre à ce message

  • Je n’aurais que 2 mots : « BRAVO » et « MERCI » ! :-)

    Répondre à ce message

  • 4

    Une dernière petite question :

    J’ai mis le formulaire sur la page mot puisque j’ai une navigation exclusivement par mot clé !. j’arrive donc toujours sur cette page en ayant suivi un lien mot.
    J’aurais souhaité que l’id_mot que j’ai suivi soit prise en compte dans le tableau. Sans pour autant devoir modifier partout les liens sur les mots clés.

    Est-ce possible ?

    • très probablement. Ce n’est pas moi qui ait créé ce formulaire, mais je suppose qu’il y a moyen de le modifier pour lui passer un paramètre id_mot. Après là je n’ai pas le temps de regarder exactement comment faire.

    • Quelqu’un pourrait juste m’expliquer comment ajouter une id_mot récupérer dans les variables environnementales dans le tableau mots ?

      Merci d’avance

    • merci de commencer un nouveau fil par nouveau sujet ;-)

      pour le problème, un exemple de code aurait-été bon. Mais je t’envoie quand même vers la doc de la balise #ARRAY, qui devrait t’aider. Et si tu n’y arrive pas, et bien reviens :-) http://www.spip.net/fr_article4009.html

    • Désolé mais je n’ai fait que continuer mon fil ! j’ai juste oublié de m’identifier !
      Voila où j’en suis :

      Au début de ma page mot, j’ai rajouté cette ligne :
      [(#SET{mots,[(#ENV{mots, #ARRAY{}}|push{#ENV{id_mot}})]})]

      J’ai donc bien rajouté mon id_mot dans le tableau.

      Seulement si j’inclus le formulaire recherche_par_mot sur la page mot en utilisant la balise #FORMULAIRE_RECHERCHE_PAR_MOTS, il va chercher la valeur du tableau en ENV et non en GET et ne tient donc pas compte de mon ajout.

      J’essaie donc de mettre mon formulaire dans une noisette pour passer ma nouvelle variable mais ça ne change rien. Il me manque un truc mais je ne trouve pas pour le moment !

    Répondre à ce message

  • 6

    j’ai découvert ce plugin avant de commencer à développer mon site et je l’ai trouvé génial pour moi car j’envisageais une navigation par mots clés uniquement. J’y ai donc tout de suite vu une très bonne manière pour l’utilisateur de rajouter ou d’enlever des filtres de navigation.

    Mais voilà, j’ai fait des choix lors de mon développement, notamment celui d’utiliser le plugin-squelette zpip et de démarrer avec un thème de départ à modifier.

    Seulement voilà, au moment de mettre en place le plugin, je réalise qu’il ne fonctionne plus. Le formulaire affiche le select pour les groupes mais apres le choix, le select pour les mots du groupe ne s’affiche pas.

    Apres avoir longtemps cherché, j’ai réalisé que le plugin fonctionnait si je changeais simplement le thème appliqué. j’en déduit donc que le thèmes tincrédible est coupable. Seulement voilà, j’en suis à un stade où je ne peux plus m’en passer. je dois donc trouver le pkoi du comment.

    Si vous aviez une piste ou deux à explorer !!! Merci d’avance !

    • cela m’étonne que le thème trincredible empêche l’affichage. Un thème gère la présentation, pas le contenu. Vous auriez un site exemple ?

    • Je peux le mettre en ligne sur mon pc si vous êtes encore là !
      http://78.230.32.35/

    • J’ai mis le switcher de thèmes ! La preuve est qu’il suffit de changer de thèmes pour que cela fonctionne.

    • effectivement !

      pour le coup je pense que c’est thincredible qui met du js qui pose des soucis avec l’ajax natif de spip. Tu a essayer une pagination ajax par exemple ? ou un autre formulaire en ajax ?

      le mieux serait de demander sur le forum de tincredible

    • Les paginations fonctionnent et j’ai fait d’autres inclusions en ajax avec passage de variables qui fonctionnent.

      En tous cas merci d’avoir regardé !

    • Ben voilà ! Tu m’as mis sur la piste ! C’est bien le script pour le slider de la page d’accueil et qui était chargé dans le header directement depuis la surcharge du thèmes qui était en conflit ! Ce qui est étonnant car l’ajax fonctionnait malgré tout jusque là !

      Bref ! j’ai déplacé le script sur la noisette du slider et le tou est joué !

      Merci

    Répondre à ce message

  • 4
    Christophe BORD

    Bonjour,

    En utilisant ce plugin de la manière décrite avec un paramètre d’inclusion je rencontre un écueil :

    Dans un premier squelette je calcule un tableau criteres avec #SET et j’aimerais le passer comme paramètre à mon inclusion.

    #SET{criteres, #VAL{}|tabCriteres{#ENV{id_mot}}}

    tabCriteres est un filtre qui me renvoie un tableau, cette partie fonctionne.
    ....

    <INCLURE{fond=inc-syndic-tous}{{ {criteres} }}>

    Dans le second squelette inclus se trouve ma boucle :

    <BOUCLE_articles(ARTICLES){mots 100% #GET{criteres}}{par date}{inverse}>

    Ma boucle ne me donne pas de résultats. Avant l’inclusion le tableau compte pourtant bien plusieurs éléments. Quelque chose m’échappe ?

    • Christophe BORD
      <INCLURE{fond=inc-syndic-tous}{criteres}>

      Les parenthèses surnuméraires sont une étourdrier de ma part, je voulais mettre en gras.

    • le passage des #SET ne se fait pas automatiquement dans les squelettes inclus. Ce sont les #ENV qui le font.

      Donc pour toi il faudrait que tu fasse :

      <INCLURE{fond=inc-syndic-tous}{criteres=#GET{criteres}}>

      Cela signifie que tu passe comme paramètre d’environnement criteres le contenu de #GET{criteres}
      et dans le squelette inclus :

      <BOUCLE_articles(ARTICLES){mots 100% #ENV{criteres}}{par date}{inverse}>
    • Christophe BORD

      Merci Maieul, ca m’avait complètement échappé.

    • Christophe BORD

      Si en plus le critère est optionnel
      {mots? 100% #ENV{criteres}}
      fonctionne très bien.
      Comme ça n’allait pas de soi en ce qui me concerne, ça peut peut être servir à d’autres.

    Répondre à ce message

  • 4

    Bonjour

    J’aimerais afficher la liste complète des mots clefs discriminants.

    J’arrive à récupérer une liste d’articles associée à des mots clefs,
    mais comment peut on récupérer les mots cléfs supplémentaires utiles pour affiner la recherche ?
    C’est à dire qu’après avoir récupérer les articles ayant le mot clef A,
    une liste me propose les mots clefs B et C car un article possède les mot A et B
    et un autre les mots A et C.
    C’est ce que semble faire l’exemple fourni dans le plugins dans les SELECT,
    mais j’aimerais afficher une liste directement cliquable des mots clefs « ajoutables »
    comme l’est actuellement celle des mots clef « supprimables » dans l’exemple.
    Cela serait extremement pratique comme mode de recherche.

    Est ce possible ?

    Merci beaucoup

    • oui c’est possible (même si je ne comprend pas tout ce que tu veux). Tu connais un peu ou pas du tout le système de boucles de SPIP ?

    • je connais un peu oui, je me débrouille avec les boucles de base

      pour préciser mon idée :

      • on affiche tous les mots clefs (facile je sais faire)
      • on clique sur l’un d’entre eux
      • la liste des articles ayant se mot clef s’affiche (facile je sais faire)
      • la liste des mots clefs se mets a jour pour ne laisser que les mots clefs supplémentaires également liés aux articles affichés précédemment (là je sèche)

      cas pratique :

      • j’ai 4 mots clefs A, B, C et D
      • 2 articles
        • article 1 mot clef A B
        • article 2 mot clef A C
      • la liste des mots clefs s’affiche : A B C D
      • je clique sur A
      • on m’affiche l’article 1 et 2 et les mots clefs B et C (mais pas D car il ne permet pas d’affiner sa recherche)
      • je clique sur B
      • seul l’article 1 s’affiche et la liste des mots clefs est vide (on est au bout des sélections possibles)
      • une autre liste affiche les mots clefs sélectionnés pour les supprimer d’un clic (comme dans l’exemple fourni avec le plugins)

      Merci

    • Alors il faut que tu stocke dans un tableau (#ARRAY) les id_article associés aux mots déjà sélèctionnés. Puis que tu fasse une boucle mots en prenant comme critère les id_articles de ce tableau.

      Quelquechose du genre :

      #SET{id_articles,#ARRAY}
      <BOUCLE_articles(ARTICLES){mots}>
      #SET{id_articles,#GET{id_articles}|push{#ID_ARTICLE}}
      </BOUCLE_articles>
      
      
      
      <BOUCLE_mots_articles(MOTS){id_article IN #GET{id_articles}}>
      #ID_MOT
      </BOUCLE_mots_articles>
      
      </B_articles>
      <BOUCLE_mots(MOTS)>
      #ID_MOT
      </BOUCLE_mots>
      <//B_articles>
    • merci je vais tester ca

    Répondre à ce message

  • 2

    salut,

    J’ai mis en place un moteur de recherche voir l’image jointe, mais en dehors des mots j’ai un champ input que l’internaute doit remplir. Pour l’instant si je choisis les mots clés j’ai un résultat par contre si je cherche la présence d’un mot dans les titres des articles ou dans les textes en tapant un mot dans le champ input j’ai pas de résultat. Est ce quelqu’un peut m’aider ??

    • les mots qu’on frappe dans le input doivent être cherché parmis les mot clefs ou dans le corps du texte ?

      tu a ton code ?

    • Merci de votre réponse

      finalement ca marche, les mots qu’on frappe dans le input doit cherché dans le corps du texte

      voici quand même le formulaire :

      <form action="spip.php?page=resultat" method="get" >
      		
      						<input name='page' value='resultat' type='hidden' />
      						[<input name='lang' value='(#ENV{lang})' type='hidden' />]
      
      				      
      					  
      					   <!-- la chaine cherchee -->					
      						<input type="text" class="forml" name="recherche" id="recherche-avancee" value="#RECHERCHE"  />	
      	
      
      						<B_g1>
      						<select name="mots[0]">
      						<BOUCLE_g1(GROUPES_MOTS){id_groupe IN 3}>
      						<option value="">#TITRE</option>
      						<BOUCLE_surmot(MOTS){id_groupe}{par multi titre}>
      						<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 4}>
      						<option value="">#TITRE</option>
      						<BOUCLE_surmot2(MOTS){id_groupe}{par multi titre}>
      						<option value="#ID_MOT" [(#ENV{id_mot}|=={#ID_MOT}?{"SELECTED"})]>#TITRE </option>
      						</BOUCLE_surmot2>
      						</select>
      						</BOUCLE_g2>
      						</B_2>
       <input type="submit" class="bouton" value="<:rechercher:>" />
       </form>

      Pour la page resultat :

    Répondre à ce message

  • 4

    Salut tout le monde,
    J’utilise ce plugin pour afficher le resultat de la recherche sur un carte googlemaps, mais jusque là j’ai pas le resultat correcte est ce quelqu’un sy connait et voudrait bien m’aider.

    voici mon formulaire

    <form method="post" name="mot"  action="spip.php?page=resultat">
    <select name="mots[0]">
    <BOUCLE_grr(GROUPES_MOTS){id_groupe=4}>
    [<option value="">#TITRE</option>]
    <BOUCLE_mots5(MOTS) {id_groupe}>
    <option value="#ID_MOT">#TITRE</option>
    </BOUCLE_mots5>
    </BOUCLE_grr>
    </select>
    <select name="mots[1]">
    <BOUCLE_grrr(GROUPES_MOTS){id_groupe=2}>
    [<option value="">#TITRE</option>]
    <BOUCLE_mots6(MOTS) {id_groupe}>
    <option value="#ID_MOT">#TITRE</option>
    </BOUCLE_mots6>
    </BOUCLE_grrr>
    </select>
    			
     <input type="submit" value="<:info_rechercher:>" name="ok">
     </form>

    et voici ce que j’ai sur la page resultat.html

    [(#MODELE{carte_gis}{mots?}{limit=4000}{recherche ?}
    		{latit=-1.990}{lonxit=29.891}{zoom=8}{type=carte}{control_type=oui}{zoom_molette=non}{attente=1})]

    Comme vous le voyez j’ai bien mis mots ? sur l’inclusion du modele de la carte et pourtant j’ai pas les bons resultats. Ou bien cela ne marcherai qu’avec les boucles articles et NON sur une carte googlemaps ???

    PS : sur la carte je dois avoir les articles attachés aux mots clés choisit

    Merci de votre réponse

    • a tu hasard : ton #MODELE est-il appelé dans un fichier lui même inclus. Si oui, lui passe tu correctement l’option mots ?

    • Merci de votre réponse mais je suis toujours dans la galère. Le modèle carte_gis est dans un dossier modele qui se trouve à la racine du plugin gis. Alors je sais que si j’appel le modèle en faisant #MODELEcarte_gis je dois ajouter mots ? ce que j’ai fais mais rien ne marche.

    • je parlais du squelette qui appel #MODELE{carte_gis} : est-il lui même appelé par un autre squelette ?

    • le modele carte_gis est appelé unique dans le squelette resultat.html pour afficher les articles sur la carte. et le squelette resultat est utilisé dans le formulaire
      <form method="post" name="mot"  action="spip.php?page=resultat">
      Alors est ce que je dois passer l’option mots sur "spip.php?page=resultat" ? si oui comment.?

      Merci encore pour votre aide, je ne suis pas bien en dev je me débrouille tout simplement

    Répondre à ce message

  • 3

    Bonjour tout le monde,

    J’utilise un formulaire, j’affiche 3 groupes et chaque groupe a ses propres mots clés. Mais je ne sais ce qu’il faut faire (quelle boucle) pour afficher les resultats correctement.
    1/ si on choisit un mot clé que les articles attaché a ce mot s’affichent
    2/ si on choisit deux mots clés qu’on ai la liste des articles qui sont attachés a ces deux mots clé(uniquement) sinon rien ....etc etc
    voici le code qui affiche mon formulaire :

    <form method="post" name="mot"  action="spip.php?page=recherche2">
    <select name="mots[0]">
    <BOUCLE_gr(GROUPES_MOTS){id_groupe=2}>
    [<option value="N">#TITRE</option>]
    <BOUCLE_mots4(MOTS){id_groupe}>
    <option value="#ID_MOT">#TITRE</option>
    </BOUCLE_mots4>
    </BOUCLE_gr>
    </select>
    
    <select name="mots[1]">
    <BOUCLE_grr(GROUPES_MOTS){id_groupe=3}>
    [<option value="N">#TITRE</option>]
    <BOUCLE_mots5(MOTS) {id_groupe}>
    <option value="#ID_MOT">#TITRE</option>
    </BOUCLE_mots5>
    </BOUCLE_grr>
    </select>
    
    <select name="mots[2]">
    <BOUCLE_grrr(GROUPES_MOTS){id_groupe=4}>
    [<option value="N">#TITRE</option>]
    <BOUCLE_mots6(MOTS) {id_groupe}>
    <option value="#ID_MOT">#TITRE</option>
    </BOUCLE_mots6>
    </BOUCLE_grrr>
    </select>
    
    <input type="submit" value="Submit" name="ok">
    </form>

    dans la page recherche2 j’ai ca :

        <ul>
        <BOUCLE_articles1(ARTICLES){mots?}>
    		  <li><a href="#URL_ARTICLE">#TITRE</a></li>
    		</BOUCLE_articles1>
         </ul>

    mais j’ai pas le resultat que je cherche, surtout pour les 2 point que j’ai cité en haut par contre si je choisis 3 mots clé ,s’ils ont un article commun il s’affiche

    Merci de votre aide

    • Je pense qu’il faudrait que vous ne mettiez pas de value à la balise option affichant le titre des groupes.

    • Bonjour,
      J’ai une question suivant cette logique....Et si ma recherche se limiter dans une rubrique ??? parce qu’ avec ce formulaire la recherche se fait dans tout le site mais je me demande si on devait se limiter dans une seule rubrique ?
      j’ai essayé de changer la boucle du resultat comme ca mais sans succer :

       
      <ul>
         <BOUCLE_articles1(ARTICLES){mots?}{id_rubrique}>
                        <li><a href="#URL_ARTICLE">#TITRE</a></li>
                      </BOUCLE_articles1>
          </ul>

      Merci de votre réponse

    • si votre boucle n’est pas dans un boucle rubriques, il ne va pas savoir de quelle rubrique on parle.

      il faudrait que vous mettiez

      {id_rubrique=NNN} où NNN est le numéro de la rubrique.

      Il faudrait pour plus détail le contexte de boucle.

    Répondre à ce message

  • 6

    Bonjour,

    étant débutant sur spip, je n’ai pas bien compris comment marche le plugin critères.

    Mon objectif : sur ma page articles, avoir une zone « voir aussi » avec des articles partageant des mot clés avec l’article courant.

    Un bout de code-test où j’essaye d’ afficher le titre des articles ayant les mots clés n°33 et 30)

    #SET{mots, #ARRAY{0,33,1,30}
    <BOUCLE_articles(ARTICLES){mots}>
    #TITRE
    </BOUCLE_articles>

    Rien ne passe et dans le debug de spip j’obtiens ceci pour le résultat de la boucle :

    SELECT articles.id_article, articles.titre, articles.id_rubrique, articles.lang
    FROM spip_articles AS <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YXJ0aWNsZXM8L2NvZGU+"></span>
    WHERE (articles.statut = 'publie')
    	AND 0=1

    Merci beaucoup pour votre aide

    • Bon,

      c’est expliqué dans la documentation, mais je reprend.

      <BOUCLE_articles(ARTICLES){mots}>

      En l’état, cela va utiliser le tableau mots passés en Environnement (voir mon article sur la balise #ENV), là vous avez mis non dans un tableau d’environnement mais dans une variable de type SET / GET.

      Suiant le manuel dans la partie « les paramètres supplémentaires », vous devez passer un tableau en 3 paramètre.

      Ce qui donne :

      #SET{mots, #ARRAY{0,33,1,30}}
      <BOUCLE_articles(ARTICLES){mots 100% #GET{mots}}>
      #TITRE
      </BOUCLE_articles>
    • Tout marche ! Merci beaucoup pour l’aide et ce plugin !

      Dernières question:s

      Dans la boucle

      Si je rajoute en critères 0,5, les articles listés seront affichés dans quel ordre ? au hazard ?
      Existe-t-il une astuce pour que les 5 articles listés soient triés des plus « similaires » aux moins similaires ?

      Clem

    • par défaut les articles seraient triés par identifiant (numero).

      vous pouvez utiliser n’importe quel filtre de tri de SPIP.

      Par contre, pour « du plus similaire au moins similaire » je vois pas, ne comprenant pas ce que vous entendez par « similaire ».

    • Un exemple pour ilustrer le mot « similaire »

      Un article A possède ces mots clés :
      -  toto
      -  blibli
      -  blabla

      Un article B possède ces mots clés :
      -  toto
      -  blibli
      -  dsqgcdsqg

      Un article C possède ces mots clés :
      -  toto
      -  sdbsdh
      -  hgsqjdgsd

      L’article B est « similaire » à 66% avec l’article A
      L’article C est « similaire » à 33% avec l’article A

      Existe-t-il un critère de tri ou une astuce pour mettre l’article B en premier et l’article C en deuxième ?

    • désolé, là comme cela je ne vois pas.

      il faudrait que je creuse le SQL pour améliorer le plugins, mais je crois pas avoir le tps :(

    • Dommage :/ Tant pis on fera de l’aléatoire, ça marchera déjà très très bien.
      Encore merci pour ce joli plugin !

    Répondre à ce message

  • 1

    Bonjour
    j’ai un pb sur ff
    quand je clique sur un mot clé j’ai un « noajax » qui apparait...
    sur ie ça passe nickel !!

    quelqu’un pourrait il m’aider ?

    merci pour vos réponse

    • faut enlever « refuser_traiter_formulaire_ajax() ; » dans la fonction function « formulaires_recherche_par_mots_traiter_dist($filtre_groupes = null, $url_resultat = null) »
      du dossier « recherche_par_mots.php »

    Répondre à ce message

  • 1
    patrice47310

    Bonjour,
    Merci pour votre réponse.
    En fait je dois essayer d’adapter ce plugin à notre besoin.
    Nous devons mettre en place une recherche guidée multicritère
    PUBLIC et TYPE-DOCUMENT et THEMATIQUE
    le probléme c’est que THEMATIQUE à environ 230 entrées hiérachisées et nous pensons que cela ne sera pas pratique si l’utilisateur choisi THEMATIQUE (trop long).
    Donc j’ai d’abord dissocié les thématique pour faire un pré-filtre en créant deux groupes de mots cles THEMATIQUES et SOUS-THEMATIQUES
    Malheureusement, à l’indexation un l’article peut associé à plusieurs thematiques et sous thematiques (exemple : j’indexe un article aux thématiques DROIT et HISTOIRE puis aux sous-thematiques DROIT PENAL et HISTOIRE DE LA JUSTICE .
    A la recherche si je sélectionne la thematique DROIT puis le groupe sous-thematique alors je retrouve DROIT PENAL et HISTOIRE DE LA JUSTICE.
    je souhaiterai avoir uniquement les sous thematique liées au DROIT.
    C’est pour cette raison que j’ai supprimé le groupe sous-thematique et j’ai crée des groupes ayant le même nom que les mots clé du groupe themathiqueTHEMATIQUE.
    Je souhaiterai que lorsque je sélectionne un mot du groupe thématique exemple « histoire »,
    qu’il apparaisse dans la deuxième liste déroulante le contenu du groupe « histoire ».
    cela permettrai de liér les groupes avec une hiérachisation
    j’espère avoir été plus clair ?
    Je vais essayer de voir si je peux faire quelque chose avec ce que vous m’avez donnée.
    Si quelqu’un a des idées je suis preneur !
    Merci

    • heu .... je crois avoir compris.

      Bon, ce que je vous ait proposé devrait le faire (a vous d’entourer cela des bonnes balises html)

      par contre pour que les changements se fasse dynamiquent (ID : sans avoir à valider lors de la selection du groupe) il faut faire du js je pense ... et ca je suis pas très doué.

    Répondre à ce message

  • 1
    patrice47310

    Bonjour,

    Je dois mettre en place une recherche guidé, j’ai installé le plugins et je le trouve génial.
    Avec ce plugins nous ne pouvons pas faire de recherche infructueuse.
    Néanmoins, nous avons des groupes de mots clé hiérarchisés.
    Donc pour la faire, j’ai créé un groupe thématique avec les mots suivants :
    droit
    histoire
    management
    puis j’ai créé les groupes droit, histoire, management.
    Je souhaiterai que lorsque je sélectionne un mot du groupe thématique exemple « histoire »,
    qu’il apparaisse dans la deuxième liste déroulante le contenu du groupe « histoire ».
    cela permettrai de liér les groupes avec une hiérachisation
    Avez vous des idées ?

    • Hum, cela n’a pas grand chose a voir avec le plugin. Nez en moins

      Je crois qu’il y a une contribution de « mot clef hierarchique » qui permettrai de faire cela plus simplement (en évitant par exemple d’avoir des mots pas orthographiés tt à fait de la même manière que le groupe correspondant).

      Sinon une boucle

      <BOUCLE_mots(MOTS)>
      <BOUCLE_groupe_n2(GROUPES_MOTS){titre=#TITRE}>
      #TITRE
      </BOUCLE_groupe_n2>
      </BOUCLE_groupe_n1>

      et si vous voulez faire cela de manière recursive

      <BOUCLE_mots(MOTS){id_groupe ?}>
      <BOUCLE_groupe_n2(GROUPES_MOTS){titre=#TITRE}>
      #TITRE
      <BOUCLE_rec(Boucle_mots) />
      </BOUCLE_groupe_n2>
      </BOUCLE_groupe_n1>

    Répondre à ce message

  • 2

    Bonjour,

    Merci pour ce plugin bien pratique. J’ai cependant un petit souci : quand je fais cette boucle :

    <BOUCLE_articles(ARTICLES) {id_rubrique=1} {pagination 50} {mots?}>

    La pagination ne donne pas les bons résultats dans le cas ou le critère « mots » est vide

    Dans cette rubrique, il y a 149 articles. le #TOTAL_BOUCLES m’en donne 50 et la pagination est 0 | 50 | 100

    Une idée ?

    Merci ++

    • il faut distinguer :
      -  #TOTAL_BOUCLE qui donnent le nombre d’élement retourné par la boucle en fonction de la pagination (ici 50)
      -  #GRAND_TOTAL qui lui donne le nombre sans tenir compte du résultat (ic 149)

      voir la doc sur la pagination sur spip.net

    • Merci ! On en découvre tous les jours avec Spip ;)

    Répondre à ce message

  • 1

    Bonjour,

    Il y a une erreur dans le squelette parmots.html du plugin Critère mots. Il faudrait écrire <INCLURE{fond=contenu/page-parmots}{env}> et non pas <INCLURE{fond=contenu/page-mots}{env}>.

    Merci pour ce plugin.

    Répondre à ce message

  • 3

    Bonjour,

    je viens vers vous suite à un problème avec le plugin..
    j’ai une erreur après l’envoi du formulaire (j’utilise un SPIP 2.0.10, mais pas le formulaire du zip)
    Mon formulaire reprend les mots clé de chaque groupe, en affichant « Tous » en premier puis les autres mots en ordre alphabétique.

    Voici l’erreur :

    <BOUCLE_articles1>()
    Erreur SQL
    articles.id_article, articles.titre, articles.lang FROM spip_articles AS <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YXJ0aWNsZXM8L2NvZGU+"></span> WHERE (articles.statut = 'publie') AND (articles.date < '9999-12-31') AND articles.id_article IN ( SELECT id_article FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcGNvbnQ8L2NvZGU+"></span>.spip_mots_articles WHERE id_mot=13 OR id_mot=14 OR id_mot=27 OR id_mot=26 GROUP BY id_article HAVING SUM(1) >= 4 )
    You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT id_article FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bGNtczwvY29kZT4="></span>.spip_mots_articles WHERE id_mot=1

    Et mon formulaire est le suivant :

       <form action="spip.php?page=recherche2" method="get">
        <div>
        <input type="hidden" value="recherche2" name="page" />
    	[<input type="hidden" name="lang" value="(#ENV{lang})" />]
    	<table>
      <tr><td><:info_rechercher_02:></td>
      <td><input type="text" class="text" size="10" name="recherche" id="recherche"[ value="(#ENV{recherche})"] accesskey="4" /></td></tr>
    	
      <B_lang>
      <tr><td>
      	Langue
      </td><td>
      	<select name="mots[0]" id="mots-0">
      	  <option value="13" selected='selected'>Toutes</option>
      		  <BOUCLE_lang(MOTS){id_groupe=3}{id_mot!=13}{par titre}>
      		    <option value="#ID_MOT" [(#ID_MOT|=={13}?{"selected='selected'"})]>#TITRE</option>
      	   </BOUCLE_lang>
      	</select>
      </td></tr>
      </B_lang>
      
      
      <!-- Niveau -->
      <B_surmot>
      <tr><td>
        Niveau
      </td><td>
      	<select name="mots[1]" id="mots-1">
      	  <option value="14" selected='selected'>Tous</option>
        <BOUCLE_surmot(MOTS){id_groupe=1}{id_mot!=14}{par titre}>
      		<option value="#ID_MOT" [(#ID_MOT|=={14}?{"selected='selected'"})]>#TITRE</option>
      	</BOUCLE_surmot>
      </select>
      </td></tr>
      </B_surmot>
      
        <!-- Ressource -->
      <B_ressource>
      <tr><td>
        Ressource
      </td><td>
      	<select name="mots[2]" id="mots-2">
      	  <option value="28" selected='selected'>Toutes</option>
        <BOUCLE_ressource(MOTS){id_groupe=4}{id_mot!=28}{par titre}>
      		<option value="#ID_MOT" [(#ID_MOT|=={28}?{"selected='selected'"})]>#TITRE</option>
      	</BOUCLE_ressource>
      </select>
      </td></tr>
      </B_ressource>
      
      <!-- Theme -->
      <B_theme>
      <tr><td>
        Theme
      </td><td>
      	<select name="mots[2]" id="mots-2">
      		<option value="27" selected='selected'>Tous</option>
      	<BOUCLE_theme(MOTS){id_groupe=5}{id_mot!=27}{par titre}>
      		<option value="#ID_MOT" [(#ID_MOT|=={27}?{"selected='selected'"})]>#TITRE</option>
      	</BOUCLE_theme>
      </select>
      </td></tr>
      </B_theme>
    
      <B_typecomp>
      <tr><td>
       Type de compétence
      </td><td>
      	<select name="mots[3]" id="mots-3">
      		<option value="26" selected='selected'>Tous</option>
      	<BOUCLE_typecomp(MOTS){id_groupe=2}{id_mot!=26}{par titre}>
      		<option value="#ID_MOT" [(#ID_MOT|=={26}?{"selected='selected'"})]>#TITRE</option>
      	</BOUCLE_typecomp>
      </select>
      </td></tr>
      </B_typecomp>
      </table>
    
      <input type="submit" class="submit" value="&gt;&gt;" title="<:info_rechercher:>" />
    	
    </div></form>
    	

    et sur ma page de résultat de la recherche je n’ai que ca impliquant le critère mots :

        <ul>
        <BOUCLE_articles1(ARTICLES){mots?}>
    		  <li><a href="#URL_ARTICLE">#TITRE</a></li>
    		</BOUCLE_articles1>
         </ul>

    Auriez-vous une idée ?

    • quel version de mysql utilisez vous (aller dans /ecrire/ ?exec=info pour savoir). On a déja eu des erreurs de ce type sur des version 4 de Mysql. Le plugin nécéssite des versions 5.

      si ce n’est pas ça, confirmez, on ira chercher l’erreur plus loins.

    • mysql
      MySQL Support	enabled
      Active Persistent Links 	0
      Active Links 	1
      Client API version 	4.0.25
      MYSQL_MODULE_TYPE 	none
      MYSQL_SOCKET 	/tmp/mysql.sock
      MYSQL_INCLUDE 	no value
      MYSQL_LIBS 	no value

      Effectivement ça doit etre ça...
      une mise à jour devrait faire l’affaire ?

      merci d’avance ;)

    • Après un test, effectivement, ca marche !

      Merci !

    Répondre à ce message

  • 7

    ça à l’air super, je vais tester cela. Savez vous si il est possible de créer des « dépendances » ?
    Par ex ai un groupe de mots clés pays (avec tous les pays en mot clé) et un groupe « villes » (avec les villes en mot clé). L’idéal serait que lorquon sélectionne « France » une deuxième liste déroulante se recharge pour afficher les villes de France. Faisable ? Merci

    • sans doute ... mais bon j’ai pas toute les compétences. Par contre, cherche je crois qu’il y a plugin « geographie » qui liste l’ensemble des villes / pays etc.

      je sais pas s’il est documenté par contre ...

    • Non, en l’état, tu peux faire un groupe France avec des villes et un groupe Allemagne avec d’autres villes.

    • Ok merci ! Dernière question vu que ne lai pas encore testé à fond. Si jai une liste d’articles, puis je utiliser ce plugin pour les trier selon 2 groupes de mots clés par ex ? AInsi jarrive sur la rubrique, je vois tous les articles, mais les sélecteurs en haut me remplaceraient ma liste par celle « filtré » par les mots clés. Si cest possible cest trop bien. Si cest le cas auriez vous un bout de code sur lequel morienter ? Merci infiniment !!

    • C’est le but justement de ce plugin !

      En ce qui concerne le code, si vous connaissez le système de boucle de spip, la doc devrait faire l’affaire non ?

      vous pouvez tester par exemple avec le formulaire intégré par RealET. Sinon vous avez d’autre exemple dans le plugin « collezion ».

    • ok merci, je vais regarder tout ça !

    • hello, dans les exemples la recherche se fait sur une liste darticles non affichés qui s’affichent selon les mots clés et ne trouve pas comment faire pour que le tri se fasse sur la liste d articles qui est présentée. Il faudrait que la page se recharge et ne montre que les articles liés aux mot/mots clés choisis. Une piste ?

    • mettre tes balise dans un include que tu appel en ajax.

      (voir la doc de spip pour l’ajax)
      et mettre un ? dans le critère mots pour tout afficher au départ.

    Répondre à ce message

  • 5

    (premièrement, je m’excuse pour mon français terrible, c’est ma troisième langue ; en plus, j’ai pas beaucoup d’expérience avec SPIP, alors, aye pitié, s’il vous plait... :-) )

    J’ai essayé d’utiliser ce plugin, mais je n’ai pas réussi...

    Ce que je veux faire est très simple, je pense : je veux donner la possibilité à l’utilisateur de ma formulaire de choisir s’il/elle veut utiliser tous les mots-clés (« AND ») ou au moins un des ceux qu’il/elle a choisis (« OR »). J’ai ajouté une variable « GET » à l’URL (« &id_mot_type=1 » vs. « &id_mot_type=100%25 »), et j’essaye de l’utiliser avec :

    <BOUCLE1(ARTICLES){...}{mots? #ENV{id_mot_type, 1}}{...}

    Ça ne fonctionne pas, même si

    <BOUCLE1(ARTICLES){...}{mots? 1}{...}
    <BOUCLE1(ARTICLES){...}{mots? 100%}{...}

    font ce que je veux, et utiliser #ENV{id_mot_type} ailleurs dans le squelette fonctionne bien.

    J’ai ajouté une petite chose de « logging » dans inc_prepare_mots_dist, et il semble que « score » est toujours vide. Je suis bien sûr que j’ai fait quelque bêtise, mais je ne le vois pas... J’apprécierais toute l’aide que vous pourrez me donner... :-)

    • Bonjour,

      attention :
      -  id_mot_type doit être un tableau : mettez id_mot_type[0]=1&id_mot_type[1]=x dans votre url (d’ailleur je n’ai pas compris votre « &id_mot_type=1 » vs. « &id_mot_type=100%25 »
      -  je ne suis pas sûr que le ? soit pertinent, mais là il faudrait que je révise ma syntaxe spip
      -  vous voulez au moins 1 mot ? : une syntaxe du type (ARTICLES){mots 1 #ENV{id_mot_type}} devrai faire l’affaire

    • Bonjour,

      Je pense que je n’ai pas exprimé mes intentions très clairement... Je vais essayer encore !

      Dans le même squelette, je veux avoir la possibilité de specifier que :

      1. des résultats dans la boucle ont au moins 1 des mots-clés, ou
      2. des résultats dans la boucle ont tout les mots-clés specifiés.

      Si j’ai bien compris, cela est possible avec le « score » paramètre : on peut mettre « 1 » pour exiger que des résultats ont au moins 1 des mots-clés, et « 100% » pour exiger qu’ils ont tout les mots-clés. Est-ce que c’est correcte ?

      En plus, je veux que, si l’utilisateur n’a pas specifié aucun mot-clé, que ce critère fait rien du tout. Si j’ai bien compris, cela devoir être possible avec le «  ? » (alors {mots?} au lieu de {mots})

      Alors, au lieu d’avoir un score fixé dans le squelette, je veux utiliser une paramètre specifié par l’utilisateur (en réalité sur le formulaire, c’est un bouton radio, mais ce n’est pas important) pour le score. Je pense que votre suggestion d’utiliser un tableau est pour le cas ou je veux utiliser un autre tableau des mots-clés, mais c’est pas ça que je veux faire. Peut-être le nom de la paramètre que j’ai utilisé n’est pas très clair... Je veux quelque chose comme :

      {mots? #ENV{mots_score}}
    • merci, c’est plus clair !

      je viens de faire des test : je pense que le problème est l’endroit où vous placiez le ?

      {mots ?#ENV{mots_score}

      devrait faire l’affaire
      pouvez vous tester et conformer ?

    • et bien non, j’ai dit une betise... je pense en fait que le ? n’est possible que pour des critères lié a des élement de bdd. du genre tester la valeur d’une table.

      Une laternative pour vous : installer spip-bonux. Et faire une boucle condition qui test la présence de #ENVmots. Si #ENVmots est présent, faire la boucle. Sinon faire une autre boucle

    • En fait, placer le ? juste à coté de l’#ENV fonctionne ! Je ne comprend pas pourquoi, mais, merci beaucoup ! :-)

    Répondre à ce message

  • 7

    Bonjour

    Je viens d’installé en local, pour me faire la main, le squelette collection et j’ai installé tous les plugins recommandés .

    Pourtant, j’ai un défaut que je ne sais pas corriger . Ca m’indique

    Deprecated  : Call-time pass-by-reference has been deprecated in C :\wamp\www\spip-collection\plugins\critere_mots\critere_mots_fonctions.php on line 47

    Deprecated : Call-time pass-by-reference has been deprecated in C :\wamp\www\spip-collection\plugins\critere_mots\critere_mots_fonctions.php on line 50

    comme erreur.

    J’ai donc cherché ces lignes et elles indiquent ça :

    pour la ligne 47 :

    critere_mots_dist($idb, &$boucles, $crit,’id’) ;

    et pour la ligne 50 :

    critere_mots_dist($idb, &$boucles, $crit,’titre’) ;

    Qu’est-ce qui cloche ?

    Merci pour l’éventuelle réponse

    • heu, ma version PHP = 5.3.0

    • Bonjour, désolé de ce message tardif.

      Comme le dit le code, c’est un problème de syntaxe dépassé. Mais malheureusement je n’ai pas le moyen pour le moment de corriger cela. Pour contourner le problème, vous pouvez mettre dans votre php.ini

      allow_call_time_pass_reference = on

      ceci dit c’est le masqué, non le résoudre

    • numismeuros

      personne ne peut me répondre ?

    • numismeuros

      mettre dans votre php.ini

      heu...c’est quoi ça ?

    • numismeuros

      voilà ce que j’ai dans php.ini :

       ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
       ; Quick Reference ;
       ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
       ; The following are all the settings which are different in either the production
       ; or development versions of the INIs with respect to PHP’s default behavior.
       ; Please see the actual settings later in the document for more details as to why
       ; we recommend these changes in PHP’s behavior.

       ; allow_call_time_pass_reference
       ; Default Value : On
       ; Development Value : Off
       ; Production Value : Off

       ; display_errors
       ; Default Value : On
       ; Development Value : On
       ; Production Value : Off

       ; display_startup_errors
       ; Default Value : Off
       ; Development Value : On
       ; Production Value : Off

       ; error_reporting
       ; Default Value : E_ALL & E_NOTICE
       ; Development Value : E_ALL | E_STRICT
       ; Production Value : E_ALL & E_DEPRECATED

       ; html_errors
       ; Default Value : On
       ; Development Value : On
       ; Production value : Off

       ; log_errors
       ; Default Value : Off
       ; Development Value : On
       ; Production Value : On

       ; magic_quotes_gpc
       ; Default Value : On
       ; Development Value : Off
       ; Production Value : Off

       ; max_input_time
       ; Default Value : -1 (Unlimited)
       ; Development Value : 60 (60 seconds)
       ; Production Value : 60 (60 seconds)

       ; output_buffering
       ; Default Value : Off
       ; Development Value : 4096
       ; Production Value : 4096

       ; register_argc_argv
       ; Default Value : On
       ; Development Value : Off
       ; Production Value : Off

       ; register_long_arrays
       ; Default Value : On
       ; Development Value : Off
       ; Production Value : Off

       ; request_order
       ; Default Value : None
       ; Development Value : « GP »
       ; Production Value : « GP »

       ; session.bug_compat_42
       ; Default Value : On
       ; Development Value : On
       ; Production Value : Off

       ; session.bug_compat_warn
       ; Default Value : On
       ; Development Value : On
       ; Production Value : Off

       ; session.gc_divisor
       ; Default Value : 100
       ; Development Value : 1000
       ; Production Value : 1000

       ; session.hash_bits_per_character
       ; Default Value : 4
       ; Development Value : 5
       ; Production Value : 5

       ; short_open_tag
       ; Default Value : On
       ; Development Value : Off
       ; Production Value : Off

       ; track_errors
       ; Default Value : Off
       ; Development Value : On
       ; Production Value : Off

       ; url_rewriter.tags
       ; Default Value : « a=href,area=href,frame=src,form=,fieldset= »
       ; Development Value : « a=href,area=href,frame=src,input=src,form=fakeentry »
       ; Production Value : « a=href,area=href,frame=src,input=src,form=fakeentry »

       ; variables_order
       ; Default Value : « EGPCS »
       ; Development Value : « GPCS »
       ; Production Value : « GPCS »

      donc apparement c’est déjà sur « ON »

    • non, vu qu’il y a le ; devant, qui signifie commentaire

    • numismeuros

      Voilà comment j’ai rectifié, mais ça me mets toujours le message bien que j’ai vidé le « cache ».

       ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
       ; Quick Reference ;
       ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
       ; The following are all the settings which are different in either the production
       ; or development versions of the INIs with respect to PHP’s default behavior.
       ; Please see the actual settings later in the document for more details as to why
       ; we recommend these changes in PHP’s behavior.

      allow_call_time_pass_reference
       ; Default Value : On
       ; Development Value : Off
       ; Production Value : Off

       ; display_errors
       ; Default Value : On
       ; Development Value : On
       ; Production Value : Off

       ; display_startup_errors
       ; Default Value : Off
       ; Development Value : On
       ; Production Value : Off

      Bon c’est pas grave si ça ne fait ça qu’en local. Je vais tester en ligne et on verra ce que ça donne .
      Merci tout de même

    Répondre à ce message

  • 5
    Guillaume

    Bonjour,
    je cherche à intégrer ce plugin à Zpip. Est-ce que quelqu’un pourrait m’expliquer la marche à suivre ?
    merci
    Guillaume (un débutant)

    • que cherchez vous à obtenir sur ZPIP ? connaissez vous un peu le langage SPIP ou pas ?

    • Bonjour,
      en fait, j’ai associé des mots clés à des articles : un pour le lieu géographique de l’article et un pour la date. Et j’aimerai associer les deux. Le but serait d’afficher sur une page les articles qui correspondent à ces deux critères. Par exemple : Alsace et avril 2010. Le tout me permettrait de simplifier la navigation sur le site où il y a beaucoup d’articles.
      je connais la base du langage spip mais je ne pense pas être en mesure de modifier tout seul ce squelette.
      merci à vous pour votre aide
      Guillaume

    • bonjour,

      je pense qu’avec les ajouts fait par Real3t il doit être assez simple de proposer une page zpip pour cela. malheureusement je n’ai pas le tps de regarder aujourd’hui. Je regarderai cela demain et vous tiens au courant.

    • en fait finalement j’ai eu le tps de regarder. Je viens de faire un commit. Attendons 14 h la nouvelle version. Installez là, puis aller sur votresite/ ?page=parmots

      vous devrez avoir le formulaire proposé par Real3T

      cordialement

    • un grand merci à vous, ça fonctionne.
      Bonne continuation
      Guillaume

    Répondre à ce message

  • Le dernier script convient parfaitement à l’affichage des mots-clés que je souhaitais. Grâce à «  id_mot IN #ENVmots> »...

    Bravo pour ce plugin très intéressant que je réemploierai souvent et merci pour votre aide.

    Répondre à ce message

  • 1

    En effet, de même que l’affichage des articles trouvés grâce à la sélection des mots-clés dans le formulaire, peut-on lister ces derniers et les afficher en même temps que les résultats ?

    Ex : http://www.midi-pyrenees.ecologie.gouv.fr/spip.php?page=rubrique&id_rubrique=341

    Là je sèche un peu...

    • ben j’ai mis ce qu’il faut non ?

      <BOUCLE_mots(MOTS){id_mot IN #ENV{mots}}>
      #TITRE
      </BOUCLE_mots>

    Répondre à ce message

  • 1

    Merci pour cet éclaircissement. Effectivement, cela fonctionne !

    Voici le code utilisé pour récupérer ces mots-clés pour l’affichage des articles concernés :

    <B_articles>
    <ul>
    #SET{mots, #ARRAY}
    <BOUCLE_articles(ARTICLES){mots}{pagination 10}>
    <li><a href="#URL_ARTICLE">#SET{mots,[(#GET{mots}|foreach)]#TITRE XXX</a></li>
    </BOUCLE_articles>
    </ul>
    </div>
    </B_articles>

    Par contre, je sèche sur l’affichage simple de ces mots-clés...

    Une idée ?

    • qu’entendais vous par « affichae simple de ces mot clef » ? juste les lister ?

      <BOUCLE_mots(MOTS){id_mot IN #ENV{mots}}>
      #TITRE
      </BOUCLE_mots>

    Répondre à ce message

  • Juste une rectification du bout de code (sans pagination) :

    <B_articles>
    <ul>
    #SET{mots, #ARRAY}
    <BOUCLE_articles(ARTICLES){mots}>
    <li><a href="#URL_ARTICLE">#SET{mots,[(#GET{mots}|foreach)]#TITRE XXX</a></li>
    </BOUCLE_articles>
    </ul>
    </div>
    </B_articles>

    Répondre à ce message

  • 2

    Bonjour,

    J’ai un formulaire composé de 3 listes de groupes de mots-clés , chaque liste ayant ses mots-clés. Je souhaite obtenir les articles ayant au moins un mot-clé de chaque liste. Ce formulaire ne fonctionne qu’avec la dernière sélection et non les trois.

    ex :

    <B_mots>
    <form method="post" name="mot"  action="spip.php?page=mot">
    <div>
    <label for="zone">Choisir une zone :</label>
    <br />
    <select name="id_mot">
    <BOUCLE_mots4(MOTS) {type=zone}>
    <option value="#ID_MOT">#TITRE</option>
    </BOUCLE_mots4>
    </select>
    </div>
    <div>
    <label for="zone">Choisir un centre :</label>
    <br />
    <select name="id_mot">
    <BOUCLE_mots5(MOTS) {type=centre}>
    <option value="#ID_MOT">#TITRE</option>
    </BOUCLE_mots5>
    </select>
    </div>
    <div>
    <label for="zone">Choisir une formation :</label>
    <br />
    <select name="id_mot">
    <BOUCLE_mots6(MOTS) {type=formations}>
    <option value="#ID_MOT">#TITRE</option>
    </BOUCLE_mots6>
    </select>
    </div>
    <input type="submit" value="Submit" name="ok">
    </form>
    </B_mots>

    Comment récupérer les choix de mots-clés des 3 listes dans mon formulaire pour une recherche multi-critère ?

    Merci de votre aide.

    • bonjour,
      il est assez logique que cela ne fonctionne qu’avec le dernier mot, étant donné que chaque select renvoie une valeur pour « id_mot ».

      En fait il faut que votre formulaire renvoi un tableau contenant les valeurs des listes. Pour cela, il suffit de mettre les clefs (=entrée) du tableau entre crochet.

      Ce qui donne

      <B_mots>
      <form method="post" name="mot"  action="spip.php?page=mot">
      <div>
      <label for="zone">Choisir une zone :</label>
      <br />
      <select name="id_mot[0]">
      <BOUCLE_mots4(MOTS) {type=zone}>
      <option value="#ID_MOT">#TITRE</option>
      </BOUCLE_mots4>
      </select>
      </div>
      <div>
      <label for="zone">Choisir un centre :</label>
      <br />
      <select name="id_mot[1]">
      <BOUCLE_mots5(MOTS) {type=centre}>
      <option value="#ID_MOT">#TITRE</option>
      </BOUCLE_mots5>
      </select>
      </div>
      <div>
      <label for="zone">Choisir une formation :</label>
      <br />
      <select name="id_mot[2]">
      <BOUCLE_mots6(MOTS) {type=formations}>
      <option value="#ID_MOT">#TITRE</option>
      </BOUCLE_mots6>
      </select>
      </div>
      <input type="submit" value="Submit" name="ok">
      </form>
      </B_mots>
    • par ailleur, pour que la recherche multi critères fonctionne bien, il faudrait que vous remplaciez dans le code que je vous ai fourni

      -  id_mot[0] par mots[0]
      -  id_mot[1] par mots[1]
      etc, etc.

    Répondre à ce message

  • 10

    Bonjour,
    je veux utiliser votre plugin, seulement j’ai une erreur...
    J’ai une page avec des listes déroulantes et une page de résultat.
    L’envoi des id des mots clé est bien passé d’une page à l’autre( /spip.php ?page=recherche2&recherche=test&mots[0]=9&mots[1]=1&mots[2]=16&mots[3]=4 ) mais une fois sur ma page de résultat, j’ai cete erreur :

    Erreur(s) dans le squelette
    <BOUCLE_articles1>()
    Erreur SQL
    articles.id_article, articles.popularite, articles.titre, articles.date, articles.lang FROM spip_articles AS <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YXJ0aWNsZXM8L2NvZGU+"></span> WHERE (articles.statut = 'publie') AND (articles.date < '9999-12-31') AND articles.id_article IN ( SELECT id_article FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcGNvbnQ8L2NvZGU+"></span>.spip_mots_articles WHERE id_mot=9 OR id_mot=1 OR id_mot=16 OR id_mot=4 GROUP BY id_article HAVING SUM(1) >= 4 ) ORDER BY articles.popularite DESC
    You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT id_article FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bGNtczwvY29kZT4="></span>.spip_mots_articles WHERE id_mot=9
    </BOUCLE_articles1> 

    La boucle sur ma page de résultat est la suivante :

    <BOUCLE_articles1(ARTICLES){mots} {par popularite}{inverse} {pagination 10}>
              <li>
              <h3><a href="#URL_ARTICLE">#TITRE</a></h3>
              <small>[(#DATE|affdate_jourcourt)][, <:par_auteur:> (#LESAUTEURS)]</small></li>
            </BOUCLE_articles1>
    		     </ul>

    En passant par le « calcul » du debug, j’ai cette erreur lors de la requete sur l’id_rubrique :
    Comment        Impossible WHERE noticed after reading const tables

    Voilà, si vous avez une idée, merci d’avance ;)
    Je ne vois pas où peut être le problème...

    • Pour info, j’utilise la version 2.0.10 de spip

    • avez vous autre choses ? pouvez vous regarder avec phpmyadmin a quoi correspon ce spipcont ? avez vous modifié des constante de spip ?

    • ps : j’ai testé en local et n’ai pas de pb. donc je me dis que peut-être votre conf de spip est différente. mais où ?

    • J’ai désactivé tout les plugins sauf celui-ci, et cela ne fonctionne pas mieux...
      Mon Type d’adresses URL est « page — spip.php ?article12 »

      Sinon je n’ai malheureusement pas accès a la BDD... mais en refaisant des test je ne vois plus ce « spipcont »... étrange, il venait d’ou ?! :)

      C’est peut etre mon formulaire de recherche qui a un problème... je l’ai copier ici : http://tinypaste.com/36f91

    • hum, qu’obtenez vous alors comme message ? si vous n’avez plus ce spip-cont.

    • MSG EDITE (mauvais copier coller) :

      URL : spip.php ?page=recherche2&recherche=test&mots[0]=9&mots[1]=14&mots[2]=19&mots[3]=12&var_mode=recalcul

      Edit : bizarre il a l’air de rajouter ici le spipcont ... voici mon résultat en bas : http://tinypaste.com/7b359

    • et bien il y est tjr le ’spipcont’

    • J’ai modifié mon message précédent pour coller le texte (il rajoutait ici le spipcont... bizarre...)
      J’ai pu acceder a la BDD... j’ai phpMyAdmin 2.6.4-pl3 et MySQL 4.0.2...

      Quand je passe par débug, et resultat sur la boucle articlemots, il me mets cette requete que j’execute directement dans phpmyadmin et donne cette erreur : http://tinypaste.com/32c6a

    • hum, je ne suis pas un spécialiste de MySQL, mais je soupçonne une version trop veille de Mysql.

      Peut tu tester en local avec une version récent ?( par exemple mon MAMP me donne une version 5)

      ps : pour le pastebin, utilise plutot http://spip.pastebin.fr ou http://spip.pastebin.com

    • Effectivement, en local cela a l’air de marcher...

      Version du client MySQL : mysqlnd 5.0.5-dev - 081106 - $Revision : 1.3.2.27 $

      bon bah on sait d’où ca vient...
      merci de ta patience et de ton aide :)

    Répondre à ce message

  • 2

    Est ce que ce critère peut servir à réaliser un formulaire de recherche multicritères ?
    Je m’explique : j’ai sur mon site http://www.ag-immocote-ouest.com/ un formulaire de recherche qui permet aux visiteurs de lancer une recherche qui permet d’afficher tous les articles qui ont comme mots clé les choix des listes déroulantes du formulaire sélectionnés par le visiteur

    voilà le formulaire de recherche :

    <form  method="GET" >
    			<p class="choi"> 
                            <input type="hidden" name="page" value="recherche" >
                            
                            
                            
                           
                         <select name="id_mot1" style="display: block; float: left; width:200px">
                                    <option  selected="selected">-- Choix de transaction</option>
                                    <BOUCLE_transaction(MOTS){id_groupe=1}>
                                    <option value="#ID_MOT" [(#ENV{id_mot1}|=={#ID_MOT})]> #TITRE</option>
                                    </BOUCLE_transaction>
                            </select>
                            <select name="id_mot4" style="display: block; float: left; width:200px">
                                    <option selected="selected">-- Choix du type </option>
                                    <BOUCLE_typebien(MOTS){id_groupe=4}{par titre}>
                                    <option value="#ID_MOT" [(#ENV{id_mot4}|=={#ID_MOT})]> #TITRE</option>
                                    </BOUCLE_typebien>
                            </select>
                            <select name="id_mot3" style="display: block; float: left; width:200px">
                                    <option selected="selected">-- Choix de la région</option>
                                    <BOUCLE_region(MOTS){id_groupe=3}>
                                    <option value="#ID_MOT" [(#ENV{id_mot3}|=={#ID_MOT})]> #TITRE</option>
                                    </BOUCLE_region>
                            </select>
    						
    						<select name="id_mot2" style="display: block; float: left; width:200px">
                                    <option selected="selected">-- Choix du quartier</option>
                                    <BOUCLE_quartier(MOTS){id_groupe=2}>
                                    <option value="#ID_MOT" [(#ENV{id_mot2}|=={#ID_MOT})]> #TITRE</option>
                                    </BOUCLE_quartier>
                            </select>
    						
    						</p>
    						 <p class="lancrchrch">
                               <input type="hidden" name="lang" value="#LANG" >
                          
                    <input  type="image" value="submit" src="squelettes/images/lance_rcherch_137_25.gif" />
    				<input  type="image" value="reset" src="squelettes/images/annuler_recherch_136_25.gif" />
                </p>
                            </form>

    Répondre à ce message

  • 6

    {mots_selon_titre 50% ARRAY{'fruits', 'dessert'}}

    devrait convenir

    • Bonjour,

      Sur le canal irc, j’ai fait part de mes difficultés à utiliser correctement le plugin « critière{mots} ». Je remercie les personnes qui m’ont aidé jusque là.

      Mon but est d’afficher, sur une page « rubrique.html » et « mot.html », deux listes de mots-clés provenant de deux groupes distincts (« fruits » et « couleurs »).

      Ces listes s’affiches sous forme de <ul> <li> ne devrait idéalement pas être des listes déroulantes formulaires.

      Voici un bon exemple de ce que je recherche à faire : lien.

      Mon but est de pouvoir cliquer sur mot-clé (ex. fraise) pour afficher tous les articles associés à ce mot-clé. Ensuite, j’aimerais avoir la possibilité de cliquer sur le mot clé d’une autre liste (ex. rouge) pour filtrer les articles selon ces 2 mots-clés.

      La grande question, comment m’y prendre. Voici ce que j’ai déjà fait jusque là.

      Voici ce que contient ma page « mot.html ». En gros, il y a 2 inclure pour le fichier contenant les 2 listes de mots clés et pour la page contenant les articles :

            
      <div class="filter">
              [(#REM) include du filtre]
              [(#INCLURE{fond=inc_filtre})] 
            </div>
            <div class="resultat ajax">
              [(#REM) include de la liste des articles ]
              [(#INCLURE{fond=inc_rubrique}{id_mot})] 
            </div>

      Voici le contenu de l’inclure « inc_filtre.html » :

      <div>
        <ul id="fruits">
          <BOUCLE_viewall1(MOTS){id_rubrique=1}>
          <li><a href="#URL_MOT">all clients</a>
          </BOUCLE_viewall1>
          <BOUCLE_filtre1(MOTS){id_groupe=1}>
            <ul>
              <li><a href="#URL_MOT" [ class="(#EXPOSE)"]>#TITRE</a></li>
            </ul>
          </li>
          </BOUCLE_filtre1>
        </ul>
      </div>
      
      <div class="couleurs">
          <BOUCLE_viewall2(MOTS){id_rubrique=2}>
          <li><a href="#URL_MOT">all clients</a>
          </BOUCLE_viewall2>
          <BOUCLE_filtre2(MOTS){id_groupe=2}>
            <ul>
              <li><a href="#URL_MOT" [ class="(#EXPOSE)"]>#TITRE</a></li>
            </ul>
          </li>
          </BOUCLE_filtre2>
        </ul>
      </div>

      et ce que contient « inc_rubrique.html » :

              
      <BOUCLE_resultat(ARTICLES){id_mot}>
                <div class="grid-4 alpha portfolio">
                  <a href="#URL_ARTICLE">
                    <BOUCLE_thumbnail(DOCUMENTS){id_article}
      {extension==jpg|png|gif}{par num titre}{par date}{0,1}>
                      [(#FICHIER|copie_locale|image_reduire{250,0}|
      image_recadre{220,145}|
      inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})]
                    </BOUCLE_thumbnail>
                    <h1>/ #TITRE /</h1>
                  </a>
                </div>
      </BOUCLE_resultat>

      Je sais que pour utiliser le plugin critèremots, je dois d’abord récupérer dynamiquement les mots-clés dans un ou deux tableaux. J’ai a cet effet écrit le code suivant :

        	  #SET{keywords_table, #ARRAY}
      			<BOUCLE_filtre10(MOTS){id_groupe=1}>
      			  #SET{keywords_table, #GET{keywords_table}|push{#ID_MOT}}
      			</BOUCLE_filtre10>
      			[(#GET{keywords_table}|foreach)]

      Mon problème, c’est qu’ensuite je n’ai pas compris comment reprendre les infos du tableau.

      Bref, je suis un peu perdu et d’avance je m’excuse pour mon incompétence. Mais je suis prêt à en apprendre plus sur spip (notamment #ENV, #GET et #ARRAY). Si qqn peux m’expliquer par étapes ce que je dois faire, ce serait d’une grande aide.

      Merci !!!

    • heu attend c’est un plus simple. en gros, il faut que tu file à ton url de page d’affichage des objets selon les mot les id des mots. Sous la forme

      ?rubriquexxx&mots[0]=1&mots[1]=3

      Par exemple tu fait les boucles suivants :

      <BOUCLE_groupe(GROUPES_MOTS)>
      #TITRE
      
      <B_mot>
      <ul>
      <BOUCLE_mot(MOTS){id_groupe}>
      <li><a href="[(#SELF|parametre_url{mots&#091;#_groupe:COMPTEUR_BOUCLE&#093;,#ID_MOT})]">#TITRE</a>
      </li>
      </BOUCLE_mot>
      </ul>
      </B_mot>
      
      </BOUCLE_groupe>
      
      
      <B_article>
      <B_mot_art>
      Les articles associés aux mots 
      <BOUCLE_mot_art(MOTS){id_mot==(#ENV{mots}|implode{|})}{','}>
      « #TITRE »
      </BOUCLE_mot_art>
      <BOUCLE_article(ARTICLES){mots}>
      <li>#TITRE</li>
      </BOUCLE_article>
      </B_article>

      testé en local, cela devrait marcher.

      Si tu n’arrive pas a analyser les boucle, dit le moi ...

    • Tout d’abord, merci bcp pour votre réponse :-) !!! Elle m’a été utile.
      J’ai tout de même des questions.

      D’abord, est-ce normal que mon url n’affiche rien dans les crochets[] ? J’ai l’impression que le #COMPTEUR_BOUCLE n’est pas pris en compte. Et quelle est l’utilité du « | » après l’implode dans implode{|} ?

      Deuxièmement, mon objectif est d’afficher des articles avec 1 ou 2 mots-clefs max. Dans ce cas, si je clique sur « fraise » + « rouge », cela m’affiche 0, 1 ou plusieurs articles. Comment faire pour que lorsque je clique, par la suite sur « poire » (dans ma première liste de mots-clefs), l’url se modifie pour supprimer la valeur de « fraise » et la remplace avec celle de « poire » ? En bref, de ?rubriquexxx&mots[0]=1&mots[1]=3 à ?rubriquexxx&mots[0]=2&mots[1]=3 sans rajouter un nouveau &mots[2]=5 dans url ?

      Merci pour votre aide. J’ai honte de vous en demander autant, mais c’est aussi l’occasion pour moi d’aller plus loin dans les boucles spip. Malheureusement, mes tentatives sont souvent infructueuses, d’où mes questions.

    • Pour le #COMPTEUR_BOUCLE, j’ai compris d’où provenait le problème. J’ai modifié le code que vous m’avez transmis et je n’avais pas retiré le « _groupe : » de #_groupe:COMPTEUR_BOUCLE.

      Par contre, pour le reste, je suis tjs coincé...

    • si jamais, j’ai écrit un post sur le forum : http://forum.spip.org/fr_220400.html
      ce sera certainement plus simple. désolé pour tous ces mails.

    • -  le | dans le implode sert à transformer le tableau en quelquechose de la forme 1|2, pour faire ensuite un test dessus. Mais je me suis tromper dans le test, il vaut mieux mettre {id_mot IN #ENV{mots}}
      -  pour le reste, c’est un pb de gestion des crochets dans la compilation de SPIP. J’ai vu que denisb t’a donné une réponse-> prend la. En gros, plutot que de faire un tableau unique, il faut plusieur tableau qu’il fusionne.

    Répondre à ce message

  • 3

    J’ai qq soucis à comprendre le fonctionnement de ce plugin. Mon but est d’afficher 2 listes de mot-clés. L’un à comme nom de groupe « fruits » et l’autre « couleurs ». En choisissant un mot-clé, par ex. poire, cela renvoie à une page mot.html affichant les articles contenant le mot-clé « poire ». Depuis cette même page, j’aimerais pouvoir sélectionner un 2e mot-clé d’une 2e liste, par ex. « vert ». Ainsi, la page mot.html devrait afficher les articles contenant les mots-clés « poire » et « vert ».
    J’ai écrit une boucle dans un fichier inculde contenant les 2 boucles permettant d’afficher les (2) listes de mot-clés. : et

    Sur la page mot.html, j’ai inscrit la boucle <BOUCLE_resultat(ARTICLES)mots. Or, aucun article ne s’affiche. Je dois certainement manquer une étape et/ou mon cerveau refuse de réfléchir. Pouvez-vous m’aiguiller svp ??

    Merci

    • il manque une partie du texte ... donc j’ai du mal à comprendre ce que vous faites.

      N’oubliez pas de mettre les balises <code>

    • Désolé :-/ j’ai effectivement oublié les balises <code> !!!
      Voici le même texte avec la partie manquante, et aussi, merci pour votre réponse :

      J’ai qq soucis à comprendre le fonctionnement de ce plugin. Dans une page rubrique.html, mon but est d’afficher 2 listes de mot-clés. L’un à comme nom de groupe « fruits » et l’autre « couleurs ». En choisissant un mot-clé, par ex. poire, cela renvoie à une page mot.html affichant les articles contenant le mot-clé « poire ». Depuis cette même page, j’aimerais pouvoir sélectionner un 2e mot-clé d’une 2e liste, par ex. « vert ». Ainsi, la page mot.html devrait afficher les articles contenant les mots-clés « poire » et « vert ». J’ai écrit une boucle dans un fichier inculde contenant les 2 boucles permettant d’afficher les (2) listes de mot-clés : <BOUCLE_filtre1(MOTS){id_groupe=1}>et<BOUCLE_filtre2(MOTS){id_groupe=2}>

      Sur la page mot.html, j’ai inscrit la boucle mots <BOUCLE_resultat(ARTICLES){mots}>. Or, aucun article ne s’affiche. Je dois certainement manquer une étape et/ou mon cerveau refuse de réfléchir. Pouvez-vous m’aiguiller svp ??

      Merci

    • Autre question pour ce plugin, je voudrais sélectionner les articles ayant les mots clefs « fruits » et « desserts », mais aussi ceux qui n’ont que « déserts » ou que « fruits » ! Est-ce possible ?

      Merci

    Répondre à ce message

  • 1

    Je crois que {mots 100% #ARRAY{2,1}} est faux : c’est {mots 100% #ARRAY{0,2,1,1}} que vous voulez dire non ?

    • et oui effectivement, j’avais oublié la syntaxe un peu tordu de #ARRAY lorsqu’on rentre des valeurs numériques. Je corrige, merci

    Répondre à ce message

  • 1

    Bonjour

    merci pour ce bon plugin ! A priori il me permettra de requeter, croiser, filter, extraire la substantifique moelle de ma base (Data Mining).

    Pour rendre encore un peu plus accessible aux néophytes de la programmation ce bon pugin, serait il possible d’avoir des modèles à insérer dans l’article où l’on veut récupérer le résultat.

    Répondre à ce message

  • 1
    Maïeul

    heu .... oui peut -être

    après, je n’ai pas forcément le temps, ni les compétence pour le faire ...

    et je me deamnde si ce n’est pas détourner un peu le but de ce plugin ...

    • bennetteson

      Avec la pondération il saurait possible d’avoir une suggestion d’article. Dans le même groupe de mots, on peut avoir des mots clefs très généralistes « couleur primaire » que précis « bleu ». Avec une pondération on pourra favoriser les articles liés aux mots « bleu » que « couleur primaire ».
      Par contre, ça change tant le fonctionnement du Plug-in qui sera surement préférable de faire un nouveau plug-in qui utilisera le tien et champs extra. D’ici quelques jours je le ferais vu que j’en ai personnellement besoin.

    Répondre à ce message

  • bennetteson

    Ça serait possible d’ajouter une pondération à des mots à l’aide d’un champ supplémentaire ?

    Répondre à ce message

  • Bon visiblement il n’est pas compatible SPIP3. Pourquoi il y a le mot cle compatible SPIP3 ?

    je viens de le tester et la requete est

    SELECT articles.id_article, articles.lang, articles.titre
    FROM spip_articles AS 'articles'
    WHERE (articles.statut = 'publie')
    	AND articles.id_article IN (
    		SELECT id_article FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcGNvbnQ8L2NvZGU+"></span>.spip_mots_articles WHERE id_mot='1' GROUP BY id_article HAVING SUM(1) >= 1 ) 

    or la table spip_mots_articles n’existe plus en spip3, je m’y colle

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom