Jak programowo renderować widok z filtrami kontekstowymi?

20

Jak programowo renderować widok z filtrami kontekstowymi w Drupal 8?

W Drupal 7 zazwyczaj używam następującego kodu.

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

Czy jest jakiś alternatywny sposób na osiągnięcie tego w Drupal 8?

Sanjay
źródło
Co dokładnie chcesz przekazać jako argument? może możesz osiągnąć to, co chcesz za pomocą interfejsu użytkownika View.
Bez Sssweat
Tak, wiem, że mogę to osiągnąć za pomocą interfejsu użytkownika widoku, ale w moim przypadku nie jest to możliwe, chcę to osiągnąć tylko za pomocą kodu.
Sanjay

Odpowiedzi:

36

Opierając się na kodzie używanym przez views_get_view_result(), użyłbym następującego kodu, jako kodu równoważnego kodowi pokazanemu w pytaniu.

  $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);
  }
kiamlaluno
źródło
5
To nie jest renderowanie, tylko uzyskiwanie wyników. Nie to samo :) Preferowanym sposobem na to jest użycie $ view-> buildRenderable ($ display, $ arguments), patrz drupal.stackexchange.com/questions/198920/…
Berdir
Tak, zastanawiałem się nad tym samym, w porównaniu do renderowania. :D
kiamlaluno
1
@GiorgosK Z Drupal 8 nigdy nie korzystasz drupal_render(). Wystarczy zwrócić tablicę do renderowania, co może zrobić nawet klasa kontrolera.
kiamlaluno
1
@kiamlaluno dobrze do mojego użytku, który polega na modyfikacji / przesłonięciu danych wyjściowych z widoku REST EXPORT (wyjście json) przekazując zawartość $ do formatyzatora pola właśnie wypisywał „Array” na wyjściu json ... więc po tym, jak drupal_render($content)go przekazałem faktycznie dało mi renderowane wyjście na wyjściu json ... czy coś mi brakuje? czy jest miejsce na zrozumienie tego, co właśnie wyjaśniłeś?
GiorgosK
1
@GiorgosK: jeśli używasz samego Drupala do wyświetlania, nie renderujesz w tych dniach, pozostawiasz wszystko w tablicy renderowania do ostatniego punktu i pozwalasz systemowi zrobić resztę. Ale jeśli chcesz podnieść wynik z Drupala (być może w celu umieszczenia go w biuletynie lub podobnym), to renderujesz, tak. Ale zacznij nie używać drupal_render(), będzie przestarzałe.
Gábor
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;
}
Santo Boldižar
źródło
2

Aby uzyskać rzeczywiste wyjście JSON ekranu eksportu REST, możesz zrobić coś takiego:

$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);
jestem czysty
źródło
Działa jak urok, dzięki nieczyste.
Sathish Sundar
działa idealnie, jak ustawić użytkownika żądającego widoku? np. widok wymaga pozwolenia na pokazywanie poprawek.
SimoneB,
Właśnie zauważyłem, że Twoja wersja nie działa z niektórymi wersjami, Santo Boldižar robi
SimoneB