ฉันจะแสดงโหนดได้อย่างไรในขณะนี้ที่ 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);

รหัสนี้เป็น verbose เล็กน้อยกว่าบางคนอาจชอบ; คุณสามารถลดมันลงไปเป็นสองบรรทัดได้ถ้าคุณต้องการความกระชับที่มากขึ้นโดยการผูกมัดบางวิธีเข้าด้วยกัน

$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)ไม่ได้เหรอ
Nic

3
เหตุใดจึงใช้render()ในบรรทัดสุดท้าย getViewBuilder($entity_type)->viewส่งคืนอาร์เรย์การเรนเดอร์ที่จะส่งผ่านไปยังมุมมองทวิก
ทิม

1
@ ฉันคิดว่าขึ้นอยู่กับบริบทที่คุณใช้ภายในนี่คือวิกิดังนั้นคุณสามารถเพิ่มอินพุตของคุณได้ สำหรับบางกรณีการใช้งานของฉันฉันไม่ได้มีความหรูหราในการส่งผ่านโดยตรงไปยังเทมเพลตกิ่งเป็นเรนเดอร์เรนเดอร์ แต่ฉันต้องทำการเรนเดอร์ด้วยตนเอง ขอให้โชคดี
nicholas.alipaz

หากดำเนินการเรนเดอร์ด้วยตนเองในบางกรณีคุณอาจต้องการพิจารณาบริการเรนเดอร์renderRootหรือrenderPlainหรือผ่านทาง drupal_render_root($build);
David Thomas

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()แทนในกรณีส่วนใหญ่ หากวิธีการที่จำเป็นไม่ได้เปิด\Drupal\Core\Entity\EntityTypeManagerInterfaceดูการคัดค้าน\Drupal\Core\Entity\EntityManagerเพื่อหาอินเตอร์เฟซหรือบริการที่ถูกต้อง

หากentity_view()จะมีการเปลี่ยนแปลงก่อนเลิกใช้งานคุณยังสามารถเยี่ยมชมหน้าเอกสารของตนเพื่อดูรหัส (และอัพเดต) จริงที่ฟังก์ชันใช้


ควรเป็นDrupal::entityTypeManager()ตอนนี้ที่Drupal::entityManager()เลิกใช้แล้ว?
Nic

ใช่ถูกต้องแล้ว
kiamlaluno
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.