rendre le module views insensible aux accents

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

bonjour,

avec views , il est possible de faire des filtrages , le probleme c'est que le systeme de recherche est sensible aux accents. Comment peut on rendre le systeme de filtrage de views insensible aux accents.

Ma base de données est sur postgresql.

Merci d'avance

Forum : 
Version de Drupal : 

bon je me réponds à moi même, voila comment je suis arrivé à le faire.
Avec le module "views", il est possible d'afficher un systeme de filtrage des champs, avec entre autres le choix pour le type de recherche tels que "strictement égal à" ou "contient au moins un des mots" etc etc. Le probleme c'est que c'est sensible aux accents et donc si dans les données on a la valeur "là banané" et que l'on tape la valeur à rechercher "la banane" et bien drupal ne trouvera pas la valeur "là banané".

Voilà donc comment j'ai fait (pour base de données POSTGRESQL):

1)je définie une fonction postgresql qui est chargée de retirer les accents:

-- Function: unaccent_string(text)
-- DROP FUNCTION unaccent_string(text);
CREATE OR REPLACE FUNCTION unaccent_string(text)
  RETURNS text AS
$BODY$
DECLARE
input_string text := $1;
BEGIN
input_string:=LOWER(input_string);
input_string := translate(input_string, 'àâãäåāăą', 'aaaaaaaa');
input_string := translate(input_string, 'èééêëēĕėęě', 'eeeeeeeeee');
input_string := translate(input_string, 'ìíîïìĩīĭÌÍÎÏÌĨĪĬ', 'iiiiiiiiiiiiiiii');
input_string := translate(input_string, 'óôõöōŏőÒÓÔÕÖŌŎŐ', 'ooooooooooooooo');
input_string := translate(input_string, 'ùúûüũūŭůÙÚÛÜŨŪŬŮ', 'uuuuuuuuuuuuuuuu');
input_string := translate(input_string, 'ÿYy', 'yyy');
input_string := translate(input_string, 'ÑñNn', 'nnnn');
input_string := translate(input_string, 'ÇçCc', 'cccc');
return input_string;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION unaccent_string(text) OWNER TO postgres;

2) ensuite je définie une fonction PHP pour retirer les accents, cette fonction direct je l'ai mise dans le fichier "\handlers\views_handler_filter_string.inc" du module "views"

function unaccent_string($string){$str=htmlentities($string,ENT_NOQUOTES,'utf-8');$str=preg_replace('#\&([A-za-z])(?:uml|circ|tilde|acute|grave|cedil|ring)\;#','\1',$str);$str=preg_replace('#\&([A-za-z]{2})(?:lig)\;#','\1',$str); $str=preg_replace('#\&[^;]+\;#','',$str);return $str;}

3) je modifie le fichier "\includes\database\database.inc" de drupal en modifiant la fonction "escapeField($field) :

  public function escapeField($field) {
    //return preg_replace('/[^A-Za-z0-9_.]+/', '', $field); // je désactive cette partie

   return  $field; // et je rajoute ce code
  }

4) on va modifier le fichier "\modules\views\handlers\views_handler_filter_string.inc" du module "views" en modifiant une ligne de la fonction "op_word($field)" (relative à l'opérateur "contains any word"), on remplace

"$where->condition($field, '%' . db_like(trim($word, " ,!?")) . '%', 'LIKE'); " par :

$where->condition('unaccent_string(' . $field . ')', '%' . unaccent_string(db_like(trim($word, " ,!?"))) . '%', 'LIKE');

une illustration :
http://www.flickr.com/photos/39689320@N08/7472842364/in/photostream/lightbox/

et voilà c'est terminé cela doit fonctionner normalement, en tout cas ca marche pour moi ( pour l'opérateur "contains any word") mais le problème c'est que c'est pas trop propre comme implémentation. Auriez-vous des propositions pour overrider les fonctions du noyau drupal et du module "views" de facon plus professionelle?

Merci d'avance