获取捆绑中定义的所有字段


16

为了获取内容类型中使用的所有字段,在Drupal 7中,我使用以下代码。

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

Drupal 8的等效功能是什么?


1
您正在与实体合作吗?如果是这样:$fields = $entity->getFieldDefinitions();将这样做。我不确定是什么意思field_info_instances()FieldStorageConfig似乎没有一个
Clive

不,我只想更改node_type_edit_form并在表单中添加由节点类型定义的字段列表。因此,节点的类型是我唯一的参数。所以我认为像field_info_instances这样的功能可能会有所帮助。
Pravin Ajaaz 2015年

@Clive:我可以使用实体类型名称创建实体对象吗?有一个函数NodeType :: load('article')为节点类型创建对象。
Pravin Ajaaz 2015年

\Drupal::entityManager()->getFieldDefinitions('node', 'article')做得好吗:)
Pravin Ajaaz

Answers:


31

不建议继续使用EntityManager。可以改为使用以下内容:

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

有什么办法只能获取cck字段列表吗?
Rajesh Vishwakarma

2
这应该是现在公认的答案。
Bram

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是<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这对我有帮助


一些技巧:在构造函数中(通常)使用Always接口。大多数drupal服务实现都有一个定义明确的接口。
ssibal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.