セットアップ
articles
…page_1
field_title
field_facet
では複数の値を使用できます。 A
およびB
コンセプト
$_GET
クエリ値を再利用して、ビューの結果をプログラムでフェッチしたいと思います。 ($_GET
の値はシリアル化され、後で使用するために保存されます。)
問題
非ファセットフィルターのみを使用する場合、結果は正しいです。ファセットフィルター値は無視され、提供されたスニペットによる結果のフィルタリングは行われません。
ビューは期待どおりに機能していますか?
はい、ビューは期待どおりに機能しています。フィルタリングは、HTTPクライアントとクエリ?field_title=Hello&field_facet[0]=A&field_facet[1]=B
を使用してWebサイトにアクセスすると機能します。
スニペット
<?php
use Drupal\views\Views;
$view = Views::getView('articles');
$query = [
// Filters results with title `Hello` as expected.
'field_title' => 'Hello',
// The programatically executed View ignores
// the following facet based values for filtering.
'field_facet' => ['A', 'B'],
];
$view->setExposedInput($query);
// bool(true)
var_dump($view->execute('page_1'));
$result = [];
/** @var Drupal\views\ResultRow $row */
foreach ($view->result as $row) {
/** @var Drupal\search_api\Item\Item $item */
$item = $row->_item;
/** @var Drupal\node\Entity\Node $node */
$node = $item->getOriginalObject()->getValue();
$result[] = [
'nid' => $node->id(),
'title ($item)' => $item->getField('title')->getValues()[0],
'title ($node)' => $node->get('title')->getValue(),
];
}
REST moduleを使用した実験
RESTモジュールでは、JSONの結果を含むビューを作成できます。残念ながら、このモジュールはファセットベースのフィルターも無視しています。
質問
フィルターを使用するためにファセットを挿入/接続するにはどうすればよいですか?
ちょっと古い質問ですが、同じものが必要でした。
use Drupal\views\Views;
use Symfony\Component\HttpFoundation\Request;
$view_id = 'VIEWID';
$display_id = 'rest_export_1';
$filters = [
// Filters results with title `Hello` as expected.
'field_title' => 'Hello',
// The programatically executed View ignores
// the following facet based values for filtering.
'field_facet' => ['A', 'B'],
];
$view = Views::getView($view_id);
$view->setDisplay($display_id);
// Here comes the part that did the trick for my REST JSON request.
// Create a new request with your filters / url query and set that.
$request = new Request($filters);
$view->setRequest($request);
$view->execute();
//TMP debug the json decoded value
$view_result = \Drupal::service('renderer')->renderRoot($view->render());
$view_json_decode = json_decode($view_result);
残りのエクスポートビューは、公開されたフィルターをビューリクエスト内に配置するため、公開されたフィルターを設定する代わりに、クエリの引数を使用してリクエストを作成し、それが正常に機能しました。
ドキュメントには多くの欠けているので、誰かがより良い方法を見つけたら、私に知らせてください。