Extensions Joomla :: com_advsearch insensible aux accents !
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').
Le processus de recherche est constitué de deux étapes successives :
- Requêtes MySql
- 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 :
- Suppression du html des résultats de recherche issues de la table jos_content
- Extraction de la sous-chaîne à afficher dans les résultats de recherche
- Mise en surbrillance des mots clés (highlight)
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.
NB : Ce billet fait suite à cette discussion du forum Joomla! Francophone.
| < Précédent | Suivant > |
|---|


