번들에 정의 된 모든 필드 가져 오기


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 2016 년

\Drupal::entityManager()->getFieldDefinitions('node', 'article')직업 clive :)
Pravin Ajaaz 2016 년

답변:


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
이것은 작동하지만 entityManager는 더 이상 사용되지 않습니다. 함수 정의 위의 주석은 entityTypeManager 사용 또는 메소드가 구현되지 않은 경우 (getFieldDefinitions가 아닌 경우) "올바른 인터페이스 또는 서비스를 찾으려면 사용되지 않는 \ Drupal \ Core \ Entity \ EntityManager를 참조하십시오." 이 의견을 이해하지 못합니다. 사용할 올바른 기능을 어디에서 찾을 수 있습니까?
Felix Eve

5
기본 필드 ( nid, uuid, revisions, langcode, etc) 를 필터링하려면 다음을 수행하십시오.if($field->getFieldStorageDefinition()->isBaseField() == FALSE)
leon.nk

1
필드 정의를 단 하나의 컨텐츠 유형이 아닌 모든 유형의 컨텐츠 유형으로 가져올 수있는 방법이 있습니까?
Matt

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 그것은 나를 도왔다


몇 가지 팁 : 생성자 (일반적으로)에서는 항상 인터페이스를 사용하십시오. 드루팔 서비스 구현의 대부분은 잘 정의 된 인터페이스를 가지고 있습니다.
ssibal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.