Recherche avancée sous SPIP

Ajoutez un formulaire de recherche permettant de se limiter à une rubrique, à un mot clé, à une date... affichage Google_like...

Présentation

Vous avez déjà remarqué l’option recherche avancée dans votre moteur de recherche favori... elle vous permet de limiter votre recherche à un certain nombre d’options... Malheureusement, votre SPIP en est dépourvu en standard. Cette contribution va remédier à cet état de fait.

Comment ça marche ?

La recherche de SPIP

Tout d’abord, remarquons que la recherche de SPIP (fichier dist/rechercher.html) est basé sur une boucle :

<BOUCLE_articles(ARTICLES) {recherche} {par points} {inverse} {pagination}>

Restreindre la zone de recherche

Il suffit donc d’y ajouter un argument rubrique pour limiter la recherche à la rubrique en question :

<BOUCLE_articles(ARTICLES){recherche}{par points}{inverse}{rubrique?}{pagination}>

Le « ? » permet de conserver le fonctionnement du squelette d’origine (si aucune rubrique n’est précisée). En fait, on utilisera plutôt {branche?} pour une recherche dans la rubrique et ses sous-rubriques.

Vous pouvez faire l’essai : copier le fichier de la dist dans votre répertoire « squelettes », modifiez le, et lancez une recherche en ajoutant à la fin de la ligne &id_rubrique=1 pour vous limiter à la rubrique 1.

Usage de mot clef

De la même manière, on peut restreindre la recherche à un mot clé que l’on précisera lors de l’appel : {id_mot?}

Selon la durée

