Come posso rendere i nodi, ora che node_view () è stato deprecato?


22

In Drupal 7 utilizzo spesso node_view()per il rendering di nodi (usando le modalità di visualizzazione) in blocchi o pagine come segue:

$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()è stato deprecato e sostituito da un view builder come spiegato nel record di modifica Le entità sono ora renderizzate da un view builder . Le informazioni non sono abbastanza dettagliate per essere in grado di capire come ottenere lo stesso risultato.

Come si possono eseguire il rendering dei nodi in Drupal 8 in modo che l'output possa essere utilizzato nell'array di rendering di un blocco o di una pagina?

Risposte:


31

La risposta data da Berdir utilizza entityManager, che è stata deprecata a favore di servizi più specifici. Questo è il codice che uso attualmente.

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

Questo codice è un po 'più dettagliato di quanto potrebbe piacere ad alcuni; potresti ridurlo a un paio di righe se vuoi davvero più brevità concatenando alcuni metodi.

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

Non potresti semplicemente usare $node = Node::load($nid)?
Nic,

3
Perché usare render()nell'ultima riga? getViewBuilder($entity_type)->viewrestituisce un array di rendering che verrà passato alla vista ramoscello.
Tim

1
@Tim suppongo che dipende dal contesto in cui lo stai utilizzando, questo è un wiki, quindi sei invitato ad aggiungere il tuo contributo. Per alcuni dei miei casi d'uso non ho avuto il lusso di passarlo direttamente a un modello di ramoscello come array di rendering, ma avevo bisogno di eseguire il rendering da solo. Buona fortuna.
nicholas.alipaz,

Se si esegue il rendering manualmente, in alcuni casi, è possibile prendere in considerazione anche il servizio di rendering renderRooto renderPlain, o tramite drupal_render_root($build);
David Thomas,

15

La parte più importante è smettere di renderti. Puoi restituire array di rendering quasi ovunque e dovresti farlo. Combinare insieme stringhe del genere non funziona più.

Tutto ciò di cui hai bisogno è questo:

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

Non sono stato in grado di farlo funzionare. C'è un esempio nel core di Drupal che si può seguire? (preferibilmente un blocco)
batigolix,

2
EntityManager è obsoleto. Utilizzare invece EntityTypeManager.
Tim

4

entity_view()sarà rimosso prima di Drupal 9.0.0. Potresti usarlo in Drupal 8, ma se vuoi scrivere da ora il codice che (per quella parte) non cambierà per Drupal 9, puoi usare il seguente codice invece di entity_view().

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

In sostanza, questo è il codice usato da entity_view(), dopo aver sostituito il riferimento a un altro metodo obsoleto che la funzione stava usando. In effetti, la documentazione per Drupal::entityManager()dice:

In Drupal 8.0.0 e verrà rimosso prima di Drupal 9.0.0. Utilizzare \Drupal::entityTypeManager()invece nella maggior parte dei casi. Se il metodo necessario non è attivo \Drupal\Core\Entity\EntityTypeManagerInterface, consultare il deprecato \Drupal\Core\Entity\EntityManagerper trovare l'interfaccia o il servizio corretti.

Se entity_view()verrà modificato prima di essere deprecato, è comunque possibile visitare la pagina della documentazione per vedere il codice effettivo (e aggiornato) utilizzato dalla funzione.


Questo dovrebbe essere Drupal::entityTypeManager()ora che Drupal::entityManager()è deprecato?
Nic,

Si, è corretto.
kiamlaluno
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.