web-dev-qa-db-fra.com

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

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épréciée et remplacée par un générateur de vues, comme expliqué dans l'enregistrement des modifications 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?

24
batigolix

Le réponse donnée par Berdir utilise entityManager, qui a été déprécié en faveur 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 aimer; vous pouvez le réduire à quelques lignes si vous voulez vraiment plus de concision 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));
33
nicholas.alipaz

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');
15
Berdir

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 au lieu 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 de entity_view(), après avoir 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() à la place dans Si la méthode requise n'est pas activée \Drupal\Core\Entity\EntityTypeManagerInterface , consultez la section obsolète \Drupal\Core\Entity\EntityManager pour 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.

4
kiamlaluno