Maintenant, cherchons à introduire une condition sur la durée : c’est le critère age qui intervient, mais {age?} ne marchera pas, à moins que l’on ne veuille une date en particulier. On cherche plutôt à avoir tous les articles parus après une date donnée, donc quelque chose comme {age<#ENV{depuis}}depuis a été passé en argument dans la recherche. Mais on perd le comportement initial du squelette (si on ne précise pas l’age en question). J’ai donc choisis une valeur par défaut : {age<#ENV{depuis,1E100}} en espérant que personne n’aura écrit un article il y a plus de 1E100 jours ;-)

Par points

Enfin, notons que la recherche est triée par points, mais que l’on peut assez facilement utiliser un tri différent : {par #ENV{tri, points}} en utilisant une variable passée dans l’environnement.

On peut donc facilement ajouter quelques critères à sa recherche SPIP.

Il reste à définir un formulaire pour envoyer la requête facilement...

Un formulaire de recherche avancée

Le formulaire en question est utilisé en lieu et place du formulaire standard dans le squelette de la recherche, à condition que l’option avancee=1 lui ait été envoyée. Il se présente ainsi :

Formulaire de recherche avancée

Il a été placé dans le fichier formulaires/recherche-avancee.html afin que vous puissiez le modifier plus facilement et introduire les spécificités propres à votre site, car suivant la configuration de celui-ci, le nombre de rubriques ou de mots clé, vous aurez peut-être à le modifier, au risque d’avoir des menus à rallonge ou des critères qui ne vous satisferont pas.

Et pour y accéder plus facilement, j’ai placé un lien dans le fichier formulaires/recherche.html de la dist.

Finalisation

Mais que serait une bonne recherche sans une bonne présentation ? Pour cela, j’y ai introduit un filtre google_like (voir Google Like et Google Like II) et j’ai transformé les points SPIP en pourcentage plus lisible pour le commun des mortels.

Il ne restait plus qu’à ajouter deux image pour donner un peu de couleurs, faire un fichier de style pour une meilleur intégration dans votre site, mettre une icône dans la barre de recherche standard, un fichier de langue pour les traductions et à empaqueter le tout dans un plugin pour faciliter l’installation...

Et voilà le résultat ...

Remerciements

Merci à J-Ph Guihard pour la validation du code html, css et le passage en SPIP v2.xx, suite aux remarques sur le forum


Dernière mise à jour :
-  04/10/2010 Validation html et css, mise à jour du code pour SPIP 2.xx par J-Ph Guihard
-  19/01/2009 Ajout d’options sur les mots-clés (par groupe ou sans le mot clé...)
-  04/05/2008 Bug dans le fichier recherche_avancee_fonctions.php
-  05/09/2007 Problème d’affichage en version 1.9.3 dev
-  29/08/2007 Gestion des Résultats dans la langue de la requête suite aux remarques d’Abelass.
-  13/08/2007 Première version (1.9.2b)

Attention, ce plugin reprend et modifie les fichiers recherche.html et formulaires/recherche.html de la dist, veillez donc à ne pas les avoir déjà surchargés dans votre répertoire « squelettes »...

Discussion

50 discussions

  • Bonjour,

    est ce que ce plugin fonctionne tout de même sur spip 2.0 ?

    Merci !

    Répondre à ce message

  • 3

    bonjour, j’aime beaucoup cette contrib, j’ai réussi à modifier pour exclure des groupes de mot clé mais j’aimerai que ça ressemble aux pages de mon site (spip 2.01+eva web) et non à un formatage brut, je ne sais pas dans quel fichier bricoler et quoi bricoler.
    est-il possible que ça figure dans un bloc plutôt qu’une page entière.
    C’est pour ne pas égarer l’utilisateur.
    Par ailleurs, si on ne met rien dans la recherche, ça serait pas mal que ça liste (pour les mots clé par exemple dans une rubrique).
    Je suis débutant dans spip, css, html... pas facile....
    Merci d’avance
    Yvan

    • La recherche SPIP appelle la page recherche.html il vous suffit donc de la modifier pour qu’elle tienne compte du style de votre site.
      Par contre SPIP ne sait pas rechercher une chaine vide... Il me semble que la v2 autorise une recherche conditionnelle, il faudrait alors mettre un ? dans le critère de recherche (dans le squelette, remplacer recherche par recherche ? mais je n’ai pas testé.

      @+

    • Denis Chatiron

      Bonjour,
      Je suis preneur de la méthode pour exclure certains groupe de mots clé dans le fichier recherche-avancee.html

      Il me semble que ça doit se trouver là :

      <label><:rechercheavancee:limiter_groupe:></label>
      </td><td>
      <select name="id_groupe" >
      <Option value="" style="color:silver"><:rechercheavancee:all:></option>
      <BOUCLE_surgmot(GROUPES_MOTS)>
      <Option value="#ID_GROUPE" [(#ENV{id_groupe}|=={#ID_GROUPE}?{"SELECTED"})]>#TITRE </option>
      </BOUCLE_surgmot>
      </select>
    • Bonjour,

      Il suffit de lui préciser les groupes qu’on ne veut pas voir :
      <BOUCLE_surgmot(GROUPES_MOTS){id_groupe!=10}>
      ou
      <BOUCLE_surgmot(GROUPES_MOTS){id_groupe !IN 5,10,12}>
      par exemple...

      Voir l’utilisation de critère IN dans les boucles.

      @+

    Répondre à ce message

  • 1

    Merci beaucoup, Jean-Marc.
    Je me jette à l’eau, alors !
    (je débute sur Spip, c’est passionnant mais les débuts sont un peu dur, dur :)

    • Denis Chatiron

      Bonjour, je cherche à modifier le fichier recherche-avancee.html pour exclure certains groupes de mots clés pour qu’ils n’apparaissent pas. Il me semble qu’il faudrait modifier ce code mais ne sait pas comment.
      Idem pour exclure certains mots-clés mais ça doit être pareil.

      Merci d’avance

      <label><:rechercheavancee:limiter_groupe:></label>
      		</td><td>
      			<select name="id_groupe" >
      				<Option value="" style="color:silver"><:rechercheavancee:all:></option>
      				<BOUCLE_surgmot(GROUPES_MOTS)>
      					<Option value="#ID_GROUPE" [(#ENV{id_groupe}|=={#ID_GROUPE}?{"SELECTED"})]>#TITRE </option>
      				</BOUCLE_surgmot>
      			</select>
      		</td></tr>

    Répondre à ce message

  • 1

    Bonjour,
    Je vois que cette contrib est compatible spip 1.9.2.
    Quelqu’un l’a-t-il déjà testée avec une version 2.0.10 ?

    Répondre à ce message

  • ploufplouf

    Bonjour,

    J’ai installé le plugin et suivi les instructions pour obtenir une recherche avancée (c’est surtout la limitation des rubriques qui m’intéresse) mais quand je lance une recherche, aucun résultat apparait. Ma base de données est bien remplie pourtant.

    Ma page apparait comme je l’ai habillée mais c’est au niveau fonctionnalité que ca ne marche pas.

    Auriez-vous connaissance d’un bug à ce niveau ?

    J’utilise une version 1.9.2 de spip.

    Répondre à ce message

  • 1

    Je cherche à adapter à mon site, je rame un peu... Par contre, le truc bizarre c’est que la recherche classique (formulaire recherche dans page sommaire Eva-Web) ne fonctionne plus...
    En tout cas, c’est un outil génial. Bravo

    • Bonjour,

      Il se peut que Eva-Web surcharge déjà la fonction de recherche, ce qui peut provoquer des conflits avec le plugin...

      Bon courage...

    Répondre à ce message

  • 6

    Bonjour,

    Nous rencontrons un problème de pagination sur notre site : seule la 1re page s’affiche...

    Quand on clique sur un autre numéro de page de résultats, on affiche encore et toujours la 1re page.

    Ex. page 2 de la recherche :

    http://munci.org/spip.php?page=recherche&lang=fr&recherche=munci&debut_articles=7#pagination_articles

    Voyez vous d’où le pbm peut venir ?

    Merci !

    • Je dirais qu’il manque un passage de paramètre debut_articles dans le INCLURE de votre squelette de recherche :

      <INCLURE{fond=corps_recherche}{recherche}{avancee}{depuis}{id_mot}{id_rubrique}{tri}{titre}{debut_articles}>

      Sinon, depuis la v2, le parametre env permet de transmettre tout l’environnement en ajax (voir http://www.spip.net/fr_article3753.html).

      @+

    • Là je suis scotché... réponse positive 2 mns après mon post, vraiment bravo et merci !

      J’en profite pour vous poser une dernière question : je constate qu’il y a à la fin des URL des pages trouvées le filtre ?var_recherche=(mot recherché)

      N’est-il pas prévu un focus quelconque (highlight, surlignement...) du mot recherché dans ces pages ?

      Ou bien alors avons-nous encore un petit pbm dans nos squelettes ?

      Merci !
      (et bravo pour cet excellent plugin)

    • Le mot recherché s’affiche dans un style particulier. Pour cela, il faut définir une classe spip_surligne dans son css (munci.css pour vous)...

      Par exemple, pour surligner :

      .spip_surligne { background-color:yellow; }

      @+

    • Ok c’est corrigé pour çà, merci !

      En fait je voulais parler du surlignement du mot recherché dans les articles...

      Mais il est possible que ca soit écrasé par un autre style du squelette article.

    • Même punition... il faut passer l’environnement aux inclusions ;-)

      <INCLURE{fond=corps_article}{id_article}{var_recherche}> 
    • Autre oubli de notre part en effet (honte)... merci.

      Mais... pas de chance... malheureusement ca ne suffit pas ;-(

    Répondre à ce message

  • Merci Jean-Marc,
    j’ai réglé mon matter grace à vous. Je vous souhaite bonne continuation...

    Répondre à ce message

  • 1

    Je n’ai pas malheureusement pas réussi à trouver, depuis l’interface de gestion, où créer un nouvel article pour le lier à celui-ci. J’ai parcouru les commentaires (de façon non-exhaustive, je le crains) et je n’ai pas trouvé de contribution similaire à celle que je vais soumettre ici.

    Je voulais proposer que cette contribution soit le début de la création d’un plugin (chose que je ne sais faire) ou plutôt, de l’évolution du plugin existant (chose que je ne sais faire non-plus).

    Quoi qu’il en soit, voici quel était mon problème et quelle solution (la contrib) que mon pote Gaston y a apporté.

    Je développe un site, sous spip, bien sûr, pour recenser l’ensemble de l’offre de formation sur mon département... Jusqu’ici, cela n’intéresse personne...

    Mais cela a son importance puisque, après avoir trouvé le moyen d’alimenter mon site en données, assez facilement (par un jeu de boucles et de plugins), j’étais coincé pour exploiter ces données dans le moteur de recherche natif de spip et je n’ai pas trouvé de plugins qui répondent exactement à mes besoins. Le plugin « Recherche Avancée » se rapprochait néanmoins beaucoup de la solution, excepté que je n’utilise pas de mots-clé.

    Ce point de détails n’est pas anodin et renvoie à la nature de l’activité de mon site (recenser l’offre de formation)... qui prend son importance, désormais. Je travaille, en effet, depuis une base excel transmise par un partenaire, que je convertis en CSV et que j’importe dans ma base sql. Ce qui me permet de rédiger environ 800 articles, en quelques clics. J’ai rajouté quelques champs à la table « articles » pour l’aménager à mes besoins et j’ai affiché ces champs dans le fichier article.html de la dist. Dans ces conditions, il est, en effet, or de questions de tagger, un a un, les 800 articles qui, de toutes façons, changent à peu près chaque mois. Il me fallait donc trouver d’autres options de recherche pour naviguer « horizontalement » dans mon site spip.

    J’ai compris, qu’en principe, n’importe lequel de ces champs (ne pouvant prendre, pour la plupart, qu’un nombre fini de valeurs) représentait, par conséquent, un groupe de mot-clés précis bien identifiables.

    J’ai donc entrepris de modifier le plugin pour l’adapter à mon besoin... Mais je n’y suis pas parvenu... Ou du moins, cela ne fonctionnait pas... D’où l’entrée en scène de mon pote Gaston qui lui, à modifier directement le squelette (oui, je sais, c’est mal), à défaut d’avoir réussit, lui non plus, à modifier le plugin. En tout cas, ça marche ! Enfin, à quelques exceptions près... On a un problème avec les champs contenant certains caractères spéciaux... Je les ai supprimé et cela fonctionne bien.

    L’idée maintenant, c’est de pouvoir en faire un plugin propre (en tout cas beaucoup moins artisanal que notre méthode), qui ne nécessite pas de toucher au squelette (ce qui posera, évidemment, quelques problèmes futurs, parfaitement prévisibles).

    Voici la méthode qui a été appliquée :

    Elle consiste à modifier les fichiers suivants : squelettes-dist/recherche.html, squelettes-dist/formulaires/recherche.html et squelettes-dist/formulaires/recherche.php

    POUR LE FICHIER : squelettes-dist/formulaires/recherche.html

    Il faut introduire, entre la deuxième et la troisième balise input, le code figurant dans l’exemple suivant. Ici, c’est le champs « DESCRIPTIF » qui a été sélectionné et il a pour contenu les codes NSF des formations (à titre d’exemple) :

    	<B_surdescriptif>
        		<label>CODE NSF</label>
    			<select name="descriptif" >
    				<Option value="" style="color:silver">Tous</option>
    <BOUCLE_surdescriptif(ARTICLES)>[<Option value="(#DESCRIPTIF|supprimer_tags|unique)" style="display:block" [(#ENV{descriptif}|=={#DESCRIPTIF|supprimer_tags}?{"SELECTED"})]>#DESCRIPTIF </option>]</BOUCLE_surdescriptif>
    			</select>
        </B_surdescriptif>

    Il faut recommencer cette manip, autant de fois que nécessaire, en changeant, bien sûr, le nom de la boucle et celui des champs, en les remplaçant par ceux des champs que l’on souhaite exploiter.

    Ensuite...

    POUR LE FICHIER : squelettes-dist/recherche.html

    Il faudra modifier le Fil d’Ariane, comme ceci (toujours en prenant le même exemple, moins les quelques personnalisations de polices que j’y ai introduite)...

    		[(#REM) Fil d'Ariane ]
    		<div id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a> &gt; <:info_rechercher:>&gt; <strong class="on"> [(#RECHERCHE)] [(#DESCRIPTIF)]</strong></div>
    		    <div class="cartouche">
    			<h1><span style="font-family: Comic Sans MS; text-transform: uppercase"><:resultats_recherche:></span></h1>
    			<p class="soustitre">&#171;&nbsp; [(#RECHERCHE)] [(#DESCRIPTIF)] &nbsp;&#187;</p>
    		</div>

    ENFIN, POUR LE FICHIER : squelettes-dist/formulaires/recherche.php

    Il y rajouter une ligne, entre la ligne 26 et la ligne 27, comme ceci :

                            'surtitre' => _request('surtitre'),

    Ca y est ! C’est fait ! Un joli moteur de recherche tout neuf qui permet de naviguer en fonction d’un contenu variable, dans un champs, et fonctionnel sur toutes les tables sql possibles... Is good !

    Mesdemoiselles, Mesdames, Messieurs... J’attends vos commentaires et vos propositions sur une création de plugin. Peut-on faire migrer cette discution, si nécessaire, sur une nouvelle page ?

    Répondre à ce message

  • 1

    Merci Viglino Jean-Marc,
    ll me reste juste (pour l’instant) à modifier mes critéres de recherche (noms à coté des champs) pouvez vous m’indiquer le chemin svp ?

    Autre chose, j’ai un projet qui prevoit la creation d’alerte mail genre site immobilier, est ce qu’avec le formulaire de contact avancé je pourrais m’en sortir ?

    Merci encore une fois, spipement votre !!!!

    • Bonjour

      Si vous voulez modifier les noms des champs, il vous suffit de modifier le fichier de langue : lang/recherche_avancee.fr.

      Recopier le dans le fichier de votre squelette lang/local.fr (à créer si besoins) et modifier les noms. Eviter les accents ou codez les (é devient &acute;) et les ’ que vous devez faire précéder de \.

      Par exemple :
      'contenant' => 'Pages contenant le texte :',
      devient :
      'contenant' => 'votre texte :',

      Pour le formulaire contact avancé, je n’ai jamais testé.

    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