상황에 맞는 필터를 사용하여 프로그래밍 방식으로 뷰를 렌더링하려면 어떻게해야합니까?


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를 통해 원하는 것을 얻을 수 있습니다.
No 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 ($ display, $ arguments)를 사용하는 것입니다. drupal.stackexchange.com/questions/198920/…
Berdir

네, 결과 대 렌더링에 대해서도 똑같이 궁금했습니다. :D
kiamlaluno

1
@GiorgosK Drupal 8에서는 결코 사용하지 않습니다 drupal_render(). 컨트롤러 클래스조차도 렌더링 가능한 배열을 반환하면 충분합니다.
kiamlaluno

1
@kiamlaluno 내보기에 출력을 수정 / 재정의하는 REST RESTPORT (json 출력)에서 $ content를 필드 포맷터로 전달하는 drupal_render($content)것이 json 출력에서 ​​"Array"를 출력하는 것입니다 ... 그래서 그것을 통과 한 후 실제로 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

REST Export 디스플레이의 실제 JSON 출력을 얻으려면 다음과 같이 할 수 있습니다.

$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.