web-dev-qa-db-ja.com

node_view()が廃止されたので、ノードをレンダリングするにはどうすればよいですか?

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でノードをレンダリングして、ブロックまたはページのレンダー配列で出力を使用できるようにするにはどうすればよいですか?

24
batigolix

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));
33
nicholas.alipaz

最も重要な部分は、自分でレンダリングを停止することです。ほぼすべての場所でレンダー配列を返すことができるので、それを行う必要があります。このような文字列を組み合わせても機能しません。

必要なのはこれだけです:

$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');
15
Berdir

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() を使用してくださいほとんどの場合。必要なメソッドがオンになっていない場合 _\Drupal\Core\Entity\EntityTypeManagerInterface_ は、非推奨の _\Drupal\Core\Entity\EntityManager_ を参照して、正しいインターフェースまたはサービスを見つけてください。

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

4
kiamlaluno