URLを介して公開されたフィルターに複数の値を使用する方法


7

現在のセットアップでは、サービスを通じてjsonを出力するビューを公開しています。

ビューは次のように呼び出すことができますhttp://domain.com/api/books.json

また、参照コンテンツタイプ「作成者」にフィルターを公開しました。私はを使用していません。context filters通常のFiltersフィルターを使用していて、その特定のフィルターをユーザーに公開しています。これにより、フィルターに適切な引数名を付けることができますauthor_nid

これで、これを呼び出すことができますhttp://domain.com/api/books.json?author_nid=38。そして、これはその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[]=38+32

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

これは現在サポートされていないような気がします。私は正しいですか?もしそうなら、私の選択肢は何ですか?10〜15個のフィルターを公開するので、引数に名前を付けたいと思います(一部はオプション、その他は必須)。コンテキストフィルターを使用して、次のようにフィルター処理することargs[]=2&args[]=43,23&args[]=44は、あまり読みやすく/維持できません。


4
Content:Nidが他の多くのように「のいずれか」を含まないのは奇妙です。
mpdonadio

実際、私の不満の1つatm:p
polyclick

1
Metal Toad:Drupal Viewsの公開フィルターを介して複数の値を渡す方法、特に実装する部分を参照してくださいhook_views_query_alter
サードパーティ2014

回答:


2

milkovskyの?author_nid[]=38&author_nid[]=32提案どおりに使用できない場合は、コンテキストフィルターの使用を検討する必要があります。または、私が唯一の選択肢かもしれないと思うので、$ _ GETパラメーターに基づいて独自のビュークエリWHERE句を構築できるhook_views_query_alterを使用します。


milkovskyの回答のコメントをチェックしてください。悲しいことに、それは機能していません。コンテキストフィルターの使用は実際にはオプションではありません。最初の質問を確認してください。どのように私はそのようなフックを書くべきであるか参照または例?これまでにこれを実行したことはありません:p
polyclick

1
私は少し速すぎてコメントしました。サードパーティが投稿したリンクを質問へのコメントとして表示します。最初に試してみます。
polyclick 2014

0

多分それはエンコーディングの問題だけです。私は同じ構成(公開されたフィルターに複数値フィールドを持つビュー)を持っています。送信ボタンを適用したときの結果は次のとおりです。

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

これを試してみて、うまくいくかどうか教えてください。

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


返信ありがとうございますが、これは機能しません。
polyclick 14

0

クリスチャンとMPDに同意します。NIDには「のいずれか」のオプションはありません。hook_views_query_alterに関するクリスチャンの答えは機能します。

代替ソリューションとして、フィルターハンドラーをカスタムハンドラーに置き換えることができます。検索APIクエリのソリューションは次のとおりです。次のハンドラーは「複数選択を許可」オプションを使用します。

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();
    }
  }

}

ハンドラーはhook_views_data_alter()を使用して追加できます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.