Wie rendere ich Knoten, nachdem node_view () veraltet ist?

22

In Drupal 7 verwende ich häufig node_view()zum Rendern von Knoten (mit Ansichtsmodi) in Blöcken oder Seiten Folgendes:

$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()wurde veraltet und durch einen View Builder ersetzt, wie im Änderungsdatensatz erläutert. Entitäten werden jetzt von einem View Builder gerendert . Die Informationen sind nicht detailliert genug, um herauszufinden, wie ich das gleiche Ergebnis erzielen kann.

Wie können Sie Knoten in Drupal 8 rendern, damit die Ausgabe im Render-Array eines Blocks oder einer Seite verwendet werden kann?

Batigolix
quelle

Antworten:

31

Die Antwort von Berdir verwendet entityManager, die zugunsten spezifischerer Dienste veraltet ist . Dies ist der Code, den ich derzeit verwende.

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

Dieser Code ist etwas ausführlicher, als manche vielleicht möchten. Sie können es auf ein paar Zeilen reduzieren, wenn Sie wirklich mehr Kürze wünschen, indem Sie einige Methoden miteinander verketten.

$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
quelle
Könntest du nicht einfach benutzen $node = Node::load($nid)?
Nic
3
Warum render()in der letzten Zeile verwenden? getViewBuilder($entity_type)->viewGibt ein Render-Array zurück , das an die Zweigansicht übergeben wird.
Tim
1
@Tim Ich gehe davon aus, dass dies von dem Kontext abhängt, in dem Sie dies verwenden. Dies ist ein Wiki. Sie können also gerne Ihre Eingaben hinzufügen. Für einige meiner Anwendungsfälle hatte ich nicht den Luxus, dies direkt als Render-Array an eine Zweig-Vorlage zu übergeben, sondern musste das Rendern selbst durchführen. Viel Glück.
nicholas.alipaz
Wenn Sie das Rendern manuell ausführen, können Sie in einigen Fällen auch den Rendererdienst renderRootoder renderPlainoder über drupal_render_root($build);
David Thomas
15

Das Wichtigste ist, dass Sie aufhören, sich selbst zu rendern. Sie können Render-Arrays fast überall zurückgeben, und Sie sollten es tun. Solch eine Kombination funktioniert nicht mehr.

Alles was Sie brauchen ist das:

$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
quelle
Ich habe es nicht geschafft, das zum Laufen zu bringen. Gibt es ein Beispiel in Drupal Core, dem man folgen kann? (vorzugsweise ein Block)
Batigolix
2
EntityManager ist veraltet. Verwenden Sie stattdessen EntityTypeManager.
Tim
4

entity_view()wird vor Drupal 9.0.0 entfernt. Sie könnten es in Drupal 8 verwenden, aber wenn Sie jetzt Code schreiben möchten, der (für diesen Teil) für Drupal 9 nicht geändert wird, können Sie stattdessen den folgenden Code verwenden entity_view().

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

Dies ist im Wesentlichen der Code, der verwendet wurde entity_view(), nachdem ich den Verweis auf eine andere veraltete Methode ersetzt habe, die von dieser Funktion verwendet wurde. In der Tat heißt es in der Dokumentation für Drupal::entityManager():

In Drupal 8.0.0 und wird vor Drupal 9.0.0 entfernt. Verwenden Sie \Drupal::entityTypeManager()stattdessen in den meisten Fällen. Wenn die erforderliche Methode nicht \Drupal\Core\Entity\EntityTypeManagerInterfaceaktiviert ist \Drupal\Core\Entity\EntityManager, suchen Sie im veralteten Bereich nach der richtigen Schnittstelle oder dem richtigen Dienst.

Wenn entity_view()Änderungen vorgenommen werden, bevor sie nicht mehr unterstützt werden, können Sie auf der Dokumentationsseite den aktuellen (und aktualisierten) Code anzeigen, den die Funktion verwendet.

kiamlaluno
quelle
Sollte das Drupal::entityTypeManager()jetzt so sein, dass Drupal::entityManager()es veraltet ist?
Nic
Ja, das ist richtig.
kiamlaluno