সমস্ত ক্ষেত্র একটি বান্ডেলে সংজ্ঞায়িত করুন


16

সমস্ত ক্ষেত্র একটি সামগ্রীর ধরণে ব্যবহৃত পেতে, ড্রুপাল 7 এ আমি নিম্নলিখিত কোডটি ব্যবহার করি।

$fields = field_info_instances('node', 'article');

দ্রুপাল 8 এর সমমান কী?


1
আপনি কি কোনও সত্তার সাথে কাজ করছেন? যদি তাই হয়: $fields = $entity->getFieldDefinitions();এটি করবে। আমি নিশ্চিত নই যে এর সমতুল্য field_info_instances()কী, FieldStorageConfigতার একটি নেই বলে মনে হচ্ছে
ক্লাইভ

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

@ ক্লাইভ: আমি সত্তার প্রকারের নামটি ব্যবহার করে কোনও সত্তা অবজেক্ট তৈরি করতে পারি। নোডটাইপ :: লোড ('নিবন্ধ') এখানে একটি ফাংশন রয়েছে যা নোডের ধরণের জন্য অবজেক্ট তৈরি করে।
প্রবীণ আজাজ

\Drupal::entityManager()->getFieldDefinitions('node', 'article')কাজটি ক্লাইভ করেছেন :)
প্রবীন আজাজ

উত্তর:


31

সত্তা ম্যানেজারটি এগিয়ে চলার অবমূল্যায়ন করা হয়। নিম্নলিখিত পরিবর্তে ব্যবহার করা যেতে পারে:

$entityFieldManager = \Drupal::service('entity_field.manager');
$fields = $entityFieldManager->getFieldDefinitions($entity_type, $bundle);

শুধুমাত্র সিসি মাঠের তালিকা পেতে কোনও উপায় আছে?
রাজেশ বিশ্বকর্মা

2
এটি এখনই গ্রহণযোগ্য উত্তর হওয়া উচিত।
ব্রাম

25

আমি এটি getFieldDefinitions()সংজ্ঞায়িত ব্যবহার করে অর্জন করেছি Class EntityManager। সুতরাং যাতে সমস্ত ক্ষেত্র একটি নির্দিষ্ট বান্ডেলে ব্যবহৃত হয়, এখানে একটি উপায়:

$bundle_fields = \Drupal::entityManager()->getFieldDefinitions('node', 'article');

যদিও উপরের ক্ষেত্রগুলি $bundle_fieldsহিসাবেও রয়েছে nid, uuid, revisions, langcode, etc। সুতরাং একটি সঠিক আউটপুট পেতে আমি এই জাতীয় কিছু করেছি:

  $entity_type_id = 'node';
  $bundle = 'article';
  foreach (\Drupal::entityManager()->getFieldDefinitions($entity_type_id, $bundle) as $field_name => $field_definition) {
    if (!empty($field_definition->getTargetBundle())) {
      $bundleFields[$entity_type_id][$field_name]['type'] = $field_definition->getType();
      $bundleFields[$entity_type_id][$field_name]['label'] = $field_definition->getLabel();
    }
  }

2
এটি কাজ করে তবে সত্তা ম্যানেজারটি অবনতিযুক্ত। ফাংশন সংজ্ঞাটির উপরে থাকা মন্তব্যে বলা হয়েছে অ্যান্টিটাইপম্যানেজার ব্যবহার করুন বা যদি পদ্ধতিটি প্রয়োগ না করা হয় (getFieldDifinitions না হয়) "সঠিক ইন্টারফেস বা পরিষেবা সন্ধানের জন্য অবচিত \ দ্রুপাল \ কোর \ সত্ত্বা \ সত্তা ম্যানেজারটি দেখুন" " আমি এই মন্তব্য বুঝতে পারি না। আমি সঠিক ফাংশনটি ব্যবহার করার জন্য কোথায় খুঁজছি?
ফেলিক্স ইভ

5
বেস ক্ষেত্রগুলি ফিল্টার করতে ( nid, uuid, revisions, langcode, etc) আপনি যা করতে পারেনif($field->getFieldStorageDefinition()->isBaseField() == FALSE)
leon.nk

1
সমস্ত ধরণের সামগ্রীর ধরণের ক্ষেত্রের সংজ্ঞাগুলি পাওয়ার জন্য কি কোনও উপায় নেই?
ম্যাট

1
@ leon.nk হ্যাঁ <কোড> যদি ($ ক্ষেত্র-> getFieldStorageD Definition () -> isBaseField () == মিথ্যা) </code> <code> এর চেয়ে আরও সুনির্দিষ্ট হয় যদি (! খালি ($ ক্ষেত্র_সংশ্লিষ্ট-> getTargetBundle ()) ) </code> বেস ক্ষেত্রগুলি ফিল্টার করতে।
হনমন্ত

6

সত্তা ম্যানেজারটি অবহেলা করা হয়েছে এবং আমি পরবর্তী কোডটি ব্যবহার করেছি। আমি নিয়ামক শ্রেণিতে যুক্ত করেছি:

 /**
   * The entity field manager.
   *
   * @var \Drupal\Core\Entity\EntityFieldManager
   */
  protected $entityFieldManager;

  /**
   * Constructor.
   *
   * @param \Drupal\Core\Entity\EntityFieldManager $entity_field_manager
   *   The entity field manager.
   */
  public function __construct(EntityFieldManager $entity_field_manager) {
    $this->entityFieldManager = $entity_field_manager;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('entity_field.manager')
    );
  }

// এখানে কিছু আপনার ফাংশন

 /**
   * Build table rows.
   */
  protected function buildRows() {
    $entity_type_id = 'node';
    $bundle = 'article';
$fields = $this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle);
foreach ($fields as $field_name => $field_definition) {
  if (!empty($field_definition->getTargetBundle())) {               
    $listFields[$field_name]['type'] = $field_definition->getType();
    $listFields[$field_name]['label'] = $field_definition->getLabel();                  
  }
}
$rows = [];
foreach ($listFields as $field_name => $info) {
  $rows[] = $this->buildRow($info, $field_name);
}
return $rows;

}

https://www.drupal.org/node/2549139 এটি আমাকে সহায়তা করেছিল


কিছু টিপস: কনস্ট্রাক্টরগুলিতে (এবং সাধারণভাবে) সর্বদা ইন্টারফেস ব্যবহার করুন। বেশিরভাগ ড্রুপাল পরিষেবা বাস্তবায়নের একটি ভাল সংজ্ঞাযুক্ত ইন্টারফেস রয়েছে।
ssibal
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.