Cette contrib décrit un squelette qui permet de faire une recherche dans la page de recherche en limitant la recherche soit à des mots contenus dans le texte et/ou à des mots-clés, avec un résultat paginé.
Problèmatique
Il s’agit de pouvoir faire une recherche dans le texte des articles, mais en limitant éventuellement la ’zone’ de recherche à l’aide de mots-clés.
Il faut aussi que, si un seul ou aucun mot-clé n’est sélectionné, ou s’il n’y a pas de recherche sur le texte, la recherche se fasse tout de même.
On cherche ici in fine à sélectionner les articles dans une unique rubrique en fonction des mots-clés qui leur sont attribués et de leur contenu.
Le tout doit être paginé par paquets de 5 réponses.
Cette boucle ne fonctionne pas pour un couple de mots clés (ici tranche + theme) qui n’a pas d’article.
Préliminaires
Ce squelette utilise une des avancées majeures de la 1.8, le critère #ENV . Lisez la documentation si vous voulez comprendre un petit peu se qu’il se passe. Notament la notation #ENV{Tranche,antiBug} qui permet, lorsqu’il n’y a pas d’élément dans #ENV{tranche}, d’éviter une erreur dans le squelette à cause d’une recherche sur un élément vide.
Notez que vous pouvez remplacer antiBug par le nom d’un mot clé existant afin de forcer par défaut la recherche sur ce mot clé.
Dans cet exemple, la recherche porte sur deux groupes de mots clés, Tranches (il s’agit de tranches d’âges) et theme_fiche (les fiches sont classées par thèmes).
Voici un exemple de formulaire de recherche pour ce squelette :
<form action="rubrique.php3" method="get" class="formrecherche"> : le formulaire appelle la page de destination. Ici il s’agit d’une rubrique. il suffit de changer le contenu de l’élément action pour changer la page de destination. On note que la méthode (get) fait que les paramétres de recherche sont passés dans l’URL.
<input type="hidden" name="id_rubrique" value="#ID_RUBRIQUE"> : c’est ce paramètre qui permet de rester sur la même page (ici une page rubrique).
Dans cette partie, on génére la liste des mots clés du groupe Tranches, afin de remplir la zone de sélection du formulaire. La boucle _liste_theme qui suit celle-ci fait exactement la même chose.
On pourra rajouter à l’élément select un champ size="X" pour afficher X mots clés en même temps (un ascenseur permettra de faire défiler la liste des mots).
Cette partie est la reprise du code de formulaire_recherche.php3, qui se trouve dans le dossier formulaires de SPIP.
Ce second forumaire permet de recharger la page de recherche en effaçant toutes les recherches pour reprendre à zéro.
Les boucles de recherche et de pagination
La boucle d’orientation
Cette boucle permet de savoir quel(s) champs de recherche sont remplis :
Ce qui nous donne, une fois que l’on ajoute les boucles d’affichage et de pagination :
Voir la contrib de James sur la pagination pour ce qui est de la pagination.
Comment fonctionnent ces boucles (le fonctionnement est stritement le même pour ce qui est des boucles de décompte des pagination et de celles d’affichage) ?
Une fois que la boucle d’orientation à permis de déterminer quels sont les champs qui contiennent des données, les boucles qu’elle contient permettent d’afficher les informations pertinentes.
Pour aller plus loin
Il est possible d’étendre ce principe à autant de mots clés que l’on veut, mais le nombre de test à réaliser devient considérable si on ne force pas l’utilisateur à sélectionner un mot clé dans chaque groupe.
Peut-être qu’il est possible de remplir #ENV avec une valeur bidon de telle manière qu’il sélectionne tous les articles correspondants au groupe considéré.
Trouver une méthode qui permette de signaler un couple de mot clés qui ne posséde pas d’article.
On peut étendre ces boucles aux sous rubriques de la rubrique de recherche en changeant {id_rubrique} en {branche} dans les boucles.
Il faudrait trouver une méthode pour entrer dans #ENV un tableau à la place d’une variable, ce qui permettrait de faire des sélects sur plusieurs mots clés d’une même groupe :<select name="Theme" multiple title="Sélection du ou des thêmes voulus">
Je suis en train de débugguer sous SPIP1.9.2b. Ca peut marcher à condition de changer rubrique.php3 et le hidden input du numéro de rubrique en utilisant la balise #URL_PAGEtoto,id_rubrique=#ID_RUBRIQUE