Отримайте всі поля, визначені в комплекті


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_in вещества, може допомогти.
Pravin Ajaaz

@Clive: чи можу я створити об'єкт сутності за допомогою імені типу сутності. Існує функція NodeType :: load ('article'), яка створює об'єкт для типів вузлів.
Pravin Ajaaz

\Drupal::entityManager()->getFieldDefinitions('node', 'article')зробив роботу кліп :)
Pravin Ajaaz

Відповіді:


31

EntityManager застаріло рухається вперед. Натомість можна використовувати:

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

Чи є спосіб отримати лише список полів cck?
Rajesh Vishwakarma

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
Це працює, проте entitManager застарілий. У коментарі вище визначення функції йдеться про використання entitTypeManager або якщо метод не реалізований (getFieldDefinitions немає) "див. Застарілий \ Drupal \ Core \ Entity \ EntityManager, щоб знайти правильний інтерфейс або послугу." Я не розумію цього коментаря. Де я можу шукати правильну функцію для використання?
Фелікс Єва

5
Щоб відфільтрувати базові поля ( nid, uuid, revisions, langcode, etc), ви можете зробитиif($field->getFieldStorageDefinition()->isBaseField() == FALSE)
leon.nk

1
Чи є спосіб отримати Полеві визначення для всіх типів вмісту, а не лише одного?
Метт

1
@ leon.nk так <code> if ($ field-> getFieldStorageDefinition () -> isBaseField () == FALSE) </code>, що є більш точним, ніж <code> if (! empty ($ field_definition-> getTargetBundle ()) ) </code> для фільтрації базових полів.
Hanmant

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 мені це допомогло


Деякі поради: в конструкторах (і взагалі) завжди використовувати інтерфейси. Більшість реалізацій служб drupal мають чітко визначені інтерфейси.
ssibal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.