Come posso rendere programmaticamente una vista con filtri contestuali?


20

Come posso rendere programmaticamente una vista con filtri contestuali in Drupal 8?

In Drupal 7, generalmente utilizzo il seguente codice.

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

Esiste un modo alternativo per raggiungere questo obiettivo in Drupal 8?


Cosa vuoi passare esattamente come argomento? forse puoi ottenere ciò che desideri tramite l'interfaccia utente di View.
— No Sssweat,

Sì, lo so che posso ottenerlo utilizzando l'interfaccia utente di visualizzazione, ma ciò non è possibile nel mio caso, voglio ottenerlo solo con un codice.
— Sanjay,

Risposte:


36

Basandomi sul codice usato da views_get_view_result(), userei il seguente codice, come codice equivalente a quello che mostri nella domanda.

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

5
Non è il rendering, sta solo ottenendo i risultati. Non è lo stesso :) Il modo preferito per farlo è usare $ view-> buildRenderable ($ display, $ argomenti), vedi drupal.stackexchange.com/questions/198920/…
— Berdir,

Sì, mi chiedevo lo stesso, riguardo al risultato rispetto al rendering. :D
— kiamlaluno

1
@GiorgosK Con Drupal 8, non lo usi mai drupal_render(). È sufficiente restituire un array renderizzabile, cosa che può fare anche una classe controller.
— kiamlaluno

1
@kiamlaluno bene per il mio uso che è quello di modificare / annullare l'uscita da una vista REST EXPORT (uscita JSON) passando il contenuto di $ per il formattatore campo è stato appena outputing "array" sull'uscita JSON ... così dopo ho passato il drupal_render($content)che in realtà mi ha dato l'output renderizzato sull'output json ... mi sto perdendo qualcosa? c'è un posto per capire cosa hai appena spiegato?
— GiorgosK,

1
@GiorgosK: se usi Drupal stesso per la visualizzazione, in questi giorni non esegui il rendering, lo lasci tutto in un array di rendering fino all'ultimo punto e lascia che il sistema faccia il resto. Ma se hai bisogno di sollevare il risultato da Drupal (forse da inserire in una newsletter o simili), allora esegui il rendering, sì. Ma inizia a non usare drupal_render(), sarà deprecato.
— 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

Per ottenere l'output JSON effettivo del display di esportazione REST puoi fare qualcosa del genere:

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

Funzionando come fascino, grazie imclean.
— Sathish Sundar,

funziona perfettamente, come impostare l'utente che richiede la vista? ad es. la vista richiede un'autorizzazione per mostrare le revisioni.
— SimoneB

Ho appena notato che la tua versione non funziona con alcune revisioni, quella di Santo Boldižar
— SimoneB
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.