TUTORIEL CLIENTS WEB 
Un moteur de recherche dynamique avec HTTP Request
Mise en place d'un moteur de recherche proche de Google Suggest, affichant les résultats possibles alors même que l'utilisateur tape ses mots-clefs. (16/05/2005)
La méthode d'accès serveur transparent HTTP Request, qui combine la simplicité du JavaScript aux possibilités d'un script serveur au sein d'une seule page, gagne en popularité. Nous avions déjà abordé les principes d'utilisation de l'objet XMLHTTP de JavaScript, et l'avions illustré d'un exemple fonctionnel (lire notre article du 06/04/2005). Nous allons ici étendre notre compréhension de cet objet, en ajoutant à un champ de moteur de recherche la possibilité, avant d'envoyer une requête vers le serveur, de proposer à l'utilisateur des liens vers les pages contenant le mot (ou même une partie du mot) qu'il est en train de taper.

La base de la mise en place de XMLHTTP ayant déjà été expliquée dans notre article précédent, nous allons donc pour cet article utiliser l'approche du script LiveSearch créé par BitFlux. Ce script enrobe le code de base que nous connaissons déjà de nombreux tests, que nous expliquerons. Commençons par créer la page HTML d'où partiront les requêtes.

Le code HTML
Pour une utilisation de base, le code nécessaire est extrêmement simple. En pratique, cela permet d'intégrer très facilement le script à une interface Web déjà existante.

<head>
<title>Mes posts</title>
<script src="livesearch.js"></script>
</head>

<body onload="liveSearchInit()">
<form name="searchform">
  Recherche rapide :
  <input type="text" id="livesearch", name="q" onkeypress="liveSearchStart();" />
</form>
<div id="LSResult" style="display: none;"><div id="LSShadow"></div></div>
</body>
</html>


Par comparaison avec le code HTML de notre article précédent, il est même largement simplifié, car l'ensemble des appels JavaScript est maintenant regroupé dans un fichier externe, tandis que le formulaire ne contient plus qu'un seul champ. Dernier élément, le div LSResult contiendra les informations à afficher.

Le code PHP
Manque l'accès serveur : nous allons créer le fichier PHP qui nous permettra d'accéder à la base des articles stockés. Celui-ci, par défaut, doit être nommé livesearch.php et être placé à la racine du compte. Cela étant, il est tout à fait possible de personnaliser cela en modifier la ligne 134 de livesearch.js :

liveSearchReq.open("GET", liveSearchRoot + "/livesearch.php?q=" + document.forms.searchform.q.value + liveSearchParams);

Voici le fichier au complet :

<?php
$recherche = $_GET['q'];

$db = mysql_pconnect('localhost', 'root', '');
mysql_select_db('wordpress');

$req = "SELECT id, post_title, post_content FROM wp_posts WHERE post_content LIKE '%$recherche%' OR post_title LIKE
'%$recherche%';";
$res = mysql_query($req);
if ($res) {
  while ($row = mysql_fetch_row($res)) {
    echo "<a href='/?p=$row[0]'>$row[1]</a><br />";
    }
  }
?>


A la différence de l'exemple de notre article précédent, où l'on n'attendait qu'une réponse à la requête, nous adaptons ici le code en ajoutant une boucle while(), permettant de parcourir les résultats et de les renvoyer un a un, mis en page dans un lien HTML. Au final, en combinant ces fichiers, nous obtenons l'affichage des titres d'articles potentiellement cherchés, cliquables et placés juste sous le formulaire. Étant donné que tout ceci est placé dans des balises div, une CSS permet de remettre en question tout l'affichage.

Au coeur du script
Plongeons maintenant dans le script LiveSearch lui-même. En comparaison au script de base que nous avions présenté, celui-ci lance de nombreux tests afin de s'assurer que son comportement soit le même sous différentes configurations. Tout n'est donc pas nécessaire pour un cas donné, mais permet d'assurer une certaine portabilité et pérennité à la chose. Voici les principales fonctions développées.

La fonction liveSearchInit(), tout d'abord, activée dès que la page HTML a terminé de se charger (via l'attribut onload de la balise body), prend en compte Safari, Gecko (Mozilla) et IE pour ajouter un gestionnaire d'évènement dédié au champ du formulaire, afin de lancer une recherche dès qu'un nouveau caractère est entré (via l'évènement keydown), et cacher les résultats dès que le focus n'est plus sur le champ (via blur). Par ailleurs, il annule l'autocomplétion du champ, afin de ne pas gêner l'affichage des résultats.

  Forum

Réagissez dans les forums de JDN Développeurs

liveSearchKeyPress(event), ensuite, n'est pas utilisée dans notre exemple, met permet de se servir des touches du clavier (haut et bas) pour sélectionner un résultat. La touche Escape, de son côté, cache les résultats.

liveSearchDoSearch() est le coeur de la gestion de XMLHTTP. C'est ici que le script prend en compte les diverses données qui ont été créées par l'utilisateur, et les envoi finalement au serveur, avec la méthode send(). De la même manière que dans l'exemple de notre premier article, cette fonction fait appel à une autre, liveSearchProcessReqChange(), pour vérifier l'état du canal ouvert entre la page et le serveur.
 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page
 
 





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages