Benutzerdefinierte Abfrage in Ansichten?

24

Irgendwann stellte ich fest, dass eine von Views generierte SQL-Abfrage views_pre_executegeändert werden musste. Am Ende habe ich die Abfrage für diese bestimmte Ansicht überschrieben und geändert.

Das fühlt sich für mich wie ein hässlicher Hack an und ich frage mich, ob es einen eleganteren und wartbareren Weg gibt, das zu tun. Ideal wäre eine Möglichkeit, mit der ich die Abfrage über die Ansichts-Benutzeroberfläche direkt ändern kann.

Verrückter Wissenschaftler
quelle
1
Dies hängt davon ab, wie Sie diese Abfrage ändern möchten. Was genau haben Sie versucht zu erreichen?
Jason Smith
@Jason Ich habe die Frage zu diesem Zeitpunkt an SO gesendet : stackoverflow.com/questions/3147916/… Aber das Problem ist jetzt behoben. Ich suche nur nach einer eleganten Möglichkeit, um eine Views-Abfrage zu ändern, wenn ich muss.
Mad Scientist
Ich bin nicht davon überzeugt, dass Sie nicht erreichen können, was Sie im anderen Thread versucht haben, indem Sie nur Ansichten verwenden. Das heißt, es gibt weit mehr als eine Möglichkeit, diese Katze zu häuten.
Jason Smith
Wenn eine der folgenden Antworten
Ihren Wünschen entspricht
hook_views_pre_execute mag nicht die eleganteste sein, aber es hat seinen Platz für komplexe Überschreibungen von Abfragen (siehe Benutzerdefinierte Ansichten 3 Abfragen in Drupal 7 )
mrP

Antworten:

25

Sie können hook_views_query_alter()die Abfrage auch ändern, bevor sie ausgeführt wird. Ich denke, dass dies ähnlich ist hook_views_pre_execute, aber es einfacher macht, die Abfrage zu ändern. Grundsätzlich erhalten Sie Zugriff auf jeden Teil der Abfrage über ein verschlüsseltes Array. Ich habe nicht viel offizielle Dokumentation gefunden, aber es gibt ein ziemlich gutes Beispiel dafür unter https://www.appnovation.com/blog/using-hook-views-query-alter . Dies ist auch der Ansatz, den ich verwenden musste, um einen Datumsfehler im Kalendermodul zu beheben.

Chaulky
quelle
Funktioniert das auch mit Views-3?
Markdorison
@ Markdorison Ich glaube schon, aber ich habe das nicht bestätigt
Chaulky
3
Ich habe bestätigt, dass dies in Views-3 funktioniert.
Markdorison
1
@Fabian Sie sollten diese Antwort akzeptieren, wenn es für Sie nützlich war, oder kommentieren, warum es nicht so war, damit wir es besser machen können
Chaulky
Ein weiteres Referenzbeispiel für Custom Views 3-Abfragen in Drupal 7 mit hook_views_pre_execute()einem einfachen benutzerdefinierten Modul.
mrP
4

Im Allgemeinen hängt dies von Ihrem Anwendungsfall ab.

Wenn Sie ein Feld / Filter / Argument haben möchten, das sich auf eine bestimmte Weise verhalten soll, wird empfohlen, einen Handler dafür zu schreiben. Weitere Informationen finden Sie in der erweiterten Hilfe der Ansichten.

Wenn Sie einige Teile der Abfrage ändern möchten, können Sie auch hook_views_query_alter () verwenden . Das Schlimme daran hook_views_query_alter()ist, dass Sie den Code dort nicht wirklich wiederverwenden können.

Dies ist der in der Dokumentation gezeigte Beispielcode. Es gibt ein Beispiel dafür, was der Hook kann.

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
quelle
3

Ich habe die verwendet hook_views_query_alter(), um eine Ansicht MySQL-Abfrage zu ändern. Das folgende Beispiel wurde unter Drupal 7 mit getestet 7.x-3.0und fügt ORDER BYder Abfrage eine benutzerdefinierte Klausel hinzu :

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

Ich weiß nicht, ob Sie die SQL direkt ändern können, aber Sie könnten Ihren eigenen Feld-Handler schreiben und Ihre eigene Abfrage erstellen.

EricSchaefer
quelle