SPIP - Contrib

SPIP - Contrib

[ar] [en] [es] [fr] [it]

73 visiteurs en ce moment

fontsizeup fontsizedown
Accueil du site > Contribs > Navigation > Recherche > Recherche avancée > Recherche avancée sous SPIP
[60 commentaires]

Recherche avancée sous SPIP

lundi 13 août 2007, par Viglino Jean-Marc

1 vote

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 :

GIF - 6.6 ko
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 ...


Dernière mise à jour :
- 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 forum 397655
- 29/08/2007 Gestion des forum 396868 suite aux remarques d’Abelass.
- 13/08/2007 Première version (1.9.2b)

P.-S.

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é dans votre répertoire « squelettes »...

Retour en haut de la page

60 Messages de forum

Voir toute la discussion

Pages 1 | 2 | 3 | 4 | 5 | 6

  • Répondre à ce message

    8 mars 00:13 , par Tropicaloo

    Jean-Marc, merci pour ta réponse.

  • Répondre à ce message

    7 mars 13:45 , par Viglino Jean-Marc

    Bonjour,

    Pas vraiment d’idée là dessus :-(

    J’avait 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...

    @+

  • Répondre à ce message

    7 mars 00:14 , par Tropicaloo

    Bonsoir,

    Ce formulaire reprend un code du plugin Google Like. Qu’en est-il de la faille de sécurité évoquée dans Google Like par rapport au plugin Recherche Avancée ?

  • Répondre à ce message

    24 février 11:26 , par mike

    Génial !

    Merci beaucoup !

    Ca marche !

    Par contre, pour info, en validant mon html sur w3c, il m’a déniché pas mal d’erreurs sur le formulaire, essentiellement liées à des majuscules par ci par là dans les balises !

    C’est toujours bon à savoir !

    Pour ma part, je fonctionne sans le plug-in, et j’ai remodifié les fichiers donc je n’ai pas la version corrigée mais je vous laisse ma version, si ça peut aider quelqu’un !

    <div class="formul2">

                    <form action="spip.php?page=recherche" method="get">
                    <fieldset>
                               
                            <input name='page' value='recherche' type='hidden' />
                            <input name='avancee' value='1' type='hidden' />
                           

            <!-- la chaine cherchee -->
                            <div>
                            <label>Contenant</label>
                            </div>
                            <div>
                            <input type="text" class="forml" name="recherche" id="recherche2" value="#RECHERCHE" />
                            </div>

                   


            <!-- DATE -->
                            <div>
                            <label>Date limite</label>
                            </div>
                            <div>
                            <select name="depuis">
                                    <option value="">aucune</option>
                                    <option value="7" [(#ENV{depuis}|=={91}?{"SELECTED"})]>1 semaine</option>
                                    <option value="30" [(#ENV{depuis}|=={91}?{"SELECTED"})]>1 mois</option>
                                    <option value="91" [(#ENV{depuis}|=={91}?{"SELECTED"})]>3 mois</option>
                                    <option value="182" [(#ENV{depuis}|=={182}?{"SELECTED"})]>6 mois</option>
                                    <option value="365" [(#ENV{depuis}|=={365}?{"SELECTED"})]>1 an</option>
                                    <option value="730" [(#ENV{depuis}|=={365}?{"SELECTED"})]>2 ans</option>
                                    <option value="1095" [(#ENV{depuis}|=={365}?{"SELECTED"})]>3 ans</option>
                                    <option value="1460" [(#ENV{depuis}|=={365}?{"SELECTED"})]>4 ans</option>
                                    <option value="1825" [(#ENV{depuis}|=={365}?{"SELECTED"})]>5 ans</option>
                            </select>
                            </div>
                           
            <!-- RUBRIQUE -->
       <B_surrub>
       <div>
                            <label>Département</label>
                    </div>
                    <div>
                            <select name="id_rubrique">
                                    <option value="">tous</option>
                                    <BOUCLE_surrub(RUBRIQUES){racine}>
                                            <option value="#ID_RUBRIQUE"[(#ENV{id_rubrique}|=={#ID_RUBRIQUE}?{"SELECTED"})]>#TITRE</option>
                                    </BOUCLE_surrub>
                            </select>
                    </div>
       </B_surrub>

            <!-- MOT-CLE -->
     

     
       <div>
                            <label>Limiter au mot</label>
                    </div>
                    <div>
                            <select name="id_mot" id="Select1">
                                    <option value="">tous</option>
                                    <BOUCLE_groupes2(GROUPES_MOTS){par titre}{titre!=niveaurub}>
                                    <optgroup label="#TITRE">
                                    <BOUCLE_surmot(MOTS){id_groupe}>
                                    <BOUCLE_art2 (ARTICLES) {id_mot}>
                                    </BOUCLE_art2>
                                            <option value="#ID_MOT"[(#ENV{id_mot}|=={#ID_MOT}?{"SELECTED"})]>#TITRE </option>
                                    </B_art2>
                                    </BOUCLE_surmot>
                                    </optgroup>
                                    </BOUCLE_groupes2>
                            </select>
                    </div>


           
        <div>
                            <label>Exclure le mot</label>
                    </div>
                    <div>
                            <select name="id_nomot">
                                    <option value="">aucun</option>
                                    <BOUCLE_groupes(GROUPES_MOTS){par titre}{titre!=niveaurub}>
                                    <optgroup label="#TITRE">
                                    <BOUCLE_nomot(MOTS){id_groupe}>
                                    <BOUCLE_art (ARTICLES) {id_mot}>
                                    </BOUCLE_art>
                                            <option value="#_nomot:ID_MOT"[(#ENV{id_nomot}|=={#_nomot:ID_MOT}?{"SELECTED"})]>#_nomot:TITRE</option>
                                    </B_art>
                                    </BOUCLE_nomot>
                                    </optgroup>
                                    </BOUCLE_groupes>
                            </select>
                    </div>
     

            <!-- TRIE -->
        <div>
                            <label>Trier par</label>
                    </div>
                    <div>
                            <select name="tri">
                                    <option value="points">pertinence</option>
                                    <option value="date" [(#ENV{tri}|=={date}?{"SELECTED"})]>date</option>
                                    <option value="id_rubrique" [(#ENV{tri}|=={id_rubrique}?{"SELECTED"})]>département</option>
                                    <option value="popularite" [(#ENV{tri}|=={popularite}?{"SELECTED"})]>popularité</option>
                            </select>
                    </div>

       
                            <input type="submit" class="bouton" value="Rechercher" />

            </fieldset>       
                    </form>

    </div>               

    NB : attention il n’y a plus le tri par groupe car il ne m’était pas util (tous les articles, sur mon site ont un et un seul mot de chaque groupe)

  • Répondre à ce message

    24 février 08:56 , par Viglino Jean-Marc

    re-bonjour,

    En fait, pour exclure vraiment un mot clé (même s’il est associé à d’autres mots clés), il faudrait faire une boucle avant <B_articles> dans le fichier recherche.html avec un critère doublons.

    et rajouter le critère {doublons} dans la boucle de recherche : BOUCLE_articles.

    Mais cela devient un peu lourd...

    @+

  • Répondre à ce message

    24 février 08:51 , par Viglino Jean-Marc

    Bonjour,

    En fait, "exclure mot" ne marche que si l’aticle n’est associé qu’a ce mot clé uniquement, s’il est associé à un autre mot clé dont on demande la sélection, il est sélectionné...

    désolé...

  • Répondre à ce message

    24 février 01:30 , par mike

    Salut !

    Tout d’abord merci pour ta réponse !

    Je crois qu’il y a un bug avec la fonction exclure mot clé !

    Chez moi le paramètre n’agit pas, les articles contenant ce mot apparaissent tout de même ! Pourtant la fonction limiter à un mot fonctionne très bien.

    J’ai retourné le problème dans tous les sens, à mon humble niveau, mais tout me semble bien codé pourtant.

    Suis-je seul à avoir constaté le pb ?

    Merci à vous de procéder à un test.

    Je vous tiens si je trouve une solution !

    je vais me coucher !!!!

  • Répondre à ce message

    23 février 09:26 , par Viglino Jean-Marc

    Bonjour,

    En fait, c’est plus compliqué :
    - Pour 1), il faut faire une recherche du type id_mot IN (id_mot1,id_mot2,.... Du coup, si on ne précise plus de id_mot, cela ne marche plus (l’option id_mot ? n’est plus disponible)...
    - Pour 2, ce n’est plus une recherche au sens de SPIP...

    Il faudrait écrire une fonction spécifique (une boucle sans l’option recherche et avec plusieurs id_mot). Désolé... jmv

  • Répondre à ce message

    23 février 03:58 , par mike

    Salut !

    je viens de découvrir ta contrib !

    Très bon boulot !

    J’ai cependant deux questions afin d’adapter un peu à mes besoins !

    1) Tous d’abord, sur mon site, toussont associés à un et un seul mot de chaque groupe. La recherche par groupe n’est donc pas pertinente chez moi. Par contre, serait-il possible de faire une recherche sur plusieurs mots clés en même temps ?

    exemple : j’ai un groupe de mots type et un groupe promotion Tous mes articles ont un mot clé du groupe type et un du groupe promotion . (un et un seul) Mais j’aimerais récupérer les articles par exemple de type mp3 et de la promotion 2008.

    Est-ce faisable, dans la mesure où une boucle article avec id_mot1id_mot2id_mot3 recoupe bien la préseence des 3 mots.

    2) Je reprends une question précédemment posée : la recherche vide ne renvoie aucun résultat. Serait-il possible que, dans le cas d’une recherche vide, on obtienne les articles correspondant aux autres caractéristiques ?

    Merci d’avance pour les réponses.

  • Répondre à ce message

    19 janvier 15:16 , par Maitresinh

    je me repond partiellement pour tout ceux qui voudraient l’inclure a magusine :

    Magusine remplace les deux fichiers de recherche par les siens.

    il suffit de les "ecraser" avec ceux du plugin, dans le repertoire plugins/magusine a leur emplacement respectif.

    Malheureusement si cela marche, la page de resultat elle ne correspond pas au squelette pas defaut de magusine. Reste a trouver ou ça coince....(peut etre supprimer le formatage du plugin ?)

    En tout cas merci de ce beau plugin qui permet de facto de transformer des mots clefs en outil performants.

    juste une question : et si je veux faire une recherche vide ?

    C’est a dire chercher tous les articles correspondant a : mot clef1 ET mot Clef2 ( avec ou sans selectionner de rubrique ou d’autres criteres ), quelquesoit leur contenu ? ( cela suppose au passage de pouvoir choisir 2 mots clefs)

    j’ai essayé, mais une recherche vide ne renvoie...rien. Ce qui est logique d’une certaine maniere.

Pages 1 | 2 | 3 | 4 | 5 | 6

Répondre à cet article

Retour en haut de la page

Ça discute par ici