com_search joomla 2.5 recherche sans accents

Faire une recherche sous joomla avec le composant com_search pose un véritable problème : la recherche ne retourne pas le même nombre de résultats si le mot recherché est avec ou sans accents... après moult recherches sur internet sans trop de succès, j'ai enfin pu résoudre ce problème :

ATTENTION : cette méthode est très certainement optimisable (c'est même sûr), mais je n'ai pas le temps de le faire moi-même.

Alors, il y a 3 choses simples à faire :

1-retirer l'appel de la fonction "checkNoHTML" qui pose problème au niveau des accents : je suis sur qu'il suffirait de modifier quelques lignes pour que ce soit pleinement fonctionnel, mais une fois encore, je préfère retirer tout l'appel à la fonction ( de plus, le mot recherché est parsé, et les requêtes sql sont déjà sécurisées, donc il y a déjà une sécurité)

OU EST APPELE "checkNoHTML" ? la ou se forme les requêtes sql pour la recherche :

Il suffit d'aller dans le répertoire (en partant de la racine du site) 'plugins/search/repertoires-en-fonction-des-composants-installes-sur-le-site'. En effet, si j'ai le composant 'Docman' et 'Jevents' installés sur mon site, par exemple, ET que les plugins de recherches associés à ces composants sont installés, il faudrait que j'aille dans les deux répertoires 'plugins/search/docman/docman.php' et 'plugins/search/eventsearch/eventsearch.php' pour commenter les 2 lignes suivantes :

 


 

foreach($row as $key => $article) {
// if (searchHelper::checkNoHTML($article, $searchText, array('text', 'title', 'metadesc', 'metakey'))) {
$new_row[] = $article;
// }
}

 


Certains plugins de ces composants n'utilisent pas checkNoHTML... dans ce cas, tout va bien :)

 

2-dans chaque plugin

(dans le dossier précédent donc, plugins/search/(docman||eventsearch||content||categories||etc...)

mettre une fonction 'suppr_accents' qui supprime les accents du mot que vous rentrez dans la barre de recherche : oui, je sais, je définis la fonction dans chaque plugin, je suis sûr et certain qu'on pourrait la définir une seule fois et l'appeler dans chaque plugin, alors que moi, je la définis et je l'utilise dans chaque plugin, mais pareil, je n'ai pas plus de temps à consacrer à ce sujet.

 

Alors, en règle générale, le fichier situé dans les plugins défini une classe (le plugin 'content/content.php') défini par exemple, la classe 'plgSearchContent'

DANS CETTE CLASSE (mais il faudra faire pareil dans tout les autres plugins) définissez la fonction 'suppr_accents' :

 


function suppr_accents($str)
{
$avant = array('À','Á','Â','Ã','Ä','Å','A','A','A','A','?','Æ','?',
'Ç','C','C','C','C','Ð','D','Ð',
'É','È','Ê','Ë','E','E','E','E','E','G','G','G','G',
'H','H','Ì','Í','Î','Ï','I','I','I','I','I','l','l','l','?','l','I','?','J','K','L','L','L','?','L',
'N','N','N','Ñ','Ò','Ó','Ô','Õ','Ö','O','O','O','O','O','Ø','?','Œ','R','R','R',
'S','S','S','Š','T','T','T','U','Ù','Ú','Û','Ü','U','U','U','U','U','U','U','U','U','U','U',
'W','Ý','Y','Ÿ','Z','Z','Ž',
'à','á','â','ã','ä','å','a','a','a','a','?','æ','?','ç','c','c','c','c','d','d',
'è','é','ê','ë','e','e','e','e','e','g','g','g','g','h','h',
'ì','í','î','ï','i','i','i','i','i','i','?','j','k',
'ñ','n','n','n','?','ò','ó','ô','õ','ö','o','o','o','o','o','ø','?','œ',
'r','r','r','s','s','s','š','ß','t','t','t',
'ù','ú','û','ü','u','u','u','u','u','u','u','u','u','u','u','u','w','ý','ÿ','y','z','z','ž','ƒ','?');
$apres = array('A','A','A','A','A','A','A','A','A','A','A','AE','AE',
'C','C','C','C','C','D','D','D',
'E','E','E','E','E','E','E','E','E','G','G','G','G',
'H','H','I','I','I','I','I','I','I','I','I','I','I','I','I','I','I','IJ','J','K','L','L','L','L','L',
'N','N','N','N','O','O','O','O','O','O','O','O','O','O','O','O','OE','R','R','R',
'S','S','S','S','T','T','T','U','U','U','U','U','U','U','U','U','U','U','U','U','U','U','U',
'W','Y','Y','Y','Z','Z','Z',
'a','a','a','a','a','a','a','a','a','a','a','ae','ae','c','c','c','c','c','d','d',
'e','e','e','e','e','e','e','e','e','g','g','g','g','h','h',
'i','i','i','i','i','i','i','i','i','i','ij','j','k',
'n','n','n','n','n',
'o','o','o','o','o','o','o','o','o','o','o','o','oe',
'r','r','r','s','s','s','s','s','t','t','t',
'u','u','u','u','u','u','u','u','u','u','u','u','u','u','u','u','w','y','y','y','z','z','z','f','s');
return str_replace($avant, $apres, $str);
}


 

et utilisez la dans la méthode 'onContentSearch' au moment ou l'on utilise la variable $text, qui correspond à la chaîne de caractère que vous avez rentrés dans la barre de recherche en faisant ceci :

 

 


 

function onContentSearch($text, $phrase='', $ordering='', $areas=null)
{
$db        = JFactory::getDbo();
$app    = JFactory::getApplication();
$user    = JFactory::getUser();
$groups    = implode(',', $user->getAuthorisedViewLevels());
$tag = JFactory::getLanguage()->getTag();

require_once JPATH_SITE.'/components/com_content/helpers/route.php';
require_once JPATH_SITE.'/administrator/components/com_search/helpers/search.php';
$text=$this->suppr_accents($text);//ligne de code rajouté

...blablabla

}

 


 

 

certains composants (comme docman) n'utilisent pas de classe, mais juste des fonctions, donc pour docman par exemple, appelez la fonction comme suit :

 

 

 


$text=suppr_accents($text);

 

 

 


 

et enfin troisième étape très importante : encodez vos fichiers plugins en utf-8 : moi, j'utilise notepad ++ (comment ca, ca ne fait pas professionnel ? oO ) et pour chaque fichier plugin qu'on a précédemment modifiés, aller dans l'onglet 'encodage', ils sont de base en 'ANSI', et les passer en 'UTF-8 (sans BOM)'

 

AINSI vos recherches ne sont plus sensibles à la casse, et votre composant com_search tient la route :) (bon, la prochaine fois, je proposerai une meilleure alternative, mais là, je ne peux pas consacrer plus de temps à ce problème.)

 

Voila, en espérant que ca vous serve autant qu'à moi,

 

@ +

 

Commentaires 4

Guest - Farafra

le vendredi 25 mai 2012 09:41

Bizarre de devoir gérer ce problème en php, normalement c'est laissé à mysql.
Quelles sont les collations des champs de la base, utf8_bin ou utf8_general_ci ?

Bizarre de devoir gérer ce problème en php, normalement c'est laissé à mysql. Quelles sont les collations des champs de la base, utf8_bin ou utf8_general_ci ?

Guest - kaking

(website) le vendredi 25 mai 2012 09:51

mes champs sont bien en utf8_general_ci, mais le problème reste entier si les fichiers sont encodés en ANSI

mes champs sont bien en utf8_general_ci, mais le problème reste entier si les fichiers sont encodés en ANSI

Guest - Farafra

le vendredi 25 mai 2012 10:09

Si tu envoies des données en ansi pour matcher des chaines de caractère en utf-8, je suis d'accord avec toi ça ne peut pas marcher s'il y a des accents.
Mais comme tu sembles les envoyer en utf-8 sur des champs en general_ci j'avoue ne pas comprendre le comportement de joomla.

Si tu envoies des données en ansi pour matcher des chaines de caractère en utf-8, je suis d'accord avec toi ça ne peut pas marcher s'il y a des accents. Mais comme tu sembles les envoyer en utf-8 sur des champs en general_ci j'avoue ne pas comprendre le comportement de joomla.
Already Registered? Login Here
Guest
dimanche 26 janvier 2020

Image Captcha