ฉันจะแสดงมุมมองด้วยตัวกรองเชิงบริบทโดยทางโปรแกรมได้อย่างไร


20

ฉันจะแสดงมุมมองโดยใช้ตัวกรองเชิงบริบทใน Drupal 8 ได้อย่างไร

ใน Drupal 7 ฉันมักจะใช้รหัสต่อไปนี้

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

มีวิธีอื่นในการทำสิ่งนี้ใน Drupal 8 หรือไม่?


สิ่งที่คุณต้องการผ่านการโต้แย้ง? บางทีคุณสามารถบรรลุสิ่งที่คุณต้องการผ่าน UI ของมุมมอง
ไม่มี Sssweat

ใช่ฉันรู้ว่าฉันสามารถบรรลุผลได้โดยใช้มุมมอง UI แต่นั่นเป็นไปไม่ได้ในกรณีของฉันฉันต้องการได้รับโดยรหัสบางอย่างเท่านั้น
Sanjay

คำตอบ:


36

การอ้างอิงรหัสที่ใช้โดยviews_get_view_result()ฉันจะใช้รหัสต่อไปนี้เป็นรหัสเทียบเท่ากับรหัสที่คุณแสดงในคำถาม

  $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
นั่นไม่ใช่การเรนเดอร์ แต่เพิ่งได้ผลลัพธ์ ไม่เหมือนกัน :) วิธีที่ต้องการจะทำเช่นนี้คือการใช้ $ View-> buildRenderable ($ แสดง $ อาร์กิวเมนต์) ดูdrupal.stackexchange.com/questions/198920/...
Berdir

ใช่ฉันสงสัยเหมือนกันเกี่ยวกับผลลัพธ์กับการแสดงผล :D
kiamlaluno

1
@GiorgosK ด้วย Drupal 8 drupal_render()คุณไม่เคยใช้ ก็เพียงพอแล้วที่คุณจะส่งคืนอาเรย์ที่สามารถเรนเดอร์ได้ซึ่งแม้แต่คลาสคอนโทรลเลอร์ก็สามารถทำได้
kiamlaluno

1
@ kiamlaluno ดีสำหรับการใช้งานของฉันซึ่งก็คือการปรับเปลี่ยน / แทนที่เอาท์พุทจากมุมมอง REST EXPORT (json output) ผ่าน $ content ไปยัง formatter field เป็นเพียงการส่งออก "Array" บนเอาต์พุต json ... ดังนั้นหลังจากฉันผ่านdrupal_render($content)มัน ที่จริงแล้วให้ผลลัพธ์ที่แสดงผลบนเอาต์พุต json ... ฉันขาดอะไรไปหรือเปล่า? มีสถานที่ที่จะเข้าใจสิ่งที่คุณเพิ่งอธิบาย?
GiorgosK

1
@GiorgosK: หากคุณใช้ Drupal สำหรับการแสดงคุณไม่ได้แสดงวันนี้คุณปล่อยทุกอย่างไว้ในอาร์เรย์เรนเดอร์จนถึงจุดสุดท้ายและปล่อยให้ระบบทำส่วนที่เหลือ แต่ถ้าคุณต้องการยกผลลัพธ์จาก Drupal (อาจจะใส่ในจดหมายข่าวหรือคล้ายกัน) คุณก็แสดงใช่ แต่เริ่มที่จะไม่ใช้drupal_render()มันจะถูกคัดค้าน
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

ในการรับเอาต์พุต JSON จริงของจอแสดงผล REST Export คุณสามารถทำสิ่งนี้:

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

ทำงานได้เหมือนมีเสน่ห์ขอบคุณมาก
Sathish Sundar

ทำงานอย่างสมบูรณ์แบบวิธีตั้งค่าผู้ใช้ที่ร้องขอมุมมอง เช่นมุมมองต้องได้รับอนุญาตเพื่อแสดงการแก้ไข
SimoneB

เพิ่งสังเกตเห็นว่าคุณเป็นรุ่นที่ใช้งานไม่ได้กับการแก้ไขบางอย่าง Santo Boldižarทำ
SimoneB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.