Wie verwende ich einen Ansichten-Kontextfilter ODER?

18

Nach einer Weile im Internet und in SE scheint es mir keine gute Lösung zu geben, 2 contextual filtersmit OR zu kombinieren (anstatt dem Standard-AND).

Dieser Beitrag erwähnt einen PHP-Hack und dieser Beitrag enthält einige Links zu einem Problem , in dem eine kürzlich erfolgte Änderung in den Ansichten 7.x-3.1 angegeben ist . Es wird auch die Verwendung hook_views_query_alter(&$view, &$query)zum Ändern der Ansicht erwähnt.

Hat jemand ein funktionierendes Beispiel oder eine bessere Lösung?

uwe
quelle
Ich glaube nicht, dass es derzeit eine bessere Lösung gibt. Wie in den von Ihnen erwähnten Threads erwähnt, handelt es sich anscheinend um ein fortlaufendes Problem. Ich bin diese Woche auf dasselbe Problem gestoßen und musste eine Problemumgehung mit Anhängen finden. Aber dann gibt es keine gemischte Liste, sondern zwei verbundene, die nicht alle Anforderungen erfüllen.
Countzero

Antworten:

7

Probieren Sie den Patch in diesem Problem aus: Ziehen Sie den Filterwert aus einem Argument

Hiermit können Sie den Wert aus dem Kontextfilter an den "normalen Filter" übergeben. Dort können Sie Ihre fortgeschrittenen Konditionen machen.

mojzis
quelle
7

Der hier beginnende Kommentarthread beschreibt eine effektive Problemumgehung. MotoTribe hat auf den gleichen Thread verlinkt, aber zum Zeitpunkt seiner Frage gab es auf dieser Seite kein funktionierendes Beispiel. Nun gibt es wie folgt:

Implementieren Sie in Ihrem Modul hook_views_api():

function MODULENAME_views_api() {
  return array(
    'api' => 3,
  );
}

Fügen Sie dann Ihrem Modul eine neue Datei mit dem Namen MODULENAME.views.inc hinzu und implementieren Sie hook_views_query_alter():

function MODULENAME_views_query_alter(&$view, &$query) {
  if ($view->name == 'whatever_your_view_is_called') {
    $query->where[0]['type'] = 'OR';
  }
}

Beachten Sie auch diese Einschränkung:

Anscheinend wird der Filter "Inhalt: Veröffentlicht (Ja)", der mit jeder Ansicht geliefert wird, als Teil derselben Filtergruppe wie die Kontextfilter (Gruppe 0) betrachtet. Um in meiner Ansicht nur veröffentlichte Knoten anzuzeigen , die zu einer der durch Kontextfilter angegebenen Gruppen gehören (veröffentlichtes UND (arg1 ODER arg2 ODER ...)), musste ich den "Inhalt: Veröffentlicht (Ja)" in verschieben eine neue Filtergruppe (über den Dialog "And / Or, Rearrange"). Beachten Sie, dass die Benutzeroberfläche den Filter "Inhalt: Veröffentlicht (Ja)" nicht anders angezeigt hat, nachdem ich ihn in eine neue Gruppe verschoben habe (es gab keine anderen Gruppen), aber in dem Abfrageobjekt, das übergeben wurde, wurde hook_views_query_alter()er verschoben es aus der Gruppe 0 in die Gruppe 1, wodurch der Code in den obigen Funktionen nicht mehr beeinflusst wird.

Coredumperror
quelle
1
Es ist besser, zumindest die Relevanz der Verweise auf die Frage des OP zu umschreiben. Antworten nur auf Links werden nicht empfohlen, da Links möglicherweise nicht bestehen bleiben.
Triskelion
@ Triskelion: Ah, du hast absolut recht. Ich habe meine Antwort bearbeitet, um das zu beheben.
Coredumperror
4

Es gibt ein Modul, das die Handler von Ansichten so ändert, dass Kontextfilter mit ODER anstelle von UND verwendet werden: Ansichten Kontextfilter ODER

Sinan Erdem
quelle
Ich möchte eine Ansicht mit Inhalten von "Aktueller Benutzer" + "Inhalten von gekennzeichneten Benutzern (der aktuelle Benutzer hat mit follow flag [Benutzer] gekennzeichnet)"
Umair
2

Die Situation mit Kontextfiltern und Filtergruppen ist in der Tat trostlos. Hier ist ein Thread über "Do" für dieses Toppic, das die gleiche Lösung hat, wie von @CoreDumpError angegeben.

https://drupal.org/node/1451218

Außerdem finden Sie hier ein Modul, mit dessen Hilfe sich widersprüchliche kontextbezogene und exponierte Filter auflösen lassen ... Ansichten Filter Harmonizer

doublejosh
quelle