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?


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

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.