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?

Pravin Ajaaz
sumber
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);
NewZeal
sumber
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();
    }
  }
Pravin Ajaaz
sumber
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

Maria
sumber
Beberapa tips: Dalam konstruktor (dan secara umum) gunakan selalu antarmuka. Sebagian besar implementasi layanan drupal memiliki antarmuka yang terdefinisi dengan baik.
ssibal