Comment rendre par programme une vue avec des filtres contextuels?

20

Comment rendre par programme une vue avec des filtres contextuels dans Drupal 8?

Dans Drupal 7, j'utilise généralement le code suivant.

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

Existe-t-il un autre moyen d'y parvenir dans Drupal 8?

Sanjay
la source
Que voulez-vous exactement passer comme argument? vous pouvez peut-être réaliser ce que vous voulez grâce à l'interface utilisateur de View.
Pas de Sssweat
Oui, je sais que je peux y parvenir en utilisant l'interface utilisateur de vue, mais ce n'est pas possible dans mon cas, je veux y parvenir uniquement avec du code.
Sanjay

Réponses:

36

Sur la base du code utilisé par views_get_view_result(), j'utiliserais le code suivant, comme code équivalent à celui que vous montrez dans la question.

  $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
la source
5
Ce n'est pas du rendu, c'est juste d'obtenir les résultats. Pas la même chose :) La façon préférée de le faire est d'utiliser $ view-> buildRenderable ($ display, $ arguments), voir drupal.stackexchange.com/questions/198920/…
Berdir
Oui, je me posais la même question, à propos du résultat par rapport au rendu. :D
kiamlaluno
1
@GiorgosK Avec Drupal 8, vous n'utilisez jamais drupal_render(). Il suffit de renvoyer un tableau pouvant être rendu, ce que même une classe de contrôleur peut faire.
kiamlaluno
1
@kiamlaluno bien pour mon usage qui consiste à modifier / annuler la sortie d'une vue EXPORT REST (sortie JSON) faire passer le contenu de $ à la formatter sur le terrain vient outputing « Array » sur la sortie JSON ... donc après avoir passé le drupal_render($content)ce m'a en fait donné la sortie rendue sur la sortie json ... est-ce que je manque quelque chose? existe-t-il un endroit pour comprendre ce que vous venez d'expliquer?
GiorgosK
1
@GiorgosK: si vous utilisez Drupal lui-même pour l'affichage, vous ne faites pas de rendu ces jours-ci, vous le laissez tout dans un tableau de rendu jusqu'au dernier point et laissez le système faire le reste. Mais si vous avez besoin de lever le résultat de Drupal (peut-être pour le mettre dans une newsletter ou similaire), alors vous rendez, oui. Mais commencez à ne pas l'utiliser drupal_render(), il sera obsolète.
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
la source
2

Pour obtenir la sortie JSON réelle de l'affichage d'exportation REST, vous pouvez faire quelque chose comme ceci:

$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);
Je suis propre
la source
Travailler comme un charme, merci impeccable.
Sathish Sundar
fonctionne parfaitement, comment paramétrer l'utilisateur demandant la vue? Par exemple, la vue nécessite une autorisation pour afficher les révisions.
SimoneB
Je viens de remarquer que votre version ne fonctionne pas avec certaines révisions, ce que fait Santo Boldižar
SimoneB