it-swarm-es.com

Consulta personalizada en Vistas?

En algún momento encontré la necesidad de modificar una consulta SQL generada por Views, al final anulé views_pre_execute y cambió la consulta para esa vista específica.

Esto se siente como un truco feo para mí y me pregunto si hay una manera más elegante y sostenible de hacerlo. Lo ideal sería una forma que me permitiera modificar directamente la consulta desde la IU de Vistas.

23
Mad Scientist

También puede usar hook_views_query_alter() para modificar la consulta antes de ejecutarla. Creo que esto es similar a hook_views_pre_execute, pero facilita la modificación de la consulta. Básicamente obtiene acceso a cada parte de la consulta a través de una matriz con clave. No he encontrado mucha documentación oficial, pero hay un buen ejemplo de esto en https://www.appnovation.com/blog/using-hook-views-query-alter . Este es también el enfoque que tuve que usar para corregir un error de fecha en el módulo Calendario.

25
Chaulky

En general, esto depende de su caso de uso.

Si desea tener un campo/filtro/argumento que debería comportarse de cierta manera, se recomienda escribir un controlador para él. Consulte la ayuda avanzada de vistas para obtener más información.

Si desea cambiar algunas partes de la consulta, también puede usar hook_views_query_alter () . Lo malo de hook_views_query_alter() es que realmente no puedes reutilizar el código allí.

Este es el código de ejemplo que se muestra en la documentación. Da un ejemplo de lo que puede hacer el gancho.

function mymodule_views_query_alter(&$view, &$query) {
  // (Example assuming a view with an exposed filter on node title.)
  // If the input for the title filter is a positive integer, filter against
  // node ID instead of node title.
  if ($view->name == 'my_view' && is_numeric($view->exposed_raw_input['title']) && $view->exposed_raw_input['title'] > 0) {
    // Traverse through the 'where' part of the query.
    foreach ($query->where as &$condition_group) {
      foreach ($condition_group['conditions'] as &$condition) {
        // If this is the part of the query filtering on title, chang the
        // condition to filter on node ID.
        if ($condition['field'] == 'node.title') {
          $condition = array(
            'field' => 'node.nid', 
            'value' => $view->exposed_raw_input['title'], 
            'operator' => '=',
          );
        }
      }
    }
  }
}
4
Daniel Wehner

He usado hook_views_query_alter() para alterar una consulta mysql de vistas. El siguiente ejemplo se prueba bajo Drupal 7 con 7.x-3.0, Agrega una cláusula personalizada ORDER BY A la consulta:

 function MYTHEME_views_query_alter(&$view, &$query) {
   // check so it's the correct view
   if($view->name == 'product_view') {
     // set a custom 'ORDER BY' clause in the query
     $query->orderby[0] = array(
       'field' => 'SUBSTR(taxonomy_term_data_name,3,4)',
       'direction' => 'ASC'
     );
     $query->orderby[1] = array(
       'field' => 'SUBSTR(taxonomy_term_data_name,1,2)',
       'direction' => 'ASC'
     );
   }
 }
3
Cyclonecode

No sé si puede cambiar directamente el sql, pero podría escribir su propio controlador de campo y elaborar su propia consulta.

1
EricSchaefer