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?
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);
}
/**
* 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;
}
Pour obtenir la sortie JSON réelle de l'affichage REST Export, 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);