मैं नोड्स कैसे प्रस्तुत करता हूं, अब वह नोड_व्यू () पदावनत कर दिया गया है?


22

Drupal 7 में मैं अक्सर node_view()ब्लॉक या पृष्ठों में नोड्स (दृश्य मोड का उपयोग करके) के लिए उपयोग करता हूं :

$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()बदल दिया गया है और एक दृश्य बिल्डर द्वारा बदल दिया गया है जैसा कि परिवर्तन रिकॉर्ड में समझाया गया है एंटिटीज को अब एक व्यू बिल्डर द्वारा प्रस्तुत किया गया है । जानकारी मेरे लिए पर्याप्त नहीं है कि मैं यह पता लगा सकूं कि उसी परिणाम को कैसे प्राप्त किया जा सकता है।

आप Drupal 8 में नोड्स कैसे प्रस्तुत कर सकते हैं ताकि आउटपुट का उपयोग किसी ब्लॉक या पेज के रेंडर सरणी में किया जा सके?

जवाबों:


31

जवाब Berdir द्वारा दिए गए का उपयोग करता है entityManager, जो पदावनत किया गया है और अधिक विशिष्ट सेवाओं के पक्ष में। यह वह कोड है जो मैं वर्तमान में उपयोग करता हूं।

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

यह कोड कुछ अधिक पसंद करने की तुलना में थोड़ा अधिक क्रिया है; अगर आप वास्तव में कुछ तरीकों को एक साथ जोड़कर अधिक संक्षिप्तता चाहते हैं, तो आप इसे कुछ हद तक कम कर सकते हैं।

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

क्या आप सिर्फ इस्तेमाल नहीं कर सकते $node = Node::load($nid)?
निक

3
render()अंतिम पंक्ति में उपयोग क्यों करें ? getViewBuilder($entity_type)->viewएक रेंडर एरे देता है जिसे ट्वीग व्यू में पास किया जाएगा।
टिम

1
@ मुझे लगता है कि आप इस संदर्भ का उपयोग कर रहे हैं पर निर्भर करता है, यह एक विकी है, तो आप अपने इनपुट जोड़ने के लिए स्वागत कर रहे हैं। मेरे उपयोग के कुछ मामलों के लिए मुझे रेंडर सरणी के रूप में इसे सीधे ट्वीग टेंपलेट में पास करने की लक्जरी नहीं थी, बल्कि मुझे खुद रेंडर करने की आवश्यकता थी। शुभकामनाएँ।
nicholas.alipaz

तो प्रदर्शन कर मैन्युअल रूप से प्रस्तुत करना है, कुछ मामलों के लिए, आप भी रेंडरर सेवा पर विचार करने की तरह हो सकता है renderRootया renderPlain, या के माध्यम से drupal_render_root($build);
डेविड थॉमस

15

सबसे महत्वपूर्ण हिस्सा अपने आप को प्रदान करना बंद करना है। आप लगभग हर जगह रेंडर सरणियाँ वापस कर सकते हैं और आपको यह करना चाहिए। तार को एक साथ मिलाने से कोई काम नहीं होता।

आपको बस यही चाहिए:

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

मुझे यह काम नहीं मिल रहा है। क्या द्रुपाल कोर में एक उदाहरण है जिसका कोई अनुसरण कर सकता है? (अधिमानतः एक ब्लॉक)
बैटीगोलिक्स

2
EntityManager को पदावनत किया जाता है। इसके बजाय EntityTypeManager का उपयोग करें।
टिम

4

entity_view()Drupal 9.0.0 से पहले हटा दिया जाएगा। आप Drupal 8 में इसका उपयोग कर सकते हैं, लेकिन यदि आप अब से लिखना चाहते हैं कि कोड (उस भाग के लिए) Drupal 9 के लिए नहीं बदलेगा, तो आप इसके बजाय निम्नलिखित कोड का उपयोग कर सकते हैं entity_view()

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

अनिवार्य रूप से, यह उस कोड का उपयोग किया जाता है entity_view(), जिसके बाद मैंने संदर्भ को किसी अन्य पदावनत पद्धति के संदर्भ में बदल दिया जो फ़ंक्शन उपयोग कर रहा था। वास्तव में, दस्तावेज़ के लिए Drupal::entityManager()कहता है:

Drupal 8.0.0 में और Drupal 9.0.0 से पहले हटा दिया जाएगा। का प्रयोग करें \Drupal::entityTypeManager()ज्यादातर मामलों में बजाय। यदि आवश्यक विधि चालू नहीं है \Drupal\Core\Entity\EntityTypeManagerInterface, \Drupal\Core\Entity\EntityManagerतो सही इंटरफ़ेस या सेवा खोजने के लिए पदावनत देखें ।

यदि entity_view()पदावनत किए जाने से पहले इसे बदल दिया जाएगा, तो आप फ़ंक्शन का उपयोग करने वाले वास्तविक (और अपडेट किए गए) कोड को देखने के लिए इसके प्रलेखन पृष्ठ पर भी जा सकते हैं।


क्या Drupal::entityTypeManager()अब ऐसा होना चाहिए, जो Drupal::entityManager()पदावनत हो जाए?
निक

हां यह सही है।
kiamlaluno
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.