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.


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.


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' => '=',
          );
        }
      }
    }
  }
}

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'
     );
   }
 }

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.