Получить все поля, определенные в пакете

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 может помочь.
Правин Аджаз
@Clive: могу ли я создать объект сущности, используя имя типа сущности. Есть функция NodeType :: load ('article'), которая создает объект для типов узлов.
Правин Аджаз
\Drupal::entityManager()->getFieldDefinitions('node', 'article')сделал работу clive :)
Правин Аджаз

Ответы:

31

EntityManager устарел, двигаясь вперед. Вместо этого можно использовать следующее:

$entityFieldManager = \Drupal::service('entity_field.manager');
$fields = $entityFieldManager->getFieldDefinitions($entity_type, $bundle);
NewZeal
источник
Есть ли способ получить только список 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
Это работает, однако entityManager устарел. Комментарий выше определения функции говорит, что использовать entityTypeManager или, если метод не реализован (getFieldDefinitions нет), «посмотрите устаревший \ Drupal \ Core \ Entity \ EntityManager, чтобы найти правильный интерфейс или службу». Я не понимаю этот комментарий. Где я могу найти правильную функцию для использования?
Феликс Ив
5
Чтобы отфильтровать базовые поля ( nid, uuid, revisions, langcode, etc) вы можете сделатьif($field->getFieldStorageDefinition()->isBaseField() == FALSE)
leon.nk
1
Есть ли способ получить определения полей для всех типов контента, а не только для одного?
Мэтт
1
@ leon.nk yes <code> if ($ field-> getFieldStorageDefinition () -> isBaseField () == FALSE) </ code> это более точно, чем <code> if (! empty ($ field_definition-> getTargetBundle ()) ) </ code> для фильтрации базовых полей.
Hanmant
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 мне помогло

Мария
источник
Несколько советов: В конструкторах (и вообще) всегда используйте интерфейсы. Большинство реализаций службы drupal имеют четко определенные интерфейсы.
ssibal