如何使用上下文过滤器以编程方式呈现视图?


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中是否有其他方法可以实现这一目标?


您到底想作为参数传递什么?也许您可以通过View的UI实现所需的功能。
No Sssweat

是的,我知道我可以使用视图UI来实现这一点,但是在我的情况下这是不可能的,我只想通过一些代码来实现它。
桑杰

Answers:


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 2016
6

是的,我也想知道结果还是渲染。:D
kiamlaluno

1
@GiorgosK在Drupal 8中,您永远不会使用drupal_render()。返回一个可渲染的数组就足够了,甚至控制器类也可以做到。
kiamlaluno

1
@kiamlaluno适合我使用,它是修改/覆盖将$ content传递给字段格式化程序的视图REST EXPORT(json输出)的输出,只是在json输出上输出“ Array” ...所以我将drupal_render($content)其传递给它之后实际上给了我json输出的渲染输出...我错过了什么吗?有什么地方可以理解您刚才解释的内容?
GiorgosK,2017年

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

只是注意到您的版本不适用于某些修订,而SantoBoldižar的版本适用
SimoneB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.