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?
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();
}
}
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);
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é