Recherche avancée - Sans Mots-clés

Comment créer son moteur de recherche avancée, sous spip, en utilisant les contenus des champs sql... Ou comment se passer des mots-clés dans son moteur de recherche.
IMPORTANT - ATTENTION : Nous espérons que d’autres développeurs plus chevronés nous aident à en faire un plugin propre.

J’ai parcouru le site (de façon non-exhaustive, je le crains) et je n’ai pas trouvé de contribution similaire à celle que je vais soumettre ici.

J’aurais souhaité que cette contribution soit le début de la création d’un plugin (chose que je ne sais pas faire) ou plutôt, de l’évolution d’un plugin existant (chose que je ne sais pas faire non plus).

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

Dans le cadre d’un portail spip que je développe, j’ai utilisé le plugin Import CSV pour importer de nombreux articles dans ma base de données (environ 800). Or il m’était impossible d’importer, en même temps, les mots-clés liés à chaque article et il était hors de question de saisir un à un les mots-clés de chaque article puisque le contenu de la base change à peu près chaque mois.

J’ai compris, qu’en principe, n’importe quel champ (qui ne soit susceptible de prendre qu’un nombre fini de valeurs), dans n’importe quelle table sql, représentait, potentiellement, un groupe précis de mots-clés bien identifiables.

Par conséquent, j’ai entrepris de modifier le plugin « Recherche Avancée 5 » 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, à modifié directement le squelette, à défaut d’avoir réussi, 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és 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, dans un premier temps, à copier les fichiers suivants, dans un répertoire /squelettes, à la racine du site : squelettes-dist/recherche.html, squelettes-dist/formulaires/recherche.html et squelettes-dist/formulaires/recherche.php. Il suffit, ensuite, de les modifier en suivant ces exemples :

POUR LE FICHIER : squelettes/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 champ « 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/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 introduites)...

