Niestandardowe zapytanie w widokach?

24

W pewnym momencie zauważyłem potrzebę zmodyfikowania zapytania SQL wygenerowanego przez Views, w końcu przesłoniłem views_pre_executei zmieniłem zapytanie dla tego konkretnego widoku.

Wydaje mi się to brzydkim hackiem i zastanawiam się, czy istnieje bardziej elegancki i łatwy do utrzymania sposób. Idealny byłby sposób, który pozwoliłby mi bezpośrednio modyfikować zapytanie z interfejsu użytkownika Widoków.

Szalony naukowiec
źródło
1
To zależy od tego, jak chciałbyś zmodyfikować to zapytanie. Co dokładnie próbowałeś osiągnąć?
Jason Smith
@Jason W tym czasie wysłałem pytanie do SO: stackoverflow.com/questions/3147916/... Ale ten problem został już rozwiązany. Po prostu szukam eleganckiego sposobu na zmodyfikowanie dowolnego zapytania w Widoku, jeśli zajdzie taka potrzeba .
Szalony naukowiec
Nie jestem przekonany, że nie możesz osiągnąć tego, co próbowałeś zrobić w innym wątku, używając tylko widoków. To powiedziawszy, istnieje więcej niż jeden sposób na skórowanie tego kota.
Jason Smith
Jeśli któraś z poniższych odpowiedzi jest tym, czego szukasz, powinieneś ją zaakceptować (kliknij znacznik wyboru poniżej liczby głosów)
Chaulky
hook_views_pre_execute może nie być najbardziej elegancki, ale ma swoje miejsce w przypadku skomplikowanych przesłonięć zapytań (patrz zapytania Custom Views 3 w Drupal 7 )
mrP

Odpowiedzi:

25

Możesz także użyć hook_views_query_alter()do zmiany zapytania przed jego uruchomieniem. Myślę, że jest to podobne do hook_views_pre_execute, ale ułatwia modyfikację zapytania. Zasadniczo uzyskujesz dostęp do każdej części zapytania za pomocą tablicy z kluczami. Nie znalazłem wiele oficjalnej dokumentacji, ale jest całkiem dobry przykład na https://www.appnovation.com/blog/using-hook-views-query-alter . Takie podejście musiałem zastosować, aby naprawić błąd daty w module Kalendarz.

Chaulky
źródło
Czy to będzie działać również z Views-3?
markdorison
@markdorison Wydaje mi się, że tak, ale jeszcze tego nie potwierdziłem
Chaulky
3
Potwierdziłem, że działa to w Widoku 3.
markdorison
1
@Fabian powinieneś zaakceptować tę odpowiedź, jeśli była dla Ciebie przydatna, lub skomentować, dlaczego nie była, abyśmy mogli ją ulepszyć
Chaulky
Kolejne przykładowe odniesienie do zapytań Custom Views 3 w Drupal 7 wykorzystujących hook_views_pre_execute()prosty moduł niestandardowy.
mrP
4

Zasadniczo zależy to od przypadku użycia.

Jeśli chcesz mieć pole / filtr / argument, które powinny zachowywać się w określony sposób, zalecamy napisanie dla niego procedury obsługi. Aby uzyskać więcej informacji, zobacz zaawansowaną pomoc widoków.

Jeśli chcesz zmienić niektóre części zapytania, możesz także użyć hook_views_query_alter () . Złe hook_views_query_alter()jest to, że tak naprawdę nie można ponownie użyć kodu.

To jest przykładowy kod pokazany w dokumentacji. Daje przykład tego, co potrafi hak.

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
źródło
3

Użyłem hook_views_query_alter()do zmiany kwerendy mysql widoków. Poniższy przykład jest testowany pod Drupalem 7 7.x-3.0, dodaje niestandardową ORDER BYklauzulę do zapytania:

 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'
     );
   }
 }
Kod cyklonowy
źródło
1

Nie wiem, czy możesz bezpośrednio zmienić kod SQL, ale możesz napisać własną funkcję obsługi pola i stworzyć własne zapytanie.

EricSchaefer
źródło