web-dev-qa-db-ja.com

ファセットフィルタリングを使用してビューの結果をプログラムでフェッチする方法

セットアップ

  • Drupal 8.2 +ビュー+ファセット
  • 表示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の結果を含むビューを作成できます。残念ながら、このモジュールはファセットベースのフィルターも無視しています。

質問

フィルターを使用するためにファセットを挿入/接続するにはどうすればよいですか?

3
Rayne

ちょっと古い質問ですが、同じものが必要でした。

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

残りのエクスポートビューは、公開されたフィルターをビューリクエスト内に配置するため、公開されたフィルターを設定する代わりに、クエリの引数を使用してリクエストを作成し、それが正常に機能しました。

ドキュメントには多くの欠けているので、誰かがより良い方法を見つけたら、私に知らせてください。

5
Jawido Kakarot