it-swarm.com.de

Programmgesteuertes Hinzufügen von Argumenten zur Ansicht, die bereits einen Kontextfilter verwendet

Ich habe eine Ansicht, die die ID des aktuell angemeldeten Benutzers als Kontextfilter verwendet. Dies wurde mit der Benutzeroberfläche Drupal UI) festgelegt und funktioniert gut. Dann habe ich ein benutzerdefiniertes Modul geschrieben, das allen Ansichten auf meiner Site einen weiteren Parameter (eine bestimmte Knoten-ID) hinzufügt. Alle Ansichten benötigen diesen zweiten Parameter ( und es muss programmgesteuert hinzugefügt werden.) Dieser Ansatz funktioniert gut für alle Ansichten, die nur den programmgesteuert hinzugefügten Parameter als Kontextfilter verwenden. Die Ansicht, die zwei Filterwerte benötigt, funktioniert jedoch nicht, da ich glaube, dass ich die Reihenfolge nicht verarbeite Wie richte ich Ansichten ein, die bereits Filterwerte verwenden, aber programmgesteuerter hinzufügen müssen (ich setze $ args [0], aber ich denke, dies könnte das Problem sein)?

Ich sollte sagen, dass ich nicht möchte, dass diese Filter in der URL angezeigt werden.

testmod.module:

function testmod_views_pre_view($view, $display_id, array &$args) {
  ...
  $args[0] = $value;
}

Ich dachte, ich könnte einfach das $ arg-Array der Ansicht lesen und programmgesteuert mein spezielles Argument hinzufügen, aber für die Ansicht, die den angemeldeten Benutzer bereits als Kontextfilter verwendet, ist es beim Drucken von print_r ($ args) ein leeres Array , obwohl die Ansicht korrekt funktioniert (und nur Ergebnisse für den aktuellen Benutzer anzeigt). Werden Kontextfilter, die ich über die Benutzeroberfläche eingerichtet habe, an einem anderen Ort als $ args gespeichert?

Was muss getan werden, um der Ansicht mitzuteilen, wie die Filterwerte 1. und 2. korrekt verwendet werden?

Edit : Ich habe gelesen, dass hook_views_pre_view () zu früh ist, um Kontextfilter im arg-Array zu finden (an diesem Punkt würden nur Argumente in diesem Array über die URL übergeben). Welcher Haken ist am besten geeignet, um das zu erreichen, was ich tun möchte?

3
theuni

Ich habe jetzt ein besseres Verständnis und habe eine Lösung gefunden. hook_views_pre_view() ist in der Tat zu früh, um Argumente zu sehen, die NICHT über eine URL an die Ansicht übergeben werden. Das erklärt, warum $ view-> args in meinem Fall leer war. In hook_views_post_build() sehen Sie ALLE Argumente (URL + nonURL), die an die Ansicht übergeben wurden. Die Art und Weise, wie ich mein Problem gelöst habe, verwendet jedoch immer noch $args[0] = $value; In hook_views_pre_view. Das heißt, das erste Argument, das an alle Ansichten übergeben wird, ist immer $value. Für Ansichten, die zusätzliche Argumente verwenden, wird Drupal fügt sie später zu $args Hinzu. In meinem speziellen Fall habe ich Ansichten, die möglicherweise nicht unbedingt das erste Argument benötigen, das ich übergebe. Daher musste ich einen Kontextfilter Global: Null (an der ersten Position) hinzufügen, mit dem ein Kontextfilterwert ignoriert werden kann (und standardmäßig setze ich 0). Auf diese Weise hat jede Ansicht die richtige Anzahl von Kontextfiltern Filter und die Reihenfolge ist korrekt, unabhängig davon, ob die Ansicht das allererste Argument verwenden muss oder nicht. Es erscheint möglicherweise nicht intuitiv, jeder Ansicht ein Argument zu übergeben, obwohl nicht alle Ansichten es wirklich benötigen, sondern einen Global: Null Dummy-Filter ist einfacher als das Ausschließen von Ansichten in einer if() - Anweisung und das Ändern des Modulcodes, wenn später eine neue Ansicht hinzugefügt werden muss.

2
theuni