it-swarm.it

Query personalizzata in Views?

Ad un certo punto ho trovato la necessità di modificare una query SQL generata da Views, alla fine ho scavalcato views_pre_execute e ha modificato la query per quella vista specifica.

Mi sembra un brutto trucco e mi chiedo se esiste 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.

23
Mad Scientist

Puoi anche usare hook_views_query_alter() per modificare la query prima che venga eseguita. Penso che questo sia simile a hook_views_pre_execute, ma semplifica la modifica della query. Fondamentalmente 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 in 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.

25
Chaulky

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 questo. 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 negativa di 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' => '=',
          );
        }
      }
    }
  }
}
4
Daniel Wehner

Ho usato hook_views_query_alter() per modificare una query mysql viste. Il seguente esempio è testato sotto Drupal 7 con 7.x-3.0, Aggiunge una clausola ORDER BY 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'
     );
   }
 }
3
Cyclonecode

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

1
EricSchaefer