আমি কীভাবে প্রোগ্রাম মোডের সেটিংসকে শ্রদ্ধার সাথে নোডের ক্ষেত্র রেন্ডার করতে পারি?


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];

পিএস আপনাকে "সত্তা টাইপম্যানেজার]" কোনওভাবেই @ সত্তা_তাই টাইপ.ম্যানেজার পরিষেবা হিসাবে ইনজেকশনের প্রয়োজন। অথবা এটি আপনার ব্লক-প্লাগইনে) ধারক-> গিটার () সত্তা_পাল্প.মিনেজার ') থেকে তৈরি করুন।


1
বেশ না। কী হিসাবে $nodeviewআছে#node
অ্যালেক্স

1
এছাড়াও, এটি পৃথক ক্ষেত্র নয়, নোডকে রেন্ডার করে
অ্যালেক্স

1
হ্যাঁ, আমি নোডটি সরবরাহ করি (এবং এটির সমস্ত ক্ষেত্র)। তবে আপনি নিজের ভিউ মোড সেটিংসে এটি সামঞ্জস্য করেন। আপনার প্রশ্নটি আমি ভুল পেয়েছি।
রেনার ফিয়েক

1
"$ nodeview [youfield-এখানে];" নূন্যতম, কমপক্ষে দ্রুপাল 8.6.x এ
অনকেল্টেম

1
আপনার ফিল্ডের মেশিনের নাম দিয়ে "আপনার ফিল্ড-এখানে" প্রতিস্থাপন করুন।
রেনার ফিয়েক

29

একটি ভিউ মোডের ডিসপ্লে সেটিং সহ একটি একক ক্ষেত্র রেন্ডার করতে আপনি view()এই ক্ষেত্রটির পদ্ধতিটি ব্যবহার করতে পারেন :

টিজার ফরমেটে চিত্রটি রেন্ডার করার উদাহরণ:

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

বা দেহ পূর্ণ:

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

1
দুর্ভাগ্যক্রমে, এটি লেবেল এবং ফর্ম্যাটর সেটিংসের মতো ভিউ মোড সেটিংসকে সম্মান করে না
অ্যালেক্স

1
এটি কাজ করা উচিত, আপনি এই কমান্ডের সাহায্যে ডাবল ডিবাগও ব্যবহার করতে পারেন। আপনি যদি স্ট্রিং হিসাবে বিদ্যমান ভিউ মোড সরবরাহ করেন তবে ক্ষেত্রটি এটির সাথে ফর্ম্যাট হবে। যদি আপনি কোনও অ্যারে সরবরাহ করেন তবে আপনি নিজের ডিসপ্লে সেটিংস দিতে পারেন, উদাহরণস্বরূপ['label' => 'inline' ]
4k4

1
আমি বিশ্বাস করি যে আমি এটি ইতিমধ্যে চেষ্টা করেছি তবে এটি কার্যকর হয়নি। আমি আবার চেষ্টা করব. এখন পর্যন্ত ধন্যবাদ
অ্যালেক্স

1
আমি দেখতে পেলাম যে এটি বিন্যাসকে সম্মান করছে, তবে বিন্যাসের সেটিংসটি নয়। এর আউটপুটটিতে সঠিক সেটিংস অন্তর্ভুক্ত রয়েছে।
গ্রেসাইড

2
এটি মূলত আমাকে উত্তরটি পেয়েছে, যেখানে আমি আমার পরিবর্তনশীলটি .twig এ পেতে পারি: $vars['var_name'] = $node_object->field_name->view()[0]; এবং তারপরে টুইগে আমি :0 {var_name}}
বদনিন

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(), তবে তারপরে এটি সমস্ত জিনিস থেকে রক্ষা পাবে।

ড্রাশ রিপ্লেতে কিন্তু সাধারণ পৃষ্ঠার প্রয়োগের ক্ষেত্রে নয়, এটি আমার জন্য একটি সতর্কবার্তা ফেলেছে:

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

অ্যালেক্সের উত্তরের সাথে সম্পর্কিত , আমি এখানে কনফিগার_ পৃষ্ঠাগুলি ব্যবহার করতে এবং একটি গ্লোবাল_ফুটার ব্লক তৈরি করতে এটি কীভাবে পরিবর্তন করেছি :

<?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;

}

কোনও নোড থেকে ডেটা টানার বিপরীতে একটি কনফিগার_পেজ সেটআপ থেকে স্বেচ্ছাসেবী ক্ষেত্রগুলি রেন্ডার করা ভাল তবে আমার ধারণা এটি কোন পদ্ধতিটি সবচেয়ে ভাল তা নির্দিষ্ট ব্যবহারের ক্ষেত্রে সত্যই নির্ভর করে।


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আমি যে কোনও ক্ষেত্র পৃথকভাবে আমার রেন্ডার করতে পারি ব্যবহার করে । আমার কেবল ভিউ মোড সেটিংসের উপর নির্ভর করে ক্যাচিং কীভাবে যুক্ত করতে হবে তা খুঁজে নেওয়া দরকার তবে এটি অন্য একটি প্রশ্ন :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.