Query personalizzata in Views?


24

Ad un certo punto ho scoperto la necessità di modificare una query SQL generata da Views, alla fine ho annullato views_pre_executee ho modificato la query per quella vista specifica.

Mi sembra un brutto trucco e mi chiedo se ci sia un modo più elegante e sostenibile per farlo. L'ideale sarebbe un modo che mi consenta di modificare direttamente la query dall'interfaccia utente di Views.


1
Dipende da come si desidera modificare quella query. Cosa stavi esattamente cercando di realizzare?
Jason Smith

@Jason Ho pubblicato la domanda a SO in quel momento: stackoverflow.com/questions/3147916/… Ma quel problema è stato risolto ora, sto solo cercando un modo elegante per modificare qualsiasi query Views, se necessario.
Mad Scientist

Non sono convinto che non puoi realizzare ciò che stavi cercando di fare nell'altro thread semplicemente usando le viste. Detto questo, c'è molto più di un modo per scuoiare questo gatto.
Jason Smith

Se una delle risposte di seguito è quella che stavi cercando, dovresti accettarne una (fai clic sul segno di spunta sotto il conteggio dei voti)
Chaulky

hook_views_pre_execute potrebbe non essere il più elegante, ma ha il suo posto per complesse sostituzioni di query (vedi query Visualizzazioni personalizzate 3 in Drupal 7 )
mrP

Risposte:


25

È inoltre possibile utilizzare hook_views_query_alter()per modificare la query prima che venga eseguita. Penso che questo sia simile hook_views_pre_execute, ma rende più semplice modificare la query. In pratica si ottiene l'accesso a ciascuna parte della query tramite un array con chiave. Non ho trovato molta documentazione ufficiale, ma ne esiste un buon esempio su https://www.appnovation.com/blog/using-hook-views-query-alter . Questo è anche l'approccio che ho dovuto usare per correggere un bug di data nel modulo Calendario.


Funzionerà anche con Views-3?
markdorison,

@markdorison Credo di si, ma non l'ho confermato
Chaulky

3
Ho confermato che funziona in Views-3.
markdorison,

1
@Fabian dovresti accettare questa risposta se ti è stata utile, o commentare il motivo per cui non è stato così possiamo renderlo migliore
Chaulky

Un altro riferimento di esempio per le query Custom Views 3 in Drupal 7 utilizzando hook_views_pre_execute()in un semplice modulo personalizzato.
sig.

4

In generale, questo dipende dal caso d'uso.

Se si desidera avere un campo / filtro / argomento che dovrebbe comportarsi in un certo modo, si consiglia di scrivere un gestore per esso. Consulta la guida avanzata delle visualizzazioni per ulteriori informazioni.

Se vuoi cambiare alcune parti della query puoi anche usare hook_views_query_alter () . La cosa brutta hook_views_query_alter()è che non puoi davvero riutilizzare il codice lì.

Questo è il codice di esempio mostrato nella documentazione. Fornisce un esempio di cosa può fare il gancio.

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

Ho usato il hook_views_query_alter()per modificare una query mysql viste. L'esempio seguente viene testato in Drupal 7 con 7.x-3.0, aggiunge una ORDER BYclausola personalizzata alla query:

 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

Non so se è possibile modificare direttamente sql, ma è possibile scrivere il proprio gestore di campo e creare la propria query.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.