Bagaimana cara membuat tampilan dengan filter kontekstual secara terprogram?

20

Bagaimana cara membuat tampilan dengan filter kontekstual di Drupal 8 secara terprogram?

Di Drupal 7, saya biasanya menggunakan kode berikut.

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

Apakah ada cara alternatif untuk mencapai ini di Drupal 8?

Sanjay
sumber
Apa yang ingin Anda sampaikan sebagai argumen? mungkin Anda dapat mencapai apa yang Anda inginkan melalui UI Tampilan.
No Sssweat
Ya saya tahu saya dapat mencapainya menggunakan UI tampilan tetapi itu tidak mungkin dalam kasus saya, saya ingin mencapainya dengan beberapa kode saja.
Sanjay

Jawaban:

36

Mendasarkan pada kode yang digunakan oleh views_get_view_result(), saya akan menggunakan kode berikut, sebagai kode yang setara dengan yang Anda tunjukkan dalam pertanyaan.

  $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
sumber
5
Itu bukan rendering, itu hanya mendapatkan hasilnya. Tidak sama :) Cara yang disukai untuk melakukan ini adalah dengan menggunakan $ view-> buildRenderable ($ display, $ argumen), lihat drupal.stackexchange.com/questions/198920/…
Berdir
Ya, saya bertanya-tanya sama, tentang hasil versus rendering. :D
kiamlaluno
1
@GiorgosK Dengan Drupal 8, Anda tidak pernah menggunakan drupal_render(). Cukup Anda mengembalikan array yang dapat diulang, yang bahkan dapat dilakukan oleh kelas controller.
kiamlaluno
1
@kiamlaluno baik untuk penggunaan saya yang memodifikasi / menimpa output dari tampilan REST EXPORT (output json) melewati $ content ke formatter bidang hanya mengeluarkan "Array" pada output json ... jadi setelah saya melewati drupal_render($content)itu sebenarnya memberi saya output yang diberikan pada output json ... apakah saya melewatkan sesuatu? apakah ada tempat untuk memahami apa yang baru saja Anda jelaskan?
GiorgosK
1
@GiorgosK: jika Anda menggunakan Drupal sendiri untuk tampilan, Anda tidak membuat hari ini, Anda meninggalkan semuanya dalam array render hingga titik terakhir dan membiarkan sistem melakukan sisanya. Tetapi jika Anda perlu mengangkat hasilnya dari Drupal (mungkin untuk dimasukkan ke buletin atau serupa), maka Anda membuat, ya. Tapi mulai tidak digunakan drupal_render(), itu akan usang.
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
sumber
2

Untuk mendapatkan hasil JSON aktual dari tampilan REST Export, Anda dapat melakukan sesuatu seperti ini:

$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);
saya bersih
sumber
Bekerja seperti pesona, terima kasih imclean.
Sathish Sundar
berfungsi dengan baik, bagaimana mengatur pengguna yang meminta tampilan? misalnya tampilan memerlukan izin untuk menampilkan revisi.
SimoneB
Hanya perhatikan bahwa versi Anda tidak berfungsi dengan beberapa revisi, Santo Boldižar's tidak
SimoneB