Artık node_view () kullanımdan kaldırılmış düğümleri nasıl oluşturabilirim?


22

Drupal 7'de node_view(), bloklar veya sayfalardaki düğümleri (görünüm modlarını kullanarak) sık sık şu şekilde kullanırım:

$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()Kaldırıldı ve değiştirilme açıklandığı gibi bir görünüm oluşturucu ile ikame edilmiş artık görünüşüdür üreticisi tarafından işlenen Unsurlar . Bilgi aynı sonucu nasıl elde edeceğimi çözebilecek kadar ayrıntılı değil.

Çıktıları bir blok veya sayfanın render dizisinde kullanabilmek için düğümleri Drupal 8'de nasıl oluşturabilirsiniz?

Yanıtlar:


31

Berdir verdiği cevap kullanımları entityManager, kullanımdan kaldırıldı daha spesifik hizmetler lehine. Bu şu anda kullandığım kod.

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

Bu kod bazılarının istediğinden biraz daha ayrıntılı; Bazı yöntemleri birlikte zincirleyerek gerçekten daha fazla kısalık istiyorsanız, bunu bir kaç çizgiye indirgeyebilirsiniz.

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

Sadece kullanamaz $node = Node::load($nid)mısın?
Nic

3
Neden render()son satırda kullanılıyor? dal görünümüne geçirilecek getViewBuilder($entity_type)->viewbir render dizisi döndürür .
Tim

1
@Tim Sanırım bunu içinde kullandığınız içeriğe bağlı olarak kabul ediyorum, bu bir wikidir, bu nedenle girişinizi ekleyebiliriz. Bazı kullanım durumlarımda bunu doğrudan render şablon olarak bir dallama şablonuna geçirme lüksüne sahip değildim, bunun yerine render işlemini kendim yapmam gerekiyordu. İyi şanslar.
nicholas.alipaz

Performans ise bazı durumlarda, ayrıca gibi Oluşturucu hizmeti dikkate almak olabilir, elle işlemek renderRootveya renderPlainveya üzeri drupal_render_root($build);
David Thomas

15

En önemli kısım kendini oluşturmayı bırakmak. Neredeyse her yerde render dizileri döndürebilir ve yapmanız gerekir. Böyle dizeleri bir araya getirmek artık işe yaramıyor.

Tek ihtiyacınız olan şey:

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

Bu çalışmayı başaramadım. Drupal çekirdeğinde takip edebileceğiniz bir örnek var mı? (tercihen bir blok)
56'da batigolix

2
EntityManager kullanımdan kaldırıldı. Bunun yerine EntityTypeManager kullanın.
Tim

4

entity_view()Drupal 9.0.0'dan önce kaldırılacak. Drupal 8'de kullanabilirsiniz, ancak şu andan beri (o kısım için) Drupal 9'un değişmeyeceği kodunu yazmak istiyorsanız, aşağıdaki kodu kullanabilirsiniz entity_view().

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

Temel olarak, entity_view()referansı, fonksiyonun kullandığı başka bir kullanımdan kaldırılmış yönteme değiştirdikten sonra, kullanılan koddur . Aslında, belgeler Drupal::entityManager()diyor ki:

Drupal 8.0.0'da ve Drupal 9.0.0'dan önce kaldırılacak. \Drupal::entityTypeManager()Çoğu durumda bunun yerine kullanın . Gerekli yöntem açık değilse , doğru arayüzü veya servisi bulmak için \Drupal\Core\Entity\EntityTypeManagerInterfacekullanımdan kaldırılmış olana bakın \Drupal\Core\Entity\EntityManager.

Kullanımdan entity_view()kaldırılmadan önce değiştirilecekse, fonksiyonun kullandığı gerçek (ve güncellenmiş) kodu görmek için dokümantasyon sayfasını ziyaret edebilirsiniz.


Bu Drupal::entityTypeManager()şimdi Drupal::entityManager()itiraz edilmeli mi?
Nic

Evet doğru.
kiamlaluno
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.