Як зробити візуалізацію вузлів, тепер коли 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 Я припускаю, що це залежить від контексту, яким ви користуєтесь цим усередині, це вікі, тому ви можете додати свої дані. Для деяких моїх випадків використання я не мав розкоші передавати це безпосередньо шаблону гілочок як масив візуалізації, скоріше мені потрібно було виконати візуалізацію самостійно. Удачі.
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()застаріле?
Нік

Так, це правильно.
kiamlaluno
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.