[(#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/formulaires/recherche.php

Il faut 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 champ, et fonctionnel sur toutes les tables sql existant dans la base... It is good !

Mesdemoiselles, Mesdames, Messieurs... J’attends vos commentaires et vos propositions sur une création de plugin.

Une bonne partie des scripts présentés ici ont été adaptés à partir du plugin « Recherche Avancée 5 » de Viglino Jean-Marc. Voir ici : http://www.spip-contrib.net/Recherche-avancee-sous-SPIP

Regarder le moteur de recherche à l’action ICI

Discussion

11 discussions

  • Adrien Combeau

    Bonjour,

    Il manque tout de même quelque chose d’important pour que le tout fonctionne correctement (peut-être ton système fonctionnait correctement avant la 2.0)

    Dans la page recherche.html (celle qui affiche les résultats, pas le formulaire...), il faut ajouter un nouveau filtre à la boucle concernée afin que le critère que tu lui transmet à l’aide de ton formulaire modifié soit interprété. En respectant ton exemple, ça donnerait :

    <BOUCLE_articles(ARTICLES) {recherche?} {descriptif?}{par points}{inverse} {pagination}>
    	<li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>
    </BOUCLE_articles>

    Dans cet exemple, j’ai mis «  ? » après le critère traditionnel « recherche » et après « descriptif ». Cela permet de traiter tout de même la recherche, même si un seul des deux champs est complété...

    Bien à vous !

    Répondre à ce message

  • Voici, encore, une de mes réponses tardives... Il faut que tu créés un squelette recherche2.html et que tu appelles ce squelette dans tes autres squelettes. Maintenant, pour ce qui concerne la façon de créer la balise de recherche qui te permettra d’appeler ton squelette, jette un coup d’oeil sur cette doc : http://www.spip.net/fr_article903.html

    Répondre à ce message

  • Mickael

    Bonjour mtfkarukera
    Merci cette réponse.
    Mais non, en fait l’idée c’est d’avoir 2 formes de recherche distinctes : dans l’entete de toutes les pages du site un champ de recherche simple qui exclut un secteur spécifique, et une page de « recherche avancée » qui restreint la recherche à un secteur spécifique et à certains champs extras.
    Or le fait d’avoir d’avoir placé le fichier recherche.html dans le répertoire « squelettes/formulaires » altère le champ de recherche simple.
    Donc la questions serait plutôt comment faire une recherche avancée en utilisant un autre nom de squelette que « recherche.html » ou bien comment faire un formulaire de recherche avancée qui renvoie vers une page resultat-recherche-avancee.html au lieu de recherche.html
    En espérant être clair.
    Merci bcp

    Répondre à ce message

  • 1
    Mickael

    Bonjour
    Bravo et merci pour ce tuto. Ca m’est vraiment très précieux.
    Je bute à présent sur un nouveau problème :
    Comment peut-on distinguer « recherche » de « recherche avancée » de telle sorte qu’on puisse utiliser le moteur de recherche natif de SPIP en mode simple et/ou utliser la recherche avancée sur un autre squelette en mode « recherche avancée » ?
    Auriez-vous une idée de la méthode pour obtenir deux modes recherche ?
    Merci bcp

    • Bonjour Mickael,

      Si je l’ai bien comprise, ta question n’est pas en lien avec le plugin, mais plutôt liée au squelette. C’est justement en lien avec ce qui m’était dit précédemment. Ce tuto répond-t-il à ta demande ?

      http://www.spip.net/fr_article3347.html

      Sinon... Le moteur de recherche, dans sa présente version, permet déjà une utilisation en mode simple et une utilisation en mode avancé. Si aucun critère de « filtre » n’est sélectionné, le moteur de recherche se comporte comme le moteur natif de spip.

    Répondre à ce message

  • Bonjour Livier,

    Toutes mes excuses pour cette réponse très tardive. Je vais essayer de répondre, au mieux, à tes questions et je te remercie pour tes encouragements, que je perçoit en tant que tel, d’ailleurs.

    Pour commencer, il faut, oui, travailler avec le dossier /squellettes. Les champs que j’utilise me sont propres. Il vaudrait mieux que tu t’intéresses au code que je donne dans l’article, à titre d’exemple.

    Dans mon moteur de recherche, le champs #DESCRIPTIF contient des informations sur le CODE NSF des formations, mais cela ne te sera d’aucune utilité. Tu peux lui attribuer le label de ton choix (par exemple « TYPE DE NOIX DE COCO », « MOLECULE ACTIVE », « TAILLE DES BOUTONS DE FIEVRE » et j’en passe, selon ton intérêt. Il faut juste sélectionner le champs sql qui contient l’information que tu veux « filtrer » dans ta recherche. Ce peux être, aussi, un champs extra que tu aurais créé.

    Oui, dans la page de résultat, je n’ai changé que le fil d’ariane.

    Dans le fichier php, ce bout de code permet, si mes souvenirs sont bons (c’est Gaston qui l’a trouvé), de retenir le choix effectué dans l’environnement.

    Voilà, n’hésites pas à me demander plus d’infos.

    Répondre à ce message

  • Bonjour,

    Je me suis inspiré de ton article, mais sans le comprendre entièrement ... et pour faire une recherche avancée utilisant mot clef et rubrique ;-)

    Peux tu nous dire plus précisément ce que font les éléments de code que tu nous offre ?
    -  Dans le formulaire tu semble t’intéresser au DESCRIPTIF de chaque article (C’est quoi le code NSF ?)
    -  dans la page de résultat tu ne changes que le fil d’Arianne ?!?
    -  dans le fichier recherche.php, je ne comprend pas ce que tu fais :(
    Même sans faire un plugin, tu peux encore nous aider, mais n’appelle pas ton zip « plugin ... » mais « exemple... »

    Effectivement comme dit Phil, on doit mettre ces fichiers dans le répertoire « squelettes » qui est fait pour ça, l’explication dans ton article en sera simplifiée par rapport aux précautions que tu nous y donne actuellement.

    Ces petites critiques sont des encouragements ...

    Répondre à ce message

  • mtfkarukera

    Phil, c’est bon. Je me suis documenté sur ce dossier /squelettes. En effet, c’est tout à fait ce qu’il faut faire. Je vais modifier le texte en fonction de cela. Je te remercie.

    Romy, j’ai parlé de recherche « sans mot-clés » car, jusqu’ici, toutes les contribution que j’ai trouvé, autour de la création d’un moteur de recherche, consistait à exploiter la fonctionnalité « mots-clés » de spip. Le fait est que, dans le cas présent, il n’était pas possible, pour moi, de les utiliser (pas de façon aisée, en tout cas). J’ai dû faire « sans mots-clés ».

    En définitive, le moteur de recherche « sans mot-clés » est un moteur de recherche qui ne se base pas sur la fonctionnalité « mots-clés » de spip pour faire une recherche avancée.

    Je ne pense pas non-plus, si c’est bien ce que tu suggères, que cette appellation soit la plus adéquate. Je crois même avoir utilisé, en d’autres occasions, d’autres termes pour le décrire.

    Que proposerais-tu comme appellation ? J’avoue ne pas en être satisfait non-plus...

    Répondre à ce message

  • Romy Têtue

    Qu’est-ce qu’une « recherche sans mots-clés » ???

    Répondre à ce message

  • mtfkarukera

    Salut Phil,

    Excuse mon ignorance, mais je ne connais pas ce répertoire. Je ne l’ai pas dans mon répertoire spip.

    Tu peux m’expliquer s’il te plaît. C’est quoi ce répertoire ? Faut-il le créer ? Comment reparamétré spip en fonction ? Quelles utilisations peut-on en faire ?

    Je te remercie.

    @+

    Répondre à ce message

  • on n’est pas obligé de modifier le squelette de spip
    il suffit de copier les fichiers dans /squelettes et les repertoires équivalents et il n’y a aucun risque

    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