Mayo 30, 2014
enzo
Drupal es conocido por ejecutar una gran cantidad de consultas a las base de datos, y como era de esperarse en nuestros proyectos nos encontramos con la necesitas de querer modificar ciertas consultas a la base de datos para cumplir con nuestras necesidades.
Como el mandamiento #1 de Drupal es “Don’t hack the core” y que aplicar también para los módulos contribuidos, nos podemos cuestionar y ahora que hago que opciones tengo.
Hoy voy a mostrarle como aplicar estos cambios mediante los Tags que se pueden aplicar a nuestras consultas.
- Metodo AddTag.
Cuando realizamos una consulta a la base de datos, pero queremos permitir que otros módulos puedan manipular nuestra consulta de una forma fácil podemos hacer uso del método AddTag, este tag es un indicador de que deseamos permitir que los módulos apliquen una lógica deseada. Veamos un ejemplo a continuación.
<?php
$query = db_select('node', 'n')
->fields('n', array('nid', 'title', 'status'))
->condition('type', 'info_page')
->addTag('node_access')
->execute();
while ($result = $query->fetch()) {
print_r($result);
}
Como se puede apreciar el Tag Node Access se ha agregado al query como meta data, que permitirá que otros módulos agreguen o quiten cosas del query antes de ser ser ejecutado. La etiquete node_access es arbitraria y puede ser usado cualquier tag que se nos ocurra, los módulos interesados deberán conocer el tag apropiado para poder capturarlo.
- Capturando los Query Tag.
Para poder procesar los Tags nuestro módulos deben implementar el hook hook_query_alter(), veamos el ejemplo a continuación.
/**
* Implements hook_query_alter().
*/
function MIMODULO_query_alter(QueryAlterableInterface $query) {
$view_name = 'waterbed';
if ($query->hasTag('views_' . $view_name)) {
$query->groupBy('nid');
}
}
La implementación del hook recibe un objeto de tipo QueryAlterableInterface sobre el cual debemos efectuar nuestras modificaciones. En el ejemplo usamos el método hasTag para verificar que solo estamos afectando las consultas de nuestro interés y así evitar comportamientos extraños en nuestro sitio.
Como se puede ver el Tag que estamos usando es una combinación del prefijo ‘views_’ y un nombre de vista que en este caso es ‘waterbed’, esto es porque el modulo de Views agrega un tag con el nombre de la Vista para permitir este tipo cambios.
En el ejemplo el cambio aplicado es agregar un GroupBy sobre el campo NID en esa visa especifica.
Espero que haya sido de su agrado.