So verwenden Sie mehrere Werte für einen exponierten Filter über die URL


7

In meinem aktuellen Setup mache ich eine Ansicht verfügbar, die json über einen Dienst ausgibt.

Die Ansicht kann folgendermaßen aufgerufen werden : http://domain.com/api/books.json.

Ich habe auch einen Filter einem referenzierten Inhaltstyp "Autor" ausgesetzt. Ich benutze NICHTcontext filters , ich benutze den regulären Filtersund habe diesen bestimmten Filter dem Benutzer zugänglich gemacht. Auf diese Weise kann ich meinem Filter einen schönen Argumentnamen geben author_nid.

Jetzt kann ich das so nennen : http://domain.com/api/books.json?author_nid=38. Und dies gibt alle Bücher des Autors mit dieser NID zurück.

Aber ich kann nicht herausfinden, wie ich die Liste der Bücher von Autor 38 oder Autor 32 bekomme.

Die Dinge, die ich versucht habe:

http://domain.com/api/books.json?author_nid=38,32

http://domain.com/api/books.json?author_nid=38+32

http://domain.com/api/books.json?author_nid[]=38,32

http://domain.com/api/books.json?author_nid[]=38+32

http://domain.com/api/books.json?author_nid[0]=38&author_nid[1]=32

Ich habe anscheinend das Gefühl, dass dies derzeit nicht unterstützt wird. Hab ich recht? Wenn ja, welche Möglichkeiten habe ich? Ich möchte meinen Argumenten einen Namen geben, da ich 10 bis 15 Filter verfügbar machen werde (einige optional, andere erforderlich). Verwenden von Kontextfiltern und Filtern wie args[]=2&args[]=43,23&args[]=44folgt : ist nicht sehr lesbar / wartbar.


4
Es ist ziemlich seltsam, dass die Liste der Filter für Content: Nid nicht "ist einer von" enthält, wie es viele andere tun.
mpdonadio

in der Tat eine meiner Frustrationen atm: p
Polyklick

1
Siehe Metallkröte: Übergeben mehrerer Werte durch einen exponierten Filter in Drupal-Ansichten , insbesondere in dem Teil, in dem er implementiert hook_views_query_alter.
Thirdender

Antworten:


2

Wenn die Verwendung ?author_nid[]=38&author_nid[]=32wie von Milkovsky vorgeschlagen nicht funktioniert, müssen Sie möglicherweise die Verwendung von Kontextfiltern prüfen . Oder, wie ich denke, ist Ihre einzige Option, verwenden Sie hook_views_query_alter, wo Sie Ihre eigene WHERE-Klausel für die Abfrage von Ansichten basierend auf $ _GET-Parametern erstellen können.


Bitte überprüfen Sie den Kommentar zu milchowskys Antwort. Leider funktioniert es nicht. Die Verwendung von Kontextfiltern ist eigentlich keine Option. Überprüfen Sie meine erste Frage. Irgendwelche Referenzen oder Beispiele, wie ich einen solchen Hook schreiben soll? Nie zuvor getan: p
Polyklick

1
Ich habe etwas zu schnell kommentiert. Ich sehe jetzt den Link Thirdender als Kommentar zu meiner Frage. Ich werde das zuerst versuchen.
Polyklick

0

Vielleicht ist es nur ein Problem mit der Codierung. Ich habe die gleiche Konstruktion (Ansichten mit mehrwertigem Feld im belichteten Filter), und hier ist das Ergebnis, wenn ich die Schaltfläche "Senden" anwende:

http://mywebsite.com/search-housing?field_rooms_value%5B%5D=1&field_rooms_value%5B%5D=2

Könnten Sie das versuchen und mir sagen, ob es funktioniert?

http://domain.com/api/books.json?author_nid%5B%5D=38&author_nid%5B%5D=32


Danke für die Antwort, aber das funktioniert nicht.
Polyklick

0

Ich stimme Christian und MPD zu, es gibt keine "is one of" -Option für NID. Christians Antwort zu hook_views_query_alter wird funktionieren.

Als alternative Lösung können Sie den Filterhandler durch einen benutzerdefinierten ersetzen. Hier ist eine Lösung für die Such-API-Abfrage. Der nächste Handler verwendet die Option "Mehrfachauswahl zulassen":

class MYMODULESearchApiViewsHandlerFilter extends SearchApiViewsHandlerFilter {

  /**
   * Extends query to handle multiple values.
   */
  public function query() {
    if (!empty($this->options['expose']['multiple'])) {
      $values = array();
      // ...
      // DO YOUR CODE HERE TO GET VALUES FROM $this->value
      // E.g. $values = explode(',', $this->value);
      // ...
      if (!empty($values)) {
        $or = $this->query->createFilter('OR');
        foreach ($values as $value) {
          $or->condition($this->real_field, $value, $this->operator, $this->options['group']);
        }
        $this->query->filter($or);
      }
    }
    else {
      parent::query();
    }
  }

}

Sie können Ihren Handler mit hook_views_data_alter () hinzufügen.

/**
 * Implements hook_views_data_alter().
 */
function MYMODULE_views_data_alter(&$data) {
  $data['search_api_index_MYINDEX']['MYFIELD']['filter']['handler'] = 'MYMODULESearchApiViewsHandlerFilter';
}

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.