Como processo programaticamente uma exibição com filtros contextuais?

20

Como renderizo programaticamente uma exibição com filtros contextuais no Drupal 8?

No Drupal 7, geralmente uso o seguinte 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();

Existe alguma maneira alternativa de conseguir isso no Drupal 8?

Sanjay
fonte
O que exatamente você quer passar como argumento? talvez você consiga o que deseja através da interface do usuário do View.
Não Sssweat
Sim, eu sei que posso conseguir isso usando o view UI, mas isso não é possível no meu caso, quero consegui-lo apenas por algum código.
precisa

Respostas:

36

Baseando-se no código usado por views_get_view_result(), eu usaria o código a seguir, como código equivalente ao que você mostra na pergunta.

  $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
fonte
5
Isso não está renderizando, está apenas obtendo os resultados. Não é o mesmo :) A maneira preferida de fazer isso é usar $ view-> buildRenderable ($ display, $ argumentos), consulte drupal.stackexchange.com/questions/198920/…
Berdir 30/06/16
Sim, eu estava pensando o mesmo, sobre resultado versus renderização. :D
kiamlaluno
1
@GiorgosK Com o Drupal 8, você nunca usa drupal_render(). É o suficiente para você retornar uma matriz renderizável, que até uma classe de controlador pode fazer.
kiamlaluno
1
@kiamlaluno bem para o meu uso, que é modificar / substituir a saída de uma view REST EXPORT (saída json) passando o conteúdo $ para o formatador de campo estava apenas enviando "Array" na saída json ... então depois que eu passei o drupal_render($content)it realmente me deu a saída renderizada na saída json ... estou faltando alguma coisa? existe algum lugar para entender o que você acabou de explicar?
GiorgosK #
1
@GiorgosK: se você usa o próprio Drupal para exibição, hoje em dia não processa, deixa tudo em um array de renderização até o último ponto e deixa o sistema fazer o resto. Mas se você precisar levantar o resultado do Drupal (talvez para colocar em um boletim de notícias ou similar), renderize sim. Mas comece a não usar drupal_render(), será preterido.
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
fonte
2

Para obter a saída JSON real da exibição REST Export, você pode fazer algo assim:

$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);
estou limpo
fonte
Trabalhando como charme, obrigado imclean.
Sathish Sundar
funciona perfeitamente, como definir o usuário solicitando a visualização? por exemplo, a visualização requer uma permissão para mostrar revisões.
SimoneB
Só notei que sua versão não funciona com algumas revisões, o de Santo Boldižar
SimoneB 02/12