Làm cách nào để lập trình chế độ xem với các bộ lọc theo ngữ cảnh?


20

Làm cách nào để lập trình chế độ xem với các bộ lọc theo ngữ cảnh trong Drupal 8 theo cách lập trình?

Trong Drupal 7, tôi thường sử dụng mã sau đây.

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

Có cách nào khác để đạt được điều này trong Drupal 8 không?


Chính xác những gì bạn muốn vượt qua như là một đối số? có lẽ bạn có thể đạt được những gì bạn muốn thông qua giao diện người dùng của View.
Không có Sssweat

Có tôi biết tôi có thể đạt được điều đó bằng cách sử dụng UI xem nhưng điều đó là không thể trong trường hợp của tôi, tôi chỉ muốn đạt được nó bằng một số mã.
Sanjay

Câu trả lời:


36

Dựa trên mã được sử dụng bởi views_get_view_result(), tôi sẽ sử dụng mã sau đây, dưới dạng mã tương đương với mã bạn hiển thị trong câu hỏi.

  $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
Đó không phải là kết xuất, đó chỉ là nhận được kết quả. Không giống nhau :) Cách ưa thích để làm điều này là sử dụng $ view-> buildRenderable ($ display, $ argument), xem drupal.stackexchange.com/questions/198920/ Thẻ
Berdir

Vâng, tôi đã tự hỏi tương tự, về kết quả so với kết xuất. :D
kiamlaluno

1
@GiorgosK Với Drupal 8, bạn không bao giờ sử dụng drupal_render(). Nó đủ để bạn trả về một mảng có thể kết xuất, điều mà ngay cả một lớp trình điều khiển cũng có thể làm được.
kiamlaluno

1
@kiamlaluno tốt cho việc sử dụng của tôi, đó là sửa đổi / ghi đè đầu ra từ một khung nhìn REST XUẤT (đầu ra json) chuyển nội dung $ cho trình định dạng trường chỉ xuất ra "Mảng" trên đầu ra json ... vì vậy sau khi tôi chuyển drupal_render($content)nó thực sự đã cho tôi đầu ra được kết xuất trên đầu ra json ... tôi có thiếu thứ gì không? Có nơi nào để hiểu những gì bạn vừa giải thích?
GiorgosK

1
@GiorgosK: nếu bạn sử dụng Drupal để hiển thị, bạn không kết xuất những ngày này, bạn để mọi thứ trong một mảng kết xuất cho đến điểm cuối cùng và để hệ thống làm phần còn lại. Nhưng nếu bạn cần nâng kết quả từ Drupal (có thể để đưa vào một bản tin hoặc tương tự), thì bạn kết xuất, vâng. Nhưng bắt đầu không sử dụng drupal_render(), nó sẽ bị phản đối.
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

Để có được đầu ra JSON thực tế của màn hình REST Export, bạn có thể làm một cái gì đó như thế này:

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

Làm việc như quyến rũ, cảm ơn imclean.
Sathish Sundar

Hoạt động hoàn hảo, làm thế nào để thiết lập người dùng yêu cầu xem? ví dụ: khung nhìn yêu cầu sự cho phép để hiển thị các sửa đổi.
SimoneB

Chỉ cần lưu ý rằng phiên bản của bạn không hoạt động với một số sửa đổi, của Santo Boldižar
SimoneB
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.