Wie rendere ich programmgesteuert eine Ansicht mit Kontextfiltern?

20

Wie rendere ich programmgesteuert eine Ansicht mit Kontextfiltern in Drupal 8?

In Drupal 7 verwende ich im Allgemeinen den folgenden Code.

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

Gibt es eine alternative Möglichkeit, dies in Drupal 8 zu erreichen?

Sanjay
quelle
Was genau möchten Sie als Argument übergeben? Vielleicht können Sie über die Benutzeroberfläche von View erreichen, was Sie wollen.
Kein Sssweat
Ja, ich weiß, dass ich das mit der Ansichts-Benutzeroberfläche erreichen kann, aber das ist in meinem Fall nicht möglich. Ich möchte es nur mit einem Code erreichen.
Sanjay

Antworten:

36

Auf der Grundlage des von verwendeten Codes views_get_view_result()würde ich den folgenden Code als Code verwenden, der dem in der Frage gezeigten Code entspricht.

  $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
quelle
5
Das ist kein Rendern, sondern nur das Erhalten der Ergebnisse. Nicht dasselbe :) Die bevorzugte Methode hierfür ist die Verwendung von $ view-> buildRenderable ($ display, $ arguments), siehe drupal.stackexchange.com/questions/198920/…
Berdir
Ja, ich habe mich das gleiche gefragt, über das Ergebnis im Vergleich zum Rendern. :D
kiamlaluno
1
@ GiorgosK Mit Drupal 8 verwenden Sie nie drupal_render(). Es genügt, wenn Sie ein darstellbares Array zurückgeben, was sogar eine Controller-Klasse kann.
kiamlaluno
1
@kiamlaluno gut für meinen Gebrauch, der darin besteht, die Ausgabe von Ansichten zu ändern / zu überschreiben. REST EXPORT (JSON-Ausgabe), das den $ -Inhalt an den Feldformatierer weiterleitet, gab einfach "Array" auf der JSON-Ausgabe aus ... also, nachdem ich drupal_render($content)es übergeben habe gab mir eigentlich die gerenderte ausgabe auf die json ausgabe ... fehlt mir etwas? Gibt es einen Ort, an dem Sie verstehen können, was Sie gerade erklärt haben?
GiorgosK
1
@ GiorgosK: Wenn Sie Drupal selbst für die Anzeige verwenden, rendern Sie heutzutage nicht mehr, sondern belassen alles bis zum letzten Punkt in einem Render-Array und lassen den Rest vom System erledigen. Aber wenn Sie das Ergebnis aus Drupal herausholen müssen (vielleicht um es in einen Newsletter oder ähnliches zu schreiben), dann rendern Sie ja. Aber fangen Sie nicht an drupal_render(), es wird veraltet sein.
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
quelle
2

Um die tatsächliche JSON-Ausgabe der REST-Exportanzeige zu erhalten, können Sie Folgendes tun:

$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);
ich bin sauber
quelle
Arbeiten wie Charme, danke unrein.
Sathish Sundar
funktioniert einwandfrei, wie stellt man den Benutzer ein, der die Ansicht anfordert? zB erfordert die Ansicht eine Berechtigung zum Anzeigen von Revisionen.
SimoneB
Ich habe gerade bemerkt, dass deine Version mit einigen Revisionen nicht funktioniert, Santo Boldižars
SimoneB,