Modifier l’ordre de tri alphabétique d’une vue, selon la langue
Jacques — sam, 2013-12-28 20:38
Drupal permet de créer des sites multilingues relativement facilement. Presque tous les aspects d’un site Internet peuvent être traduits ou affichés selon la langue du lecteur.
Même si on peut tout traduire, il faut aussi souvent tenir compte de certains aspects de localisation, propre aux langues ou aux pays. Par exemple, en plus de traduire le nom des jours et des mois, il faut aussi tenir compte de l’ordre d’affichage des éléments d’une date. Ainsi, Drupal permet de localiser l’ordre d’affichage des éléments d’une date selon la langue.
Un élément de localisation qui n’est pas pris en charge par Drupal est le tri alphabétique basé sur les règles propres à une langue.
Les langues n’ont pas nécessairement le même alphabet, ou le même ordre de tri. C’est le cas de l’alphabet finlandais. Celui-ci comporte 28 caractères :
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, X, Y, Z, Å, Ä, Ö
Les lettres Å, Ä, Ö doivent être classées dans l’ordre, après la lettre Z.
Que faire dans Drupal, pour changer l’ordre d’affichage d’une liste, selon la langue?
La réponse se retrouve dans MySQL et les collations.
Une collation est un ensemble de règles permettant de comparer les caractères dans un jeu de caractères.
Il n’y a aucune interface utilisateur dans Drupal qui permet de modifier la collation d’une requête au besoin. Mais avec un peu d’aide, on peut y arriver avec la commande MySQL « COLLATE ». Celle-ci permet d’indiquer quelle collation utiliser pour une requête MySQL.
Il suffit donc d’indiquer à Drupal de modifier une requête MySQL existante afin de forcer l’utilisation d’une collation. Ainsi, pour la langue finlandaise, notre requête doit donc forcer l’utilisation de la collation : « utf8_swedish_ci » (le finlandais et le suédois partagent la même collation).
Le module Views peut générer de longues requêtes. Heureusement, la fonction hook_views_query_alter() permet de ne modifier qu’une partie de la requête. Ceci évite d’avoir à réécrire toute la requête au complet, ce qui ne serait pas vraiment efficace, sans compter ne pas rencontrer la philosophie principale de Drupal qui est de n’intervenir qu’à certains endroits pour surcharger ou remplacer une partie d’une fonctionnalité existante.
Voici un exemple d’altération d’une requête Views, ou seul un champ de tri est surchargé :
/**
* Implements hook_views_query_alter().
*
* @param type $view
* @param type $query
*
*/
function monmodule_views_query_alter(&$view, &$query) {
global $language;
if($language == 'fi') {
if ($view->name == 'mavue') {
$query->orderby[1]['field'] = 'field_data_field_monchamp COLLATE utf8_swedish_ci';
$query->orderby[1]['direction'] = 'ASC';
}
}
}
Dans cet exemple on vérifie si la langue est le finlandais avant de procéder à la surcharge. On vérifie également le nom de la vue, car notre champ de tri n’est sûrement pas utilisé dans toutes les vues.
La requête originale générée par le module Views comporte plusieurs clefs de tri. Dans notre vue, une seule clef comporte des données dont nous voulons modifier l’ordre de tri. Grâce à un print_r(), nous avons pu déterminer que la clef à surcharger était : « $query->orderby[1]['field'] = 'field_data_field_monchamp ». Notre fonction d’altération a donc pour but de remplacer cette clef de tri, qui est en fait une partie d’une requête MySQL, par la suivante :
field_data_field_monchamp COLLATE utf8_swedish_ci
Et le tour est joué. Lorsque nous affichons la page en finlandais, l’ordre de tri utilisé utilise la collation suédoise, la même collation utilisée pour le finlandais. Ainsi, grâce à notre surcharge, la lettre ä est bien classée après la lettre z.
Bien entendu, il faudra surcharger au besoin toutes autres vues, ou requêtes au besoin des langues ou des sites.
Mais que faire si le site est unilingue finlandais? Dans ce cas, ce n’est pas nécessaire de surcharger quelque code que ce soit. Il suffit de s’assurer que la base de données MySQL utilise la collation « utf8_swedish_ci ».
Ajouter un commentaire