รับฟิลด์ทั้งหมดที่กำหนดไว้ในชุดข้อมูล


16

เพื่อรับฟิลด์ทั้งหมดที่ใช้ในประเภทเนื้อหาใน Drupal 7 ฉันใช้รหัสต่อไปนี้

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

อะไรคือสิ่งที่เทียบเท่ากับ Drupal 8?


1
คุณทำงานกับองค์กรหรือไม่ ถ้าเป็นเช่นนั้น$fields = $entity->getFieldDefinitions();จะทำ ฉันไม่แน่ใจว่าสิ่งที่เทียบเท่าfield_info_instances()คือFieldStorageConfigไม่ปรากฏว่ามีหนึ่ง
ไคลฟ์

ไม่ฉันแค่ต้องการเปลี่ยน node_type_edit_form และเพิ่มรายการของฟิลด์ที่กำหนดโดยชนิดโหนดในแบบฟอร์ม ดังนั้นประเภทของโหนดเป็นอาร์กิวเมนต์เดียวที่ฉันมี ดังนั้นฉันคิดว่าฟังก์ชั่นเช่น field_info_instances อาจช่วยได้
Pravin Ajaaz

@Clive: ฉันสามารถสร้างวัตถุนิติบุคคลโดยใช้ชื่อประเภทกิจการ มีฟังก์ชั่น NodeType :: load ('article') ซึ่งสร้างวัตถุสำหรับประเภทโหนด
Pravin Ajaaz

\Drupal::entityManager()->getFieldDefinitions('node', 'article')งาน clive :)
Pravin Ajaaz

คำตอบ:


31

EntityManager เลิกใช้แล้วเดินหน้าต่อไป สามารถใช้สิ่งต่อไปนี้แทน:

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

มีวิธีการรับรายการเขตข้อมูล cck เท่านั้นหรือไม่
Rajesh Vishwakarma

2
นี่ควรเป็นคำตอบที่ได้รับการยอมรับในขณะนี้
Bram

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
ทำงานได้อย่างไรเอนทิตีผู้จัดการจะเลิกใช้ ความคิดเห็นข้างต้นนิยามฟังก์ชั่นบอกว่าใช้ entityTypeManager หรือถ้าวิธีนั้นไม่ได้ถูกนำมาใช้ (ไม่ได้รับ getFieldDefinitions) "ดูที่เลิก \ Drupal \ Core \ Entity \ EntityManager เพื่อค้นหาอินเทอร์เฟซหรือบริการที่ถูกต้อง" ฉันไม่เข้าใจความคิดเห็นนี้ ฉันจะหาฟังก์ชั่นที่ถูกต้องในการใช้งานได้ที่ไหน
เฟลิกซ์อีฟ

5
หากต้องการกรองฟิลด์ฐาน ( nid, uuid, revisions, langcode, etc) คุณสามารถทำได้if($field->getFieldStorageDefinition()->isBaseField() == FALSE)
leon.nk

1
มีวิธีที่จะทำให้การกำหนดเขตข้อมูลเป็นประเภทเนื้อหาทุกประเภทไม่ใช่แค่หนึ่งประเภทได้หรือไม่
Matt

1
@ leon.nk ใช่ <code> ถ้า ($ field-> getFieldStorageDefinition () -> isBaseField () == FALSE) </code> นั้นแม่นยำกว่า <code> ถ้า (! ว่างเปล่า ($ field_definition-> getTargetBundle ()) ) </code> เพื่อกรองฟิลด์ฐาน
ฮันมันต์

6

EntityManager เลิกใช้แล้วและฉันใช้รหัสถัดไป ฉันเพิ่มไปยังคลาส Controller:

 /**
   * 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มันช่วยฉันได้


เคล็ดลับ: ใน Constructor (และโดยทั่วไป) ให้ใช้อินเตอร์เฟสเสมอ การใช้งานบริการ drupal ส่วนใหญ่มีอินเตอร์เฟสที่กำหนดไว้อย่างดี
ssibal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.