मैं दृश्य मोड सेटिंग्स का सम्मान करते हुए नोड के क्षेत्र को प्रोग्रामेटिक रूप से कैसे प्रस्तुत कर सकता हूं?


9

मैं एक ब्लॉक के अंदर नोड के क्षेत्र को प्रस्तुत करना चाहता हूं। यह इस तरह काम करता है:

<?php

if ($node) {
  if (isset($node->field_body_secondary) && $field = $node->field_body_secondary->value) {
    $markup = render($field);
    $build = array(
      '#type' => 'markup',
      '#markup' => $markup,
    );
  }
}

return $build;

लेकिन यह 100% नहीं है जैसे कि मैं सामान्य रूप से क्षेत्र को प्रस्तुत करना चाहता हूं, यह दृश्य मोड सेटिंग्स में दिखाई देता है।

जवाबों:


0

मुझे लगता है कि व्यूमोड को नोड पर लागू किया जाना चाहिए, न कि फ़ील्ड पर। इसलिए आपको व्यूबिल्डर प्राप्त करने और नोड रेंडर करने की आवश्यकता है। बाद में आप नोड रेंडर सरणी से फ़ील्ड के लिए प्रदान की गई सरणी चुन सकते हैं। इस तरह की तरह:

$vb = [EntityTypeManager]->getViewBuilder('node'); // Drupal\node\NodeViewBuilder
$nodeview = $vb->view($node, $viewmode);
$fieldrenderarray = $nodeview[youfield-here];

PS आपको "[EntityTypeManager]" को किसी भी तरह से @ unit_type.manager सेवा के रूप में इंजेक्ट करना होगा। या $ कंटेनर से अपने ब्लॉक-प्लगइन बनाने () में प्राप्त करें-> ('unit_type.manager')।


1
काफी नहीं। $nodeviewहै #nodeकुंजी के रूप में
एलेक्स

1
इसके अलावा, यह नोड को अलग करता है, खेतों को अलग नहीं करता
एलेक्स

1
हां, मैं नोड (और यह सब फ़ील्ड है) रेंडर करता हूं। लेकिन यह वही है जो आप अपने दृश्य मोड सेटिंग्स में समायोजित करते हैं। हो सकता है कि मुझे आपका सवाल गलत लगा हो।
रेनर फेइक

1
"$ nodeview [youfield-यहाँ]," null है, कम से कम Drupal 8.6.x पर
Onkeltem

1
अपने फ़ील्ड के मशीन नाम के साथ "yourfield-here" बदलें।
रेनर फेइक

29

दृश्य क्षेत्र की प्रदर्शन सेटिंग के साथ एकल फ़ील्ड को रेंडर करने के लिए आप view()फ़ील्ड की विधि का उपयोग कर सकते हैं :

टीज़र प्रारूप में छवि प्रदान करने के लिए उदाहरण:

$build['image'] = $node->field_image->view('teaser');

या पूरा शरीर:

$build['body'] = $node->body->view('full');

1
दुर्भाग्य से, यह दृश्य मोड सेटिंग्स का सम्मान नहीं करता है, जैसे लेबल और फ़ॉर्मेटर सेटिंग्स
एलेक्स

1
यह काम करना चाहिए, आप इस कमांड के साथ टहनी डीबग का उपयोग भी कर सकते हैं। यदि आप मौजूदा दृश्य मोड को स्ट्रिंग के रूप में प्रदान करते हैं, तो फ़ील्ड को इसके साथ स्वरूपित किया जाएगा। यदि आप एक सरणी प्रदान करते हैं तो आप अपनी खुद की डिस्प्ले सेटिंग्स दे सकते हैं, उदाहरण के लिए['label' => 'inline' ]
4k4

1
मेरा मानना ​​है कि मैं पहले से ही कोशिश की थी, लेकिन यह काम नहीं किया। मैं दुबारा कोशिश करूँगा। अब तक का धन्यवाद
एलेक्स

1
मुझे लगता है कि यह फ़ॉर्मेटर का सम्मान कर रहा है, लेकिन फ़ॉर्मेटर की सेटिंग्स का नहीं। इस के आउटपुट में सही सेटिंग्स शामिल हैं।
GRAYSIDE

2
यह अनिवार्य रूप से मुझे उस उत्तर के लिए मिला, जहां मैं अपना चर .twig में प्राप्त कर सकता हूं: $vars['var_name'] = $node_object->field_name->view()[0]; और फिर टहनी में, मैं {{var_name}} प्रदान कर सकता हूं
bdanin

