コンテキストフィルターを使用してプログラムでビューをレンダリングするにはどうすればよいですか?


20

Drupal 8でコンテキストフィルターを使用してプログラムでビューをレンダリングするにはどうすればよいですか?

Drupal 7では、通常次のコードを使用します。

$view = views_get_view('test_view'); //test_view is the view machine name
$view->set_display("block"); //block is the view display name
$view->set_arguments($tid); //$tid is the argument to pass
$view->pre_execute();
$view->execute();
$content = $view->render();

Drupal 8でこれを達成する別の方法はありますか?


引数として正確に何を渡したいですか?おそらく、ビューのUIを使用して目的を達成できます。
いいえ、Sssweat

はい、私はビューUIを使用してそれを達成できることを知っていますが、私の場合は不可能です、いくつかのコードのみでそれを達成したいです。
サンジェイ

回答:


36

で使用されているコードに基づいて、views_get_view_result()質問で示したものと同等のコードとして、次のコードを使用します。

  $args = [$tid];
  $view = Views::getView('test_view');
  if (is_object($view)) {
    $view->setArguments($args);
    $view->setDisplay('block');
    $view->preExecute();
    $view->execute();
    $content = $view->buildRenderable('block', $args);
  }

5
それはレンダリングではなく、結果を得ているだけです。同じではありません:)これを行うための好ましい方法は、[表示] - $を使用することです> buildRenderable($ディスプレイ、$引数)は、参照drupal.stackexchange.com/questions/198920/...
Berdir

はい、結果とレンダリングについて同じことを考えていました。:D
kiamlaluno

1
@GiorgosK Drupal 8では、を使用することはありませんdrupal_render()。コントローラークラスでもできるレンダリング可能な配列を返すだけで十分です。
kiamlaluno

1
@kiamlalunoは、ビューREST REST(json出力)からの出力を変更/オーバーライドして、$ contentをフィールドフォーマッターに渡すことで、json出力に "Array"を出力するだけでしdrupal_render($content)た。実際にjson出力でレンダリングされた出力を私に与えました...私は何かが欠けていますか?あなたが今説明したことを理解する場所はありますか?
-GiorgosK

1
@GiorgosK:Drupal自体を表示に使用する場合、最近はレンダリングせず、最後のポイントまですべてをレンダー配列に残し、残りはシステムに任せます。しかし、Drupalから結果を持ち上げる必要がある場合(ニュースレターなどに掲載する必要がある場合)、レンダリングします。しかし、使用を開始しないでくださいdrupal_render()、それは廃止されます。
ガボール

9
/**
 * Return the rendered view with contextual filter.
 * @param string $viewId - The view machine name.
 * @param string $viewId - The display machine name.
 * @param array $arguments - The arguments to pass.
 * 
 * @return object $result
 */
function getView($viewId, $displayId, array $arguments)
{
    $result = false;
    $view = Views::getView($viewId);

    if (is_object($view)) {
        $view->setDisplay($displayId);
        $view->setArguments($arguments);
        $view->execute();

        // Render the view
        $result = \Drupal::service('renderer')->render($view->render());
    }

    return $result;
}

/**
 * Get json output.
 * @return array $data
 */
function jsonData() {
    $data = [];
    $viewId = 'rest_comments';
    $displayId = 'rest_export_1';
    $arguments = [$nid];

    // Get the view
    $result = getView($viewId, $displayId, $arguments);

    if(is_object($result)) {
        $json = $result->jsonSerialize();
        $data = json_decode($json);
    }

    return $data;
}


/**
 * Get the view object.
 * @return object $view
 */
function view() {
    $viewId = 'rest_comments';
    $displayId = 'rest_export_1';
    $arguments = [$nid];

    // Get the view
    $view = getView($viewId, $displayId, $arguments);

    return $view;
}

2

RESTエクスポート画面の実際のJSON出力を取得するには、次のようなことができます。

$view = Views::getView('view_id');
$render_array = $view->buildRenderable('display_name', $args);
$rendered = \Drupal::service('renderer')->renderRoot($render_array);
$json_string = $rendered->jsonSerialize();
$json_object = json_decode($rendered);

チャームのように働いてくれてありがとう。
サティシュスンダール

ビューを要求するユーザーを設定するにはどうすればいいですか?たとえば、ビューにはリビジョンを表示する権限が必要です。
SimoneB

一部のリビジョンではバージョンが機能しないことに気付いただけで、SantoBoldižarは機能します
SimoneB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.