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.