4

यह उत्तर https://drupal.stackexchange.com/a/208061/394 पर बनता है

// Designate the field we want to render.
$field_name = 'body';
// Retrieve a render array for that field with the given view mode.
$render_array = $entity->$field_name->view('full');
// Render the result.
\Drupal::service('renderer')->renderRoot($render_array);

पूरी तरह से प्रोग्राम करने के लिए आप जिस क्षेत्र को कॉल करके समाप्त करते हैं renderRoot(), उसे प्रस्तुत करना, जो कि विशिष्ट पृष्ठ प्रतिक्रियाओं का उपयोग करने के लिए एक अलग रेंडर संदर्भ स्थापित करता है - एक अनुरोध या उप-अनुरोध के लिए एकल रेंडर संदर्भ। हम भी उपयोग कर सकते थे renderPlain(), लेकिन तब यह सभी चीजों से बच जाएगा।

Drush उत्तर में, लेकिन सामान्य पृष्ठ निष्पादन में नहीं, इसने मेरे लिए चेतावनी फेंक दी:

PHP warning:  DOMDocument::loadHTML(): Tag drupal-entity invalid in Entity, line: 1 in /drupal/core/lib/Drupal/Component/Utility/Html.php on line 286

2

एलेक्स के जवाब से संबंधित , यहां बताया गया है कि मैंने इसे config_pages का उपयोग करने और global_footer ब्लॉक बनाने के लिए कैसे संशोधित किया :

<?php

public function build() {
$config_name = 'global_footer';
$config = config_pages_config($config_name);
$build = array();
$markup = array();

$fieldsToRender = array(
  'field_body', 'field_foo', 'field_bar'
);

$viewmode = 'default';
$entityType = 'config_pages';
$display = entity_get_display($entityType, $config_name, $viewmode);
$viewBuilder = \Drupal::entityTypeManager()->getViewBuilder($entityType);

foreach ($fieldsToRender as $field_name) {
  if (isset($config->{$field_name}) && $field = $config->{$field_name}) {
    $fieldRenderable = $viewBuilder->viewField($field, $display->getComponent($field_name));
    if (count($fieldRenderable) &&! empty($fieldRenderable)) {
      $markup[] = \Drupal::service('renderer')->renderRoot($fieldRenderable);
    }
  }
}

if (count($markup)) {
  $build = array(
    '#type' => 'markup',
    '#markup' => implode("", $markup),
  );
}

return $build;

}

यह शायद एक config_pages सेटअप से मनमाने ढंग से फ़ील्ड रेंडर करने के लिए बेहतर है क्योंकि एक नोड से डेटा खींचने के लिए विरोध किया जाता है, लेकिन मुझे लगता है कि यह वास्तव में विशिष्ट उपयोग के मामले पर निर्भर करता है कि कौन सी विधि सबसे अच्छी है।


2

रेनर फेइके के जवाब के लिए धन्यवाद मैं समाधान के लिए आया था:

<?php

public function build() {
  $node = \Drupal::routeMatch()->getParameter('node');
  $build = array();
  $markup = array();

  $fieldsToRender = array(
    'field_node_ref', 'field_foo', 'field_bar',
  );

  $viewmode = 'default';
  $entityType = 'node';
  $display = entity_get_display($entityType, $node->getType(), $viewmode);
  $viewBuilder = \Drupal::entityTypeManager()->getViewBuilder($entityType);

  foreach ($fieldsToRender as $field_name) {
    if (isset($node->{$field_name}) && $field = $node->{$field_name}) {
      $fieldRenderable = $viewBuilder->viewField($field, $display->getComponent($field_name));
      if (count($fieldRenderable) &&! empty($fieldRenderable)) {
        $markup[] = \Drupal::service('renderer')->renderRoot($fieldRenderable);
      }
    }  
  }

  if (count($markup)) {
    $build = array(
      '#type' => 'markup',
      '#markup' => implode("", $markup),
    );
  }

  return $build;

}

$viewBuilder->viewFieldमैं किसी भी फ़ील्ड को अलग से उपयोग कर सकता हूँ, जिसकी मुझे आवश्यकता है। मुझे सिर्फ यह पता लगाना है कि व्यू मोड सेटिंग्स के आधार पर कैशिंग कैसे जोड़े जाएं, लेकिन यह एक और सवाल है :)

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