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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.