बंडल में परिभाषित सभी फ़ील्ड प्राप्त करें


16

Drupal 7 में एक सामग्री प्रकार में प्रयुक्त सभी फ़ील्ड प्राप्त करने के लिए, मैं निम्नलिखित कोड का उपयोग करता हूं।

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

Drupal 8 के समतुल्य क्या है?


1
क्या आप एक इकाई के साथ काम कर रहे हैं? यदि ऐसा है: $fields = $entity->getFieldDefinitions();यह करेंगे। मैं नहीं यकीन है कि क्या के बराबर रहा हूँ field_info_instances()है, FieldStorageConfigएक है प्रतीत नहीं होता है
क्लाइव

नहीं, मैं केवल नोड_टाइप_डिट_फॉर्म में फेरबदल करना चाहता हूं और फॉर्म में नोड प्रकार द्वारा परिभाषित फ़ील्ड की सूची जोड़ना चाहता हूं। तो नोड का प्रकार केवल तर्क है जो मेरे पास है। इसलिए मैंने सोचा कि field_info_instances जैसे कार्य मदद कर सकते हैं।
प्रवीण अजाज

@Clive: मैं इकाई प्रकार के नाम का उपयोग करके एक इकाई वस्तु बना सकता हूं। एक फ़ंक्शन है NodeType :: load ('लेख') जो नोड प्रकारों के लिए ऑब्जेक्ट बनाता है।
प्रवीण अजाज

\Drupal::entityManager()->getFieldDefinitions('node', 'article')ने काम किया। :)
प्रवीण अजाज

जवाबों:


31

EntityManager आगे बढ़ने के लिए पदावनत है। इसके बजाय निम्नलिखित का उपयोग किया जा सकता है:

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

क्या केवल cck फ़ील्ड सूची प्राप्त करने का कोई तरीका है?
राजेश विश्वकर्मा

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
हालांकि यह काम करता है, फिर भी यूनिटमैन को पदावनत कर दिया जाता है। फ़ंक्शन परिभाषा के ऊपर की टिप्पणी में कहा गया है कि एंटिटी टाइपमैनेजर का उपयोग करें या यदि विधि लागू नहीं होती है (getFieldDefinitions नहीं है) "" सही या सेवा खोजने के लिए पदावनत \ Drupal \ Core \ EntityManager देखें। " मुझे यह टिप्पणी समझ में नहीं आती। मैं उपयोग करने के लिए सही फ़ंक्शन कहाँ देख सकता हूँ?
फेलिक्स ईव

5
आधार फ़ील्ड्स ( nid, uuid, revisions, langcode, etc) को फ़िल्टर करने के लिए आप कर सकते हैंif($field->getFieldStorageDefinition()->isBaseField() == FALSE)
leon.nk

1
क्या सभी प्रकार की सामग्री के लिए फ़ील्ड परिभाषाएँ प्राप्त करने का कोई तरीका नहीं है?
मैट

1
@ leon.nk हाँ <code> if ($ फ़ील्ड-> getFieldStorageDefinition () -> isBaseField () == FALSE) </ code> <code> से अधिक सटीक है अगर (($ field_definition-> getTargetBundle) ())! ) </ code> आधार फ़ील्ड्स को फ़िल्टर करने के लिए।
हनमंत

6

EntityManager को पदावनत किया गया है और मैंने अगला कोड इस्तेमाल किया है। मैंने नियंत्रक वर्ग में जोड़ा:

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