¿Cómo renderizo nodos, ahora que node_view () ha quedado en desuso?

22

En Drupal 7 lo uso con frecuencia node_view()para representar nodos (usando modos de vista) en bloques o páginas de la siguiente manera:

$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()ha sido desaprobado y reemplazado por un generador de vistas como se explica en el registro de cambios. Las entidades ahora son representadas por un generador de vistas . La información no es lo suficientemente detallada como para que yo pueda descubrir cómo lograr el mismo resultado.

¿Cómo se pueden representar nodos en Drupal 8 para que la salida se pueda utilizar en la matriz de representación de un bloque o página?

batigolix
fuente

Respuestas:

31

La respuesta dada por Berdir utiliza entityManager, que ha quedado en desuso en favor de servicios más específicos. Este es el código que uso actualmente.

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

Este código es un poco más detallado de lo que a algunos les gustaría; podría reducirlo a un par de líneas si realmente desea más brevedad al encadenar algunos métodos.

$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
fuente
¿No podrías usarlo $node = Node::load($nid)?
Nic
3
¿Por qué usar render()en la última línea? getViewBuilder($entity_type)->viewdevuelve una matriz de renderizado que se pasará a la vista de ramita.
Tim
1
@Tim Supongo que eso depende del contexto en el que estés usando esto, este es un wiki, así que puedes agregar tu entrada. Para algunos de mis casos de uso, no tuve el lujo de pasar esto directamente a una plantilla de ramita como una matriz de renderizado, sino que necesitaba realizar el renderizado yo mismo. La mejor de las suertes.
nicholas.alipaz
Si realiza el renderizado manualmente, en algunos casos, también puede considerar el servicio de renderizador renderRooto renderPlain, a través de drupal_render_root($build);
David Thomas
15

La parte más importante es dejar de renderizarte. Puede devolver matrices de renderizado en casi todas partes y debe hacerlo. Combinar cadenas como esas juntas ya no funciona.

Todo lo que necesitas es esto:

$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
fuente
No he podido hacer que esto funcione. ¿Hay algún ejemplo en el núcleo de Drupal que se pueda seguir? (preferiblemente un bloque)
batigolix
2
EntityManager está en desuso. Utilice EntityTypeManager en su lugar.
Tim
4

entity_view()será eliminado antes de Drupal 9.0.0. Puede usarlo en Drupal 8, pero si desea escribir desde ahora un código que (para esa parte) no cambiará para Drupal 9, puede usar el siguiente código en lugar de entity_view().

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

Esencialmente, ese es el código utilizado entity_view(), después de que reemplacé la referencia a otro método obsoleto que la función estaba usando. De hecho, la documentación de Drupal::entityManager()dice:

En Drupal 8.0.0 y será eliminado antes de Drupal 9.0.0. Use \Drupal::entityTypeManager()en su lugar en la mayoría de los casos. Si el método necesario no está activado \Drupal\Core\Entity\EntityTypeManagerInterface, consulte en desuso \Drupal\Core\Entity\EntityManagerpara encontrar la interfaz o el servicio correctos.

Si entity_view()se cambiará antes de quedar en desuso, aún puede visitar su página de documentación para ver el código real (y actualizado) que utiliza la función.

kiamlaluno
fuente
¿Debería ser esto Drupal::entityTypeManager()ahora que Drupal::entityManager()está en desuso?
Nic
Si, eso es correcto.
kiamlaluno