Consulta personalizada no Views?

24

Em algum momento, descobri a necessidade de modificar uma consulta SQL gerada pelo Views, no final, views_pre_executesubstituí e alterei a consulta para essa exibição específica.

Isso parece um truque feio para mim e me pergunto se existe uma maneira mais elegante e sustentável de fazer isso. Ideal seria uma maneira que me permitisse modificar diretamente a consulta na interface do usuário do Views.

Cientista maluco
fonte
11
Depende de como você deseja modificar essa consulta. O que exatamente você estava tentando realizar?
Jason Smith
@ Jason Postei a pergunta na SO naquele momento: stackoverflow.com/questions/3147916/… Mas esse problema está resolvido agora, estou apenas procurando uma maneira elegante de modificar qualquer consulta do Views, se for necessário.
Scientist louco
Não estou convencido de que você não possa realizar o que estava tentando fazer no outro segmento, apenas usando visualizações. Dito isto, há muito mais do que uma maneira de esfolar esse gato.
Jason Smith
Se alguma das respostas abaixo são o que você está procurando, você deve aceitar um (clique a marca de seleção abaixo da contagem de votos)
Chaulky
hook_views_pre_execute pode não ser a mais elegante, mas tem o seu lugar para substituições de consultas complexas (ver Personalizado visualizações 3 consultas em Drupal 7 )
MRP

Respostas:

25

Você também pode usar hook_views_query_alter()para alterar a consulta antes de executá-la. Eu acho que isso é semelhante hook_views_pre_execute, mas facilita a modificação da consulta. Você basicamente obtém acesso a cada parte da consulta por meio de uma matriz com chave. Não encontrei muita documentação oficial, mas há um bom exemplo disso em https://www.appnovation.com/blog/using-hook-views-query-alter . Essa também é a abordagem que tive que usar para corrigir um erro de data no módulo Calendário.

Chaulky
fonte
Isso também funcionará com o Views-3?
precisa saber é o seguinte
@markdorison Eu acredito que sim, mas não confirmaram que
Chaulky
3
Confirmei que isso funciona no Views-3.
markdorison
11
@Fabian você deve aceitar essa resposta se ele foi útil para você, ou comentário sobre por que ele não foi para que possamos torná-lo melhor
Chaulky
Outro exemplo de referência para consultas do Custom Views 3 no Drupal 7 usando hook_views_pre_execute()um módulo personalizado simples.
MrP 23/05
4

Em geral, isso depende do seu caso de uso.

Se você deseja ter um campo / filtro / argumento que deve se comportar de uma certa maneira, é recomendável escrever um manipulador para ele. Consulte a ajuda avançada de visualizações para obter mais informações.

Se você deseja alterar algumas partes da consulta, também pode usar hook_views_query_alter () . A coisa ruim sobrehook_views_query_alter() é que você não pode realmente reutilizar o código lá.

Este é o código de exemplo mostrado na documentação. Ele fornece um exemplo do que o gancho pode fazer.

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' => '=',
          );
        }
      }
    }
  }
}
Daniel Wehner
fonte
3

Eu usei o hook_views_query_alter()para alterar uma consulta mysql views. O exemplo a seguir é testado no Drupal 7 com 7.x-3.0, ele adiciona uma ORDER BYcláusula personalizada à 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'
     );
   }
 }
Cyclonecode
fonte
1

Não sei se você pode alterar diretamente o sql, mas você pode escrever seu próprio manipulador de campo e criar sua própria consulta.

EricSchaefer
fonte