Как программно визуализировать представление с помощью контекстных фильтров?

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?

Санджай
источник
Что именно вы хотите передать в качестве аргумента? может быть, вы можете достичь того, что вы хотите через пользовательский интерфейс View.
Нет Sssweat
Да, я знаю, что могу добиться этого с помощью пользовательского интерфейса представления, но в моем случае это невозможно, я хочу добиться этого только с помощью некоторого кода.
Санджай

Ответы:

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
Это не рендеринг, это просто получение результатов. Не то же самое :) Предпочтительный способ сделать это - использовать $ view-> buildRenderable ($ display, $ arguments), см. Drupal.stackexchange.com/questions/198920/…
Berdir
Да, мне было интересно то же самое, результат или рендеринг. :D
kiamlaluno
1
@GiorgosK С Drupal 8 вы никогда не используете drupal_render(). Достаточно вернуть возвращаемый массив, что может сделать даже класс контроллера.
kiamlaluno
1
@kiamlaluno хорошо для моего использования, которое заключается в изменении / переопределении вывода из представления REST EXPORT (вывод json), передавая содержимое $ в форматировщик поля, просто выводил «Array» на выводе json ... так что после того, как я передал 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

Чтобы получить фактический вывод JSON на экране экспорта REST, вы можете сделать что-то вроде этого:

$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
Просто заметил, что ваша версия не работает с некоторыми ревизиями, а Санто Болдижар
SimoneB