Mayo 13, 2014
enzo
Como ya he mencionado antes Views es por mucho el modulo más popular que existe en Drupal y que afortunadamente estará en el Core de Drupal 8.
Hoy quiero mostrarle que podemos hacer cuando tenemos una vista que deseamos modificar la consulta de base de datos generada por Views sin importar si esta vista fue creada por un modulo del core, contribuido o creado mediante la interfaz de views.
Se preguntaran que cuando en necesario, bueno un buen ejemplo es que quizá deseemos que una vista se filtre de una forma para un tipo de usuario y de otra forma si la esta apreciando un usuario con un rol distinto.
Para modificar la consulta implementaremos el hook hook_views_query_alter(). Imaginemos que tenemos una content type Orders y dentro tenemo un field que se llame field_category y deseamos que dependiendo del Role del usuario mostremos los productos asociados a ciertos Taxonomy Terms.
Veamos la implementación
/**
* Implements hook_views_api().
*/
function MIMODULO_views_query_alter(&$view, &$query) {
global $user;
if ($view->name == 'YOUR_VIEW_NAME') {
//if($view->exposed_raw_input['state'] == 'scheduled_published') {
foreach ($query->where as &$condition_group) {
foreach ($condition_group['conditions'] as &$condition) {
if ($condition['field'] == 'field_data_field_category.field_categoty_tid) {
if (in_array('Sales', array_values($user->roles))) {
$condition['value'][0] = array(47,48,49,50);
$condition['operator'][0] = 'IN';
}
else {
$condition['value'][0] = array(46);
$condition['operator'][0] = '=';
}
}
}
}
//}
}
}
Como se aprecia en el código lo primero que debemos hacer es validar sobre que vista vamos a realizar el cambio indicando el nombre de la vista:
if ($view->name == 'YOUR_VIEW_NAME') {
//if($view->exposed_raw_input['state'] == 'published') {
Adicionalmente podríamos verificar algún valor especifico de los filtros expuestos de la vista y asi solo cambial la consulta bajo condiciones especificas.
Como se aprecia el hook recibe por referencia el objeto $query que podemos modificar a nuestro gusto. En nuestro ejemplo hacemos un recorrido por la sección del Where de la consulta y revisando cada condición hasta encontrar la que se refiere al campo field_data_field_category.field_categoty_tid como se ve en el siguiente código.
foreach ($query->where as &$condition_group) {
foreach ($condition_group['conditions'] as &$condition) {
if ($condition['field'] == 'field_data_field_category.field_categoty_tid) {
}
}
}
Cuando ya hemos identificado la condición que deseamos modificar, solo verificamos a que Role pertenece el usuario actual y decidimos si hacemos una condición con el operador IN or el operador ’=’ como se puede apreciar a continuación.
if (in_array('Sales', array_values($user->roles))) {
$condition['value'][0] = array(47,48,49,50);
$condition['operator'][0] = 'IN';
}
else {
$condition['value'][0] = array(46);
$condition['operator'][0] = '=';
}
Espero que haya sido de su agrado