Bagaimana cara saya membuat node, sekarang node_view () sudah tidak digunakan lagi?

22

Di Drupal 7 saya sering menggunakan node_view()untuk rendering node (menggunakan mode tampilan) di blok atau halaman sebagai berikut:

$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()telah ditinggalkan dan diganti oleh view builder seperti yang dijelaskan dalam catatan perubahan Entitas sekarang diberikan oleh view builder . Informasi ini tidak cukup detail bagi saya untuk dapat mengetahui cara mencapai hasil yang sama.

Bagaimana Anda membuat render node dalam Drupal 8 sehingga output dapat digunakan dalam render array dari blok atau halaman?

batigolix
sumber

Jawaban:

31

The jawaban yang diberikan oleh Berdir penggunaan entityManager, yang telah usang dalam mendukung layanan tertentu yang lebih. Ini adalah kode yang saya gunakan saat ini.

$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);

Kode ini sedikit lebih bertele-tele daripada yang mungkin disukai beberapa orang; Anda bisa menguranginya menjadi beberapa baris jika Anda benar-benar ingin lebih singkat dengan merantai beberapa metode.

$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));
nicholas.alipaz
sumber
Tidak bisakah Anda menggunakan saja $node = Node::load($nid)?
Nic
3
Mengapa digunakan render()di baris terakhir? getViewBuilder($entity_type)->viewmengembalikan array render yang akan diteruskan ke tampilan ranting.
Tim
1
@Tim Saya berasumsi itu tergantung pada konteks Anda menggunakan ini, ini adalah wiki, jadi Anda dipersilakan untuk menambahkan input Anda. Untuk beberapa kasus penggunaan saya, saya tidak memiliki kemewahan melewati ini langsung ke template ranting sebagai array render, melainkan saya perlu melakukan render sendiri. Semoga berhasil.
nicholas.alipaz
Jika melakukan render secara manual, untuk beberapa kasus, Anda mungkin juga ingin mempertimbangkan layanan renderer renderRootatau renderPlain, atau melalui drupal_render_root($build);
David Thomas
15

Bagian yang paling penting adalah berhenti mengubah diri Anda. Anda dapat mengembalikan array render hampir di semua tempat dan Anda harus melakukannya. Menggabungkan string seperti itu bersama tidak lagi berfungsi.

Yang Anda butuhkan adalah ini:

$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');
Berdir
sumber
Saya belum bisa menjalankannya. Apakah ada contoh dalam inti Drupal yang bisa diikuti? (lebih disukai satu blok)
batigolix
2
EntityManager sudah usang. Gunakan EntityTypeManager sebagai gantinya.
Tim
4

entity_view()akan dihapus sebelum Drupal 9.0.0. Anda dapat menggunakannya di Drupal 8, tetapi jika Anda ingin menulis karena sekarang kode yang (untuk bagian itu) tidak akan berubah untuk Drupal 9, Anda dapat menggunakan kode berikut sebagai ganti entity_view().

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

Pada dasarnya, itu adalah kode yang digunakan entity_view(), setelah saya mengganti referensi ke metode usang lain yang fungsinya gunakan. Bahkan, dokumentasi untuk Drupal::entityManager()mengatakan:

Di Drupal 8.0.0 dan akan dihapus sebelum Drupal 9.0.0. Gunakan \Drupal::entityTypeManager()sebagai gantinya dalam banyak kasus. Jika metode yang diperlukan tidak aktif \Drupal\Core\Entity\EntityTypeManagerInterface, lihat yang sudah usang \Drupal\Core\Entity\EntityManageruntuk menemukan antarmuka atau layanan yang benar.

Jika entity_view()akan diubah sebelum tidak digunakan lagi, Anda masih dapat mengunjungi halaman dokumentasinya untuk melihat kode aktual (dan yang diperbarui) yang digunakan fungsi.

kiamlaluno
sumber
Haruskah ini Drupal::entityTypeManager()sekarang yang Drupal::entityManager()sudah usang?
Nic
Ya itu benar.
kiamlaluno