Tips Drupal: Modifier facilement la requête d’une vue avec un module simple

Publié par Gui dans Drupal

Il m’est arrivé de vouloir modifier quelque peu la requête exécutée par une vue dans Drupal sans pouvoir le faire directement dans l’administration. En particulier pour une vue de type « Terme ». En effet, il n’est pas possible de filtrer une vue par language.

En attendant une correction, et pour d’autres applications, voici comment simplement modifier une requête grâce à un module.

Il est très simple de créer un module, vous pouvez vous reporter à ce très bon article pour voir plus en détails la procédure à suivre.

Il suffit ensuite de créer un hook (ou crochet en français ) qui est une fonction qui va se greffer sur le système de Drupal et étendre certaines de ses méthodes, en l’occurrence ici, modifier le comportement des requêtes d’une vue.

Voici donc le code à insérer pour modifier la requête d’une vue :

<?php
function alter_view_module_views_query_alter(&$view, &$query)  {
	global $language;
	$lang = $language->language;

	// Affiche les terms selon la langue courante
	if ( in_array($view->name, array('products_view_title', 'products_view')) )
	{
		$query->where[0]['clauses'][] = "language = '".$lang."' or language = ''";
	}
}

alter_view_module est le nom du module et _views_query_alter le substantif qui va dire à drupal de passer par cette fonction avant d’exécuter la requête d’une vue. La fonction prend deux paramètres :

  1. &$view: la vue courante, objet passé en référence
  2. &$query: le tableau de paramètres de la requête également passé par référence

On peut ainsi facilement accéder ensuite aux clauses, notamment la where clause, où l’ont peut ajouter un paramètre.

Il faut bien penser à restreindre cette modification à certaines vues, par une condition sur le nom de la vue, pour ne pas que la modification soit effective sur toutes les vues générées.

Et le tour est joué !

1 commentaire

  1. David

    Bonjour.
    Merci pour ce tuto, très intéressant.
    Je me demande juste ou on doit insérer votre code?

Laisser une réponse


Post shadow