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でノードをレンダーするにはどうすればよいですか?

回答:


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返します。
ティム

1
@Timあなたがこれを使用しているコンテキストに依存すると思います、これはwikiですので、あなたの入力を歓迎します。いくつかのユースケースでは、これをレンダー配列として小枝テンプレートに直接渡す余裕がなく、自分でレンダーを実行する必要がありました。幸運を祈ります。
nicholas.alipaz

実行する場合は、いくつかのケースのために、あなたも同じようレンダラサービスを検討して、手動でレンダリングしrenderRootたりrenderPlain、あるいは経由 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を使用してください。
ティム

4

entity_view()Drupal 9.0.0より前に削除されます。Drupal 8で使用できますが、Drupal 9で(その部分について)変更されないコードを今から記述したい場合は、の代わりに次のコードを使用できます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()ほとんどの場合、代わりに使用してください。必要なメソッドがon \Drupal\Core\Entity\EntityTypeManagerInterfaceでない場合、非推奨\Drupal\Core\Entity\EntityManagerを参照して、正しいインターフェースまたはサービスを見つけてください。

entity_view()廃止される前に変更される場合は、ドキュメントページにアクセスして、関数が使用する実際の(および更新された)コードを確認できます。


これはあるべきDrupal::entityTypeManager()今ことをDrupal::entityManager()推奨されていませんか?
ニック

はい、それは正しいです。
キアマルノ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.