Làm cách nào để kết xuất các nút, bây giờ nút_view () đã bị phản đối?


22

Trong Drupal 7 tôi thường sử dụng node_view()để kết xuất các nút (sử dụng chế độ xem) trong các khối hoặc trang như sau:

$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()đã bị phản đối và được thay thế bởi trình tạo chế độ xem như được giải thích trong bản ghi thay đổi Các thực thể hiện được hiển thị bởi trình tạo chế độ xem . Thông tin không đủ chi tiết để tôi có thể tìm ra cách đạt được kết quả tương tự.

Làm thế nào bạn có thể kết xuất các nút trong Drupal 8 để có thể sử dụng đầu ra trong mảng kết xuất của một khối hoặc trang?

Câu trả lời:


31

Câu trả lời được đưa ra bởi Berdir sử dụng entityManager, đã bị từ chối ủng hộ các dịch vụ cụ thể hơn. Đây là mã tôi hiện đang sử dụng.

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

Mã này dài hơn một chút so với một số có thể thích; bạn có thể giảm nó xuống một vài dòng nếu bạn thực sự muốn ngắn gọn hơn bằng cách kết hợp một số phương pháp.

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

Bạn không thể sử dụng $node = Node::load($nid)?
Nic

3
Tại sao sử dụng render()trong dòng cuối cùng? getViewBuilder($entity_type)->viewtrả về một mảng kết xuất sẽ được chuyển đến dạng xem twig.
Tim

1
@Tim Tôi giả sử rằng tùy thuộc vào ngữ cảnh bạn đang sử dụng, đây là wiki, vì vậy bạn có thể thêm đầu vào của mình. Đối với một số trường hợp sử dụng của tôi, tôi không có khả năng chuyển trực tiếp điều này sang mẫu twig dưới dạng mảng kết xuất, thay vào đó tôi cần phải tự thực hiện kết xuất. May mắn nhất.
nicholas.alipaz

Nếu thực hiện kết xuất thủ công, đối với một số trường hợp, bạn cũng có thể xem xét dịch vụ kết xuất renderRoothoặc renderPlain, hoặc thông qua drupal_render_root($build);
David Thomas

15

Phần quan trọng nhất là ngừng hiển thị chính mình. Bạn có thể trả về mảng kết xuất gần như ở mọi nơi và bạn nên làm điều đó. Kết hợp các chuỗi như thế với nhau không hoạt động nữa.

Tất cả bạn cần là thế này:

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

Tôi đã không thể làm việc này. Có một ví dụ trong lõi Drupal mà người ta có thể làm theo? (tốt nhất là một khối)
batigolix

2
EntityManager không được dùng nữa. Sử dụng EntityTypeManager thay thế.
Tim

4

entity_view()sẽ bị xóa trước Drupal 9.0.0. Bạn có thể sử dụng nó trong Drupal 8, nhưng nếu bạn muốn viết từ bây giờ mã đó (đối với phần đó) sẽ không thay đổi cho Drupal 9, bạn có thể sử dụng mã sau thay vì entity_view().

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

Về cơ bản, đó là mã được sử dụng từ entity_view(), sau khi tôi thay thế tham chiếu sang một phương thức không dùng nữa mà hàm đang sử dụng. Trong thực tế, các tài liệu cho Drupal::entityManager()biết:

Trong Drupal 8.0.0 và sẽ bị xóa trước Drupal 9.0.0. Sử dụng \Drupal::entityTypeManager()thay thế trong hầu hết các trường hợp. Nếu phương thức cần thiết không được bật \Drupal\Core\Entity\EntityTypeManagerInterface, hãy xem phần không dùng \Drupal\Core\Entity\EntityManagerđể tìm giao diện hoặc dịch vụ chính xác.

Nếu entity_view()sẽ bị thay đổi trước khi không được chấp nhận, bạn vẫn có thể truy cập trang tài liệu của nó để xem mã thực tế (và cập nhật) mà hàm sử dụng.


Này nên Drupal::entityTypeManager()bây giờ mà Drupal::entityManager()bị phản đối?
Nic

Vâng, đó là chính xác.
kiamlaluno
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.