バンドルで定義されているすべてのフィールドを取得する


16

コンテンツタイプで使用されるすべてのフィールドを取得するには、Drupal 7で次のコードを使用します。

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

Drupal 8に相当するものは何ですか?


1
エンティティを使用していますか?もしそうなら:$fields = $entity->getFieldDefinitions();それを行います。私は確かに相当するものはないよfield_info_instances()され、FieldStorageConfig1を持っているように見えていません
クライヴ

いいえ、node_type_edit_formを変更し、フォームのノードタイプによって定義されたフィールドのリストを追加したいだけです。したがって、ノードのタイプが唯一の引数です。したがって、field_info_instancesのような関数が役立つと思いました。
プラビンアジャアズ

@Clive:エンティティタイプ名を使用してエンティティオブジェクトを作成できますか。ノードタイプのオブジェクトを作成するNodeType :: load( 'article')関数があります。
プラビンアジャアズ

\Drupal::entityManager()->getFieldDefinitions('node', 'article')仕事をしました:)
プラビンアヤアズ

回答:


31

EntityManagerは今後廃止される予定です。代わりに次を使用できます。

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

cckフィールドリストのみを取得する方法はありますか?
ラジェシュヴィシュワカルマ

2
これは今受け入れられた答えであるはずです。
ブラム

25

getFieldDefinitions()定義した方法で実現しましたClass EntityManager。したがって、特定のバンドルで使用されるすべてのフィールドを取得するには、次の方法があります。

$bundle_fields = \Drupal::entityManager()->getFieldDefinitions('node', 'article');

上記に$bundle_fieldsnid, 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)
除外するに

1
フィールド定義を1つだけではなく、すべてのタイプのコンテンツタイプに取得する方法はありますか?
マット

1
@ leon.nkはい<code> if($ field-> getFieldStorageDefinition()-> isBaseField()== FALSE)</ code> <code> if(!empty($ field_definition-> getTargetBundle())よりも正確です)</ code>でベースフィールドを除外します。
ハンマント

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.