¿Cómo renderizo programáticamente una vista con filtros contextuales?

20

¿Cómo renderizo programáticamente una vista con filtros contextuales en Drupal 8?

En Drupal 7, generalmente uso el siguiente código.

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

¿Hay alguna forma alternativa de lograr esto en Drupal 8?

Sanjay
fuente
¿Qué es exactamente lo que quieres pasar como argumento? quizás puedas lograr lo que quieres a través de la interfaz de usuario de la vista.
No Sssweat
Sí, sé que puedo lograrlo usando la interfaz de usuario de vista, pero eso no es posible en mi caso, solo quiero lograrlo con algún código.
Sanjay

Respuestas:

36

Basándome en el código utilizado por views_get_view_result(), usaría el siguiente código, como código equivalente al que muestra en la pregunta.

  $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
fuente
55
Eso no es renderizar, solo obtener los resultados. No es lo mismo :) La forma preferida de hacer esto es usar $ view-> buildRenderable ($ display, $ argumentos), consulte drupal.stackexchange.com/questions/198920/…
Berdir
Sí, me preguntaba lo mismo, sobre el resultado versus el renderizado. :D
kiamlaluno
1
@GiorgosK Con Drupal 8, nunca lo usas drupal_render(). Es suficiente que devuelva una matriz renderizable, que incluso una clase de controlador puede hacer.
kiamlaluno
1
@kiamlaluno bien para mi uso, que es modificar / anular la salida de una vista RESTO DE EXPORTACIÓN (salida JSON) pasando el contenido $ al formateador campo se acaba de imprimirla "arrays" en la salida JSON ... así que después pasé por el drupal_render($content)que en realidad me dio la salida renderizada en la salida json ... ¿me estoy perdiendo algo? ¿Hay algún lugar para entender lo que acabas de explicar?
GiorgosK
1
@GiorgosK: si usa Drupal para la visualización, no representa en estos días, lo deja todo en una matriz de representación hasta el último punto y deja que el sistema haga el resto. Pero si necesita levantar el resultado de Drupal (tal vez para ponerlo en un boletín informativo o similar), entonces rinde, sí. Pero comience a no usarlo drupal_render(), quedará en desuso.
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
fuente
2

Para obtener la salida JSON real de la pantalla REST Export, puede hacer algo como esto:

$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);
estoy limpio
fuente
Trabajando como encanto, gracias impuro.
Sathish Sundar
funciona perfectamente, ¿cómo configurar el usuario que solicita la vista? por ejemplo, la vista requiere un permiso para mostrar revisiones.
SimoneB
Acabo de notar que su versión no funciona con algunas revisiones, la de Santo Boldižar sí
SimoneB