Hack com_search : recherche insensible aux accents |
|
|
| É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_searchSur le plan théorique, le processus de recherche est constitué de deux étapes successives :
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 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 :
Pour l'appliquer, il vous suffit de suivre la procédure suivante :
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 SearchAprè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 : par : 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 |

