¿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?


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

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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.