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

  • 1

    Bonjour à tous,

    Je n’utilise pas ce plugin mais je sais pas trop où poser ma question... Je vous explique : j’ai un plugin Contacts et j’aimerais que lorsque l’utilisateur lance une recherche, elle se fasse aussi au sein de la table spip_contacts du plugin.

    Pour cela, j’ai utilisé plusieurs pipelines : rechercher_liste_des_champs, declarer_tables_objets_surnoms.

    J’ai également ajouter une boucle sur la table spip_contacts dans le squelette recherche.html :

    Contact #NOM_ORGANISATION

    Mais la recherche ne retourne rien. Pourtant je lance la recherche avec un nom de contact existant dans la base.

    Quelqu’un parmi vous aurait eu ce genre de problème ? Un nouvel objet éditorial avec une recherche dessus mais sans résultats...

    Je vous remercie.

    Répondre à ce message

  • 7

    Bonjour et merci pour ce plugin, je voudrais cependant y apporter une modification mais je n’y arrive pas mes compétences étant limitées sur le sujet.

    j’aurai besoin, pour un projet, d’ajouter une recherche, non pas sur la date de publication, mais sur la date de rédaction antérieur.

    Du coup, et comme les dates des documents en question peuvent être assez anciennes (1750 ou 1830, par exemple, les champs « 3 derniers mois » ou « l’année dernière » ne fonctionnent plus. Il faudrait, pour bien faire remplacer le menu déroulant par deux champs où l’on pourrait entrer deux dates afin de faire une recherche, par exemple, sur les articles écrits entre 1875 et 1879.

    Si quelqu’un a une piste vous me seriez d’un grand secours.
    Merci !

    • Bonjour,

      Dans le fichier formulaires/recherche-avancees.html,
      il faut définir deux champs à la place du menu déroulant qu’il y a ligne 30 à 39...

      <tr><td width=40%>
        <label>Entre</label>
      </td><td width=60%>
        <input type="text" class="forml" name="depuis" id="depuis" value="#DEPUIS"  />
        <input type="text" class="forml" name="jusqua" id="jusqua" value="#JUSQUA"  />
      </td></tr>

      Dans le fichier recherche_articles.html, il faut ajouter les critères qui exploitent ces champs :

       {date_redac>(#ENV{depuis,1000-01-01})} {date_redac<(#ENV{jusqua,3000-01-01})}

      en lieu et place de :
      {age<(#ENV{depuis,1E100})}

      Attention cependant à bien rentrer les dates...

      @+

    • Génial !
      Merci pour cette réponse extrêmement rapide !

      Le code que vous m’avez donné fonctionne à merveille.
      Cependant il faut entrer, dans les champs, la date complète au format « 3000-01-01 » pour que cela fonctionne.

      Je voudrais, si possible, lancer la recherche sur les années uniquement, mais je ne trouve pas comment faire. Auriez vous une idée ?

      Encore merci !

    • Bonjour,

      La date est au format américain (an-mois-jour) .
      Dans le fichier recherche_articles.html, des critères comme ci-dessous devrait marcher :

      {date_redac>=(#ENV{depuis,1000})-01-01} {date_redac<(#ENV{jusqua,3000})-01-01}

      => on cherche la date entre ’depuis’ (par défaut an 1000) et ’jusqua’ (par défaut an 3000) au 1er janvier...
      @+

    • MERCI+++
      ça marche nickel, me voilà sauvé !

    • Bonjour et encore merci pour l’aide que vous m’avez apportée... :-)

      J’ai un autre petit problème :
      Je voulais faire un tri sur les mots-clés, mais également exclure du résultat les articles possédant certains mots-clés.

      Le problème est que les articles ne possédants pas de mots-clés sont exclus des résultats.

      Voici les boucles que j’utilise dans mon formulaire :

      <B_nomot>
           <tr><td>
      			<label><:rechercheavancee:exclure_mot:></label>
      		</td><td>
      			<select name="id_nomot">
      				<option value="" style="color:silver"><:rechercheavancee:aucun:></option>
      				<BOUCLE_nomot(MOTS){id_groupe IN 2,4}>
      					<option value="#ID_MOT" [(#ENV{id_nomot}|=={#ID_MOT}?{"SELECTED"})]>#TITRE </option>
      				</BOUCLE_nomot>
      			</select>
      		</td></tr>
          </B_nomot>

      Voici le critère que j’ai ajouté dans recherche.html :

      {id_mot != (#ENV{id_nomot})}

      Si j’efface ce critère de ma page, les articles manquants apparaissent dans les résultats.
      Où est-ce que j’ai fauté ?
      Merci.

    • Bonjour,

      La sélection par mot-clé n’est pas évidente.
      La façon de faire est d’utiliser le critère doublons : c’est expliqué ici : http://www.spip.net/fr_article4139.html (voir § Notre grand classique : exclure suivant un mot-clé).
      Il faut créer une première boucle pour sélectionner ce qu’on veut exclure (avec un critère
      doublons) puis on ajoute doublons à la boucle de recherche pour éliminer le résultat de la première recherche...

      @+

    • Bien sûr, je n’avais pas fait le lien !
      Merci !

    Répondre à ce message

  • 7
    meyodin

    Bonjour,

    J’ai tenté d’utilisé ce plugin sur mon futur site mais je rencontre des difficultés :
    La recherche par champs de texte fonctionne parfaitement mais la recherche par liste déroulante ne fonctionne pas du tout.

    Y a-t-il quelque chose que j’aurais oublié et qui permettrait de lier le contenu de ma base de donnée aux différents choix de mots-clés ?

    Merci de votre réponse.

    • Bonjour,
      Normalement, rien à faire. Vérifiez quand même que votre squelette ne surcharge pas le fichier recherche.html du plugin...
      Un lien pour voir l’erreur ?
      @+

    • meyodin

      J’ai réinitialisé tous mes squelettes pour y voir plus clair.

      Voilà ce qu’il se passe :
      * Lorsque je rentre un texte dans le premier champs : La recherche s’exécute et fonctionne
      * Lorsque je rentre un texte dans le premier champs et que dans mes mots-clé je sélectionne un mot, cela fonctionne (le filtre est actif)
      * Lorsque je rentre un texte dans le premier champs et que je sélectionne une rubrique, cela fonctionne (le filtre est actif)
      * Lorsque je laisse le champs de texte vide mais que je sélectionne un mot de ma liste de mot-clé, rien ne s’affiche (pas d’erreur ni d’information indiquant qu’il n’y aurait pas d’article correspondant à ce mot)
      * Lorsque je laisse le champs de texte vide mais que je sélectionne une rubrique, la rubrique choisie apparaît en gras dans mon menu de navigation (pas d’erreur ni d’information indiquant qu’il n’y aurait pas d’article correspondant à ce mot)

      Est-ce normal ?

      Je ne peux pas encore montrer d’exemple car je travaille en local.

    • Bonjour,
      C’est normal... la recherche de SPIP s’attend à avoir une chaîne sur laquelle chercher...
      Cependant depuis la v2, cette chaîne est optionnelle, il suffit pour cela de rajouter un ? derrière le critère recherche de la boucle...
      Il suffit donc de modifier autour de la ligne 53 du fichier recherche.html du plugin :

      <BOUCLE_articles(ARTICLES) {recherche}...>

      en :

      <BOUCLE_articles(ARTICLES) {recherche?}...>

      PS : j’ai modifié l’archive pour la v2.xx en ce sens.
      @+

    • meyodin

      Waouh !

      Merci beaucoup pour cette réponse rapide, cela fonctionne parfaitement ! Et en plus j’ai appris quelque chose de très intéressant !
      Merci encore pour ce plugin fort utile !

    • meyodin

      Rebonjour,

      Pour réaliser une revue de presse, je souhaiterais proposer une recherche des articles par année.
      J’ai pris modèle sur les autres listes pour faire la liste déroulante année, mais cela ne fonctionne pas. Je ne sais pas comment signaler le type de la boucle. Dois-je créer une nouvelle table pour y intégrer les année ?

      Est-ce que je m’y prends bien ? Ou est-ce que c’est plus compliqué que ça ?

    • Bonjour,

      Ce n’est pas beaucoup plus compliqué, il faut reprendre la boucle article (celle qu’on a déjà repris en ajoutant un «  ? ») afin d’ajouter un intervalle de dates.
      Quelque chose du genre :

      <BOUCLE_articles(ARTICLES) {recherche?}
      {date_redac>=(#ENV{an,1000})-01-01} {date_redac<=(#ENV{an,3000})-12-31}>


      -  où <= (resp. >=) signifie inférieur (resp. supérieur) ou égal
      -  où la variable an est définie dans votre liste déroulante (c’est le nom de votre liste), un truc comme cela à mettre dans le fichier formulaire/recherche_avancee.html :

      <select name="an">
        <option value="" style="color:silver" ><:rechercheavancee:nodate:></option>
        <option value="2008" [(#ENV{an}|=={2008}?{"SELECTED"})]>2008</option>
        <option value="2009" [(#ENV{an}|=={2009}?{"SELECTED"})]>2009</option>
        <option value="2010" [(#ENV{an}|=={2009}?{"SELECTED"})]>2010</option>
        <option value="2011" [(#ENV{an}|=={2011}?{"SELECTED"})]>2011</option>
      </select>

      Par défaut, si la variable n’est pas renseignée, on cherche entre le 1er janvier 1000 et le 31 décembre 3000. Sinon entre le 1/01 de l’année et le 31/12 de l’année ;-).

      Ce post peut vous aider : #440493

      Bon courage...

    • meyodin

      Merci pour cette réponse rapide. (J’avais déjà lu le post dont vous parlez ;)

      J’avais déjà trouvé cette solution là mais je cherche plutôt quelque chose qui récupèrerait l’année des articles existant dans ma rubrique de manière automatique, afin de ne pas devoir revenir dans le code chaque année pour rajouter ce champs manuellement.
      Je tourne, je tourne mais je n’ai toujours pas trouvé, et en faite, je me demande si c’est possible à faire...

    Répondre à ce message

  • 4
    marviro

    Bonjour, et merci beaucoup pour ce plug-in.
    J’aurais besoin d’ajouter une recherche libre par auteur, croisé avec celle de texte.
    Évidemment on peut la faire en donnant la liste complète des auteurs et ajoutant un id_auteur ?.
    Mais si je veut que l’usager puisse remplir lui-même le champ auteur et le champ « qui contient le texte », il me faudrait une autre variable recherche... avez-vous une idée ?
    L’idée pour moi c’est d’avoir un moteur de recherche comme celui des bibliothèques, avec plusieurs champs qui peuvent être remplis directement par l’usager (c’est parce que j’ai une très grosse base des données et que si je donne la liste c’est trop long...)

    Merci encore

    • Bonjour,

      Pour cela, il va falloir que vous vous mettiez au développement SPIP : commencer par faire une recherche sur les auteurs pour avoir une tableau d’auteur puis faire une recherche en donnant le tableau (avec une condition {id_auteur IN aut_array}) pour limiter la recherche à cette liste...

      @+

    • marviro

      c’est bien ce que je pensais... je vais m’y mettre...
      merci !

    • marviro

      Rebonjour...
      est-il possible de sélectionner plusieurs mots-clés ? (ex : je cherche un article connexe au mots-clés « philosophie » et « europe ».

      Merci beaucoup !

    • Bonjour,
      Même réponse que précédemment... il faut rajouter des menus pour les mots clé et faire une recherche avec une condition : {id_auteur IN mot_array} sachant que la condition IN équivaut à un ou (« philosophie » ou « europe »)...
      @+

    Répondre à ce message

  • 1

    Bonjour,

    Je vous remercie pour ce formulaire de recherche qui me semble trop utile.

    En faite je débute en Spip, j’ai bien téléchargé le Zip pour recherche avancée 2.XX, je l’es dézipper et puis le mettre sous plugins/auto comme les autres plugin mais mon problème se résume tout simplement en ceci : Je ne comprend pas vraiment comment utiliser votre plugin.

    Je vous remercie d’avance

    Cordialement

    • Bonjour,

      Normalement, le plugin remplace automatiquement le formulaire de recherche standard de SPIP, sauf si votre squelette surcharge déjà ce formulaire auquel cas, c’est votre squelette qui gagne... ou si vous utilisez un plugin qui surcharge ces fichiers (recherche.html et formulaires/recherche.html).

      @+

    Répondre à ce message

  • 2

    Bonjour,
    l’emploi du filtre google_like semble être déconseillé, voir sous le lien que tu donnes dans cette contrib : « Attention ! Cette contrib a fait l’objet d’une alerte de sécurité ...Merci de ne pas l’utiliser. » et sous le lien google like II on arrive sur un Erreur 404
    Mieux vaut ne pas utiliser ce filtre.
    à+
    joz

    • Bonjour,

      J’ai modifié le filtre d’origine. A priori, le filtre commence par faire une conversion en texte brut, ce qui devrait éviter ce genre de problème (?)...

      @+

    • merci pour l’info, c’est rassurant :)
      tu ne veux pas l’ajouter dans la contrib pour en informer tout utilisateur ?

      en tout cas un grand merci aussi pour cette contrib, la recherche avancée fonctionne trop bien !
      ++
      joz

    Répondre à ce message

  • 2

    Bonjour,
    J’aimerais bien rendre la recherche avancé fanctionnel avec le champs de recherche vide.
    c-à-d rendre possible une recherche genre : articles des « 3 derniers mois » dans la rubrique « Test ».
    Avez vous une idée comment faire ?
    merci pour des astuces..
    joz

    Répondre à ce message

  • 1

    Re-bonjour,
    est-ce que le champ « Page dont le titre contient » fonctione ? Chez moi il est tout simplement ignoré...
    merci
    joz

    Répondre à ce message

  • 1

    Le dernier fichier-archive corrigé recherche_avancee_2_xx.zip provoque une erreur “Impossible de désarchiver” sur MacOS. Pas de problème avec les autres archives.

    Répondre à ce message

  • 2

    Bonjour,

    je suis en train d’essayer d’utiliser votre plugin sous SPIP 2.12 et j’ai rencontré quelques erreurs lors de la validation des pages.

    Dans le fichier formulaires/recherche.html, j’ai changé ceci :

    <a href="?page=recherche&avancee=1&lang=#ENV{lang}&recherche=#RECHERCHE"

    en

    <a href="spip.php?page=recherche-avancee&amp;avancee=1&amp;lang=#ENV{lang}&amp;recherche=#RECHERCHE"

    pour que cela soit valide.

    De même, dans le fichier formulaires/recherche-avancee.html, j’ai modifié toutes les occurrences de <Option> en <option>

    Dans le fichier recherche.html à la racine du dossier, il y a des propriétés de la balise <table> qui n’ont pas de guillemet. Par exemple,
    <table border=0 cellspacing=0 cellpadding=0 width=310> ou encore <td valign=bottom height=50>

    Cordialement.

    • J’ai aussi trouvé dans recherche.html à la racine du dossier, des <h2 class=surtitre> à changer en <h2 class="surtitre">

      Et aussi dans formulaires/recherche-avancee.html : <select name="id_mot" ID="Select1"> à changer en <select name="id_mot" id="Select1">

    • De même dans le fichier recherche_avancee_fonctions.php

      Remplacer : <span class=spip_surligne>" par <span class=\"spip_surligne\">" ainsi que les 3 occurrences de <i class=rsusp> par <i class=\"rsusp\">

    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