web-dev-qa-db-ja.com

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

現在のセットアップでは、サービスを通じて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_は、あまり読みやすく、維持できません。

7
polyclick

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

2
Christian

コンテキストフィルターを使用して複数の値を渡すことができます。

UrlからRaw Valueを選択し、PathComponent/arugumentを選択します。

以下により多くのセクションがあり、1 + 2 + 3(ORの場合)または1,2,3の形式で複数の値を許可を確認できます(および)。

http://example.com/some-path/24+25

または

http://example.com/some-path/24,25

0
goutham rao

クリスチャンと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';
}
0
milkovsky

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

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

0
Matt