Consulta personalizada en Vistas?


24

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

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


1
Depende de cómo desea modificar esa consulta. ¿Qué estabas tratando de lograr exactamente?
Jason Smith

@Jason Publiqué la pregunta a SO en ese momento: stackoverflow.com/questions/3147916/… Pero ese problema está resuelto ahora, solo estoy buscando una forma elegante de modificar cualquier consulta de Vistas si es necesario.
Mad Scientist

No estoy convencido de que no puedas lograr lo que estabas tratando de hacer en el otro hilo simplemente usando las vistas. Dicho esto, hay mucho más que una forma de desollar a este gato.
Jason Smith

Si alguna de las respuestas a continuación es lo que estaba buscando, debe aceptar una (haga clic en la marca de verificación debajo del recuento de votos)
Chaulky

hook_views_pre_execute puede no ser el más elegante, pero tiene su lugar para anulaciones de consultas complejas (ver consultas de Vistas personalizadas 3 en Drupal 7 )
mrP

Respuestas:


25

También puede usar hook_views_query_alter()para alterar la consulta antes de que se ejecute. Creo que esto es similar a hook_views_pre_execute, pero hace que sea más fácil modificar 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 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.


¿Funcionará esto también con Views-3?
markdorison

@markdorison Creo que sí, pero no lo he confirmado
Chaulky

3
He confirmado que esto funciona en Views-3.
markdorison

1
@Fabian, deberías aceptar esta respuesta si te fue útil o comentar por qué no fue así para que podamos mejorarla
Chaulky,

Otro ejemplo de referencia para consultas de Vistas personalizadas 3 en Drupal 7 usando hook_views_pre_execute()en un módulo personalizado simple.
mrP

4

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 hook_views_query_alter()es que realmente no se puede 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' => '=',
          );
        }
      }
    }
  }
}

3

He usado el hook_views_query_alter()para modificar una consulta mysql de vistas. El siguiente ejemplo se prueba en Drupal 7 con 7.x-3.0, agrega una ORDER BYcláusula personalizada 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'
     );
   }
 }

1

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.