Hack com_search : recherche insensible aux accents

Imprimer Envoyer
Écrit par Fly06   
Jeudi, 10 Décembre 2009 15:08

EDIT 07/05/11 - Le hack est maintenant disponible en version J1.5 et J1.6. Le package (unzip_me_first.zip) inclue les deux versions dans des archives séparées.

Par défaut les composants com_search et com_advsearch (Beta 3 Dev) sont sensibles aux accents.

Ainsi, une recherche de 'legerete' au lieu de 'légèreté' a de grande chance de rien retourner même si 'légèreté' est présent dans les contenus du site (à moins qu’il soit orthographié 'legerete').

J'ai donc développé un hack pour com_search qui permet de résoudre ce problème.

Hack du composant com_search

Sur le plan théorique, le processus de recherche est constitué de deux étapes successives :

  1. Requêtes MySql
  2. Traitements Php

Contrairement à ce que l’on pourrait penser, le problème ne vient pas des requêtes SQL (opérateur LIKE). L'opérateur SQL like n’est pas en lui même case sensitive ou case insensitive, c'est la collation utilisée qui détermine son comportement. La collation par défaut sur une base J!1.5 étant 'utf8_general_ci', le LIKE est donc case insentive.

C’est donc bien les différents traitements réalisés (php) qui posent problèmes, dans l'ordre :

  1. Suppression du html des résultats de recherche issues de la table jos_content
  2. Extraction de la sous-chaîne à afficher dans les résultats de recherche
  3. Mise en surbrillance des mots clés (highlight)

C'est donc sur ces trois aspects du code php (com_search) qu'il a fallu intervenir pour que le hack soit 100% fonctionnel.

Sur le plan pratique, le hack concerne deux fichiers :

  1. administrator\components\com_search\helpers\search.php
  2. components\com_search\views\search\view.html.php

Pour l'appliquer, il vous suffit de suivre la procédure suivante :

  1. Faire un backup des deux fichiers d'origine
  2. Télécharger l'archive en utilisant le lien ci-contre
  3. Extraire l'archive correspondant à votre version de Joomla (1.5/1.6) à la racine de votre site Joomla

Une fois ces opérations effectuées le hack est opérationnel.

Le hack J1.5 est basé sur la version 1.5.14 mais il a été testé avec succès sur les versions plus récentes (≥ 1.5.20).

Adaptation à Fly06 Advanced Search

Après avoir résolu le problème dans com_search sous la forme d’un hack, j’ai modifié le composant com_advsearch de sorte que les données de mapping (tableau) et le code (fonctions php) les utilisant soient indépendants l'un de l'autre.

Le tableau permettant de mapper les caractères accentués sur leurs équivalents non accentués est stocké dans un fichier utf8_general_ci.php. Il permet de dupliquer les règles de la collation utf8_general_ci (mysql) au niveau des traitements php réalisés en aval.

Les traitements php sont pour l’essentiel localisés dans la classe SearchHelper du composant com_search, aussi utilisée par com_advsearch. J’ai donc écrit une classe advSearchHelper non pas héritée de searchHelper comme prévue initialement mais de JObject. Pour optimiser le traitement, j'ai en effet eu besoin de créer deux propriétés contenant pour l'une le tableau stocké dans un fichier à part encodé UTF-8 et pour l'autre un tableau de regex basé sur le premier.

Cette classe s'utilise en remplaçant chaque appel du type :

$output = SearchHelper::function( $input );

par :

$advSearchHelper = advSearchHelper::getInstance();
$output = $advSearchHelper->function( $input );

La création de ces deux tableaux est réalisée lors du premier appel de la méthode getInstance(), les appels suivants ne faisant que retourner l’instance précédemment créée.

Enfin, j'ai fait en sorte que com_advsearch puisse fonctionner dans les deux modes (sensibilité aux accents ou pas), le choix se faisant au niveau du backend.

Au final, la recherche dans les articles catégorisés (uniquement) est maintenant 100% 'Accent Insensitive' sous com_advsearch.

Mise à jour le Samedi, 07 Mai 2011 09:19
 
Créer un compte
Calculator
Login

Login



Register

Créer un compte

Question

Calculator

FRF
Fly06.Fr (C) 2009-2011