web-dev-qa-db-fra.com

Obtenez tous les champs définis dans un ensemble

pour obtenir tous les champs utilisés dans un type de contenu, en Drupal 7 j'utilise le code suivant.

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

Quel est l'équivalent pour Drupal 8?

16
Pravin Ajaaz

Je l'ai réalisé en utilisant getFieldDefinitions() définie dans Class EntityManager. Donc, pour obtenir tous les champs utilisés dans un bundle particulier, voici un moyen:

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

Bien que ce qui précède $bundle_fields contient également nid, uuid, revisions, langcode, etc en tant que champs. Donc, pour obtenir une sortie précise, j'ai fait quelque chose comme ceci:

  $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();
    }
  }
25
Pravin Ajaaz

EntityManager est obsolète à l'avenir. Les éléments suivants peuvent être utilisés à la place:

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

EntityManager est obsolète et j'ai utilisé le code suivant. J'ai ajouté à la classe 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')
    );
  }

// Voici quelques fonctions

 /**
   * 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 cela m'a aidé

6
Maria