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?


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

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.