现在不推荐使用node_view(),该如何渲染节点?


22

在Drupal 7中,我经常使用node_view()以下方式在块或页面中渲染节点(使用视图模式):

$nids = array(123,456,789);
$nodes = node_load_multiple($nids);
foreach ($nodes as $node) {
  $node_view = node_view($node, 'teaser');
  $output .= drupal_render($node_view);
}
$build['nodes']['#markup'] = $output;
return $build;

node_view()/ entity_view()已被视图构建器弃用,如更改记录中所述,已由视图构建器替换。实体现在由视图构建器呈现。该信息不够详细,我无法弄清楚如何获得相同的结果。

如何在Drupal 8中渲染节点,以便可以在块或页面的渲染数组中使用输出?

Answers:


31

通过Berdir给出答案的用途entityManager,其已被否决有利于更具体的服务。这是我当前使用的代码。

$nid = 1;
$entity_type = 'node';
$view_mode = 'teaser';

$view_builder = \Drupal::entityTypeManager()->getViewBuilder($entity_type);
$storage = \Drupal::entityTypeManager()->getStorage($entity_type);
$node = $storage->load($nid);
$build = $view_builder->view($node, $view_mode);
$output = render($build);

这段代码比某些人更冗长。如果您确实希望通过将某些方法链接在一起而更加简洁,则可以将其减少到几行。

$nid = 1;
$entity_type = 'node';
$view_mode = 'teaser';

$node = \Drupal::entityTypeManager()->getStorage($entity_type)->load($nid);
$output = render(\Drupal::entityTypeManager()->getViewBuilder($entity_type)->view($node, $view_mode));

你不能只用$node = Node::load($nid)吗?
尼克

3
为什么render()在最后一行中使用?getViewBuilder($entity_type)->view返回一个渲染数组,该数组将传递到树枝视图。
蒂姆(Tim)

1
@Tim我假设这取决于您在其中使用的上下文,这是一个Wiki,因此欢迎您添加输入。对于我的某些用例,我没有奢侈地将其直接作为渲染数组传递给树枝模板,而是需要自己执行渲染。祝你好运。
nicholas.alipaz

如果在执行手动渲染,对于某些情况下,你可能也想考虑渲染服务renderRootrenderPlain,或通过 drupal_render_root($build);
大卫·托马斯

15

最重要的部分是停止渲染自己。您几乎可以在任何地方返回渲染数组,应该这样做。像这样将字符串组合在一起不再起作用。

您需要的是:

$nodes = \Drupal::entityManager()->getStorage('node')->loadMultiple($nids);
// Or a use the static loadMultiple method on the entity class:
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);

// And then you can view/build them all together:
$build = \Drupal::entityTypeManager()->getViewBuilder('node')->viewMultiple($nodes, 'teaser');

我无法使它正常工作。Drupal核心中是否有一个可以效仿的例子?(最好是一个街区)
batigolix

2
不推荐使用EntityManager。请改用EntityTypeManager。
Tim

4

entity_view()将在Drupal 9.0.0之前删除。您可以在Drupal 8中使用它,但是如果您想编写从现在开始不会更改的代码(对于那部分),请使用以下代码代替entity_view()

$render_controller = \Drupal::entityTypeManager()->getViewBuilder($entity->getEntityTypeId());
$render_output = $render_controller->view($entity, $view_mode, $langcode);

从本质上讲,那是在entity_view()将引用替换为该函数正在使用的另一种不建议使用的方法之后,从中使用的代码。实际上,的文档Drupal::entityManager()说:

在Drupal 8.0.0中,将在Drupal 9.0.0之前删除。\Drupal::entityTypeManager()在大多数情况下,请改用。如果所需的方法未打开\Drupal\Core\Entity\EntityTypeManagerInterface,请参阅弃用的方法\Drupal\Core\Entity\EntityManager以查找正确的接口或服务。

如果entity_view()在不赞成使用之前将其更改,您仍然可以访问其文档页面以查看该功能使用的实际(和更新的)代码。


Drupal::entityTypeManager()现在应该Drupal::entityManager()弃用吗?
尼克

对,那是正确的。
kiamlaluno
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.