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.