Jak renderować węzły, skoro teraz node_view () jest przestarzały?

22

W Drupal 7 często używam node_view()do renderowania węzłów (przy użyciu trybów widoku) w blokach lub stronach w następujący sposób:

$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()został uznany za przestarzały i zastąpiony przez konstruktor widoków, jak wyjaśniono w rekordzie zmian Encje są teraz renderowane przez konstruktor widoków . Informacje te nie są wystarczająco szczegółowe, aby móc dowiedzieć się, jak osiągnąć ten sam wynik.

Jak renderować węzły w Drupal 8, aby dane wyjściowe mogły być użyte w tablicy renderowania bloku lub strony?

batigolix
źródło

Odpowiedzi:

31

Odpowiedź udzielona przez Berdir zastosowań entityManager, która została zaniechana na rzecz większej liczby usług specyficznych. To kod, którego obecnie używam.

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

Ten kod jest nieco bardziej szczegółowy, niż niektórym może się spodobać; możesz to zredukować do kilku linii, jeśli naprawdę chcesz więcej zwięzłości, łącząc ze sobą niektóre metody.

$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
źródło
Nie możesz po prostu użyć $node = Node::load($nid)?
Nic
3
Dlaczego warto korzystać render()z ostatniej linii? getViewBuilder($entity_type)->viewzwraca tablicę renderującą, która zostanie przekazana do widoku gałązki.
Tim
1
@Tim Zakładam, że zależy to od kontekstu, w którym go używasz, jest to wiki, więc możesz dodać swoje uwagi. W niektórych moich przypadkach użycia nie miałem luksusu przekazywania tego bezpośrednio do szablonu gałązki jako tablicy renderowania, raczej musiałem sam wykonać renderowanie. Powodzenia.
nicholas.alipaz
W przypadku wykonywania tynku ręcznie, w niektórych przypadkach, można także rozważyć podobne usługi renderujący renderRootlub renderPlain, lub poprzez drupal_render_root($build);
David Thomas
15

Najważniejsze jest, aby przestać się renderować. Możesz zwrócić tablice renderowania prawie wszędzie i powinieneś to zrobić. Łączenie takich ciągów razem nie działa.

Wszystko czego potrzebujesz to:

$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
źródło
Nie udało mi się uruchomić tego. Czy istnieje rdzeń Drupala, za którym można podążać? (najlepiej blok)
batigolix,
2
EntityManager jest przestarzały. Zamiast tego użyj EntityTypeManager.
Tim
4

entity_view()zostaną usunięte przed Drupal 9.0.0. Możesz użyć go w Drupal 8, ale jeśli chcesz teraz pisać, że kod (dla tej części) nie zmieni się w Drupal 9, możesz zamiast tego użyć następującego kodu entity_view().

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

Zasadniczo taki kod został użyty entity_view()po zastąpieniu odwołania do innej nieaktualnej metody używanej przez tę funkcję. W rzeczywistości dokumentacja Drupal::entityManager()mówi:

W Drupal 8.0.0 i zostanie usunięty przed Drupal 9.0.0. Użyj \Drupal::entityTypeManager()zamiast tego w większości przypadków. Jeśli potrzebna metoda nie jest włączona \Drupal\Core\Entity\EntityTypeManagerInterface, zobacz przestarzałe, \Drupal\Core\Entity\EntityManageraby znaleźć odpowiedni interfejs lub usługę.

Jeśli entity_view()zostanie zmieniony przed wycofaniem, nadal możesz odwiedzić jego stronę dokumentacji, aby zobaczyć rzeczywisty (i zaktualizowany) kod używany przez funkcję.

kiamlaluno
źródło
Czy to powinno być Drupal::entityTypeManager()teraz Drupal::entityManager()przestarzałe?
Nic
Tak to jest poprawne.
kiamlaluno