Dapatkan semua bidang didefinisikan dalam satu bundel


16

untuk mendapatkan semua bidang yang digunakan dalam tipe konten, di Drupal 7 saya menggunakan kode berikut.

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

Apa yang setara untuk Drupal 8?


1
Apakah Anda bekerja dengan suatu entitas? Jika demikian: $fields = $entity->getFieldDefinitions();akan melakukannya. Saya tidak yakin apa yang sederajat dengannya field_info_instances(), FieldStorageConfigtampaknya tidak memilikinya
Clive

Tidak, saya hanya ingin mengubah node_type_edit_form dan menambahkan daftar bidang yang ditentukan oleh jenis simpul dalam formulir. Jadi tipe dari node adalah satu-satunya argumen yang saya miliki. Jadi saya pikir fungsi seperti field_info_instances mungkin membantu.
Pravin Ajaaz

@Clive: dapatkah saya membuat objek entitas menggunakan nama tipe entitas. Ada fungsi NodeType :: load ('article') yang membuat objek untuk tipe node.
Pravin Ajaaz

\Drupal::entityManager()->getFieldDefinitions('node', 'article')melakukan pekerjaan clive :)
Pravin Ajaaz

Jawaban:


31

EntityManager sudah usang bergerak maju. Berikut ini dapat digunakan sebagai gantinya:

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

Apakah ada cara untuk mendapatkan hanya daftar bidang cck?
Rajesh Vishwakarma

2
Ini harus menjadi jawaban yang diterima sekarang.
Bram

25

Saya mencapainya menggunakan getFieldDefinitions()didefinisikan dalam Class EntityManager. Jadi agar semua bidang digunakan dalam bundel tertentu, Berikut adalah caranya:

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

Padahal di atas $bundle_fieldsjuga berisi nid, uuid, revisions, langcode, etcsebagai bidang. Jadi untuk mendapatkan hasil yang akurat saya melakukan sesuatu seperti ini:

  $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
Ini berfungsi, namun entitasManager tidak digunakan lagi. Komentar di atas definisi fungsi mengatakan gunakan entitasTypeManager atau jika metode ini tidak diterapkan (getFieldDefinitions tidak) "lihat \ Drupal \ Core \ Entity \ EntityManager yang sudah usang untuk menemukan antarmuka atau layanan yang benar." Saya tidak mengerti komentar ini. Di mana saya dapat mencari fungsi yang benar untuk digunakan?
Felix Eve

5
Untuk memfilter bidang dasar ( nid, uuid, revisions, langcode, etc), Anda dapat melakukannyaif($field->getFieldStorageDefinition()->isBaseField() == FALSE)
leon.nk

1
Apakah ada cara untuk mendapatkan Definisi Bidang ke semua jenis jenis konten, bukan hanya satu?
Matt

1
@ leon.nk ya <code> if ($ field-> getFieldStorageDefinition () -> isBaseField () == FALSE) </code> itu lebih tepat daripada <code> jika (! kosong ($ field_definition-> getTargetBundle ()) ) </code> untuk memfilter bidang dasar.
Hanmant

6

EntityManager sudah usang dan saya menggunakan kode berikutnya. Saya menambahkan ke kelas 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')
    );
  }

// Di sini beberapa fungsi Anda

 /**
   * 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 itu membantu saya


Beberapa tips: Dalam konstruktor (dan secara umum) gunakan selalu antarmuka. Sebagian besar implementasi layanan drupal memiliki antarmuka yang terdefinisi dengan baik.
ssibal
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.