Comment rendre les nœuds, maintenant que node_view () est obsolète?

22

Dans Drupal 7, j'utilise fréquemment node_view()pour le rendu des nœuds (en utilisant les modes d'affichage) dans des blocs ou des pages comme suit:

$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()a été déconseillé et remplacé par un générateur de vues, comme expliqué dans l'enregistrement de modification Les entités sont désormais rendues par un générateur de vues . Les informations ne sont pas suffisamment détaillées pour que je puisse comprendre comment obtenir le même résultat.

Comment pouvez-vous rendre les nœuds dans Drupal 8 afin que la sortie puisse être utilisée dans le tableau de rendu d'un bloc ou d'une page?

batigolix
la source

Réponses:

31

La réponse donnée par Berdir utilise entityManager, déconseillée au profit de services plus spécifiques. C'est le code que j'utilise actuellement.

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

Ce code est un peu plus verbeux que certains pourraient le souhaiter; vous pouvez le réduire à quelques lignes si vous voulez vraiment plus de brièveté en enchaînant certaines méthodes.

$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
la source
Ne pourriez-vous pas simplement utiliser $node = Node::load($nid)?
Nic
3
Pourquoi utiliser render()dans la dernière ligne? getViewBuilder($entity_type)->viewrenvoie un tableau de rendu qui sera transmis à la vue des rameaux.
Tim
1
@Tim Je suppose que cela dépend du contexte dans lequel vous l'utilisez, c'est un wiki, vous êtes donc invités à ajouter vos commentaires. Pour certains de mes cas d'utilisation, je n'ai pas eu le luxe de le passer directement à un modèle de brindille en tant que tableau de rendu, mais j'avais plutôt besoin d'effectuer le rendu moi-même. Bonne chance.
nicholas.alipaz
Si vous effectuez le rendu manuellement, dans certains cas, vous pouvez également envisager le service de rendu renderRootou renderPlain, ou via drupal_render_root($build);
David Thomas
15

La partie la plus importante est d'arrêter de vous rendre. Vous pouvez renvoyer des tableaux de rendu presque partout et vous devez le faire. Combiner des chaînes comme ça ensemble ne fonctionne plus.

Tout ce dont vous avez besoin est le suivant:

$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
la source
Je n'ai pas pu faire fonctionner cela. Y a-t-il un exemple dans le noyau Drupal que l'on peut suivre? (de préférence un bloc)
batigolix
2
EntityManager est obsolète. Utilisez plutôt EntityTypeManager.
Tim
4

entity_view()sera supprimé avant Drupal 9.0.0. Vous pouvez l'utiliser dans Drupal 8, mais si vous voulez écrire depuis maintenant du code qui (pour cette partie) ne changera pas pour Drupal 9, vous pouvez utiliser le code suivant à la place de entity_view().

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

Essentiellement, c'est le code utilisé à partir du moment où entity_view()j'ai remplacé la référence à une autre méthode obsolète que la fonction utilisait. En fait, la documentation de Drupal::entityManager()dit:

Dans Drupal 8.0.0 et sera supprimé avant Drupal 9.0.0. Utilisez \Drupal::entityTypeManager()plutôt dans la plupart des cas. Si la méthode requise n'est pas activée \Drupal\Core\Entity\EntityTypeManagerInterface, consultez la section obsolète \Drupal\Core\Entity\EntityManagerpour trouver l'interface ou le service approprié.

Si entity_view()sera modifié avant d'être obsolète, vous pouvez toujours visiter sa page de documentation pour voir le code réel (et mis à jour) que la fonction utilise.

kiamlaluno
la source
Faut-il que ce soit Drupal::entityTypeManager()maintenant Drupal::entityManager()obsolète?
Nic
Oui c'est correct.
kiamlaluno