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?


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

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

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

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,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.