web-dev-qa-db-fra.com

Obtenez programmatiquement la liste des champs d'un contenu personnalisé

Je souhaite créer programmablement un contenu personnalisé (contenu personnalisé créé via l'interface utilisateur de l'administrateur). Avant la création, je souhaite vérifier les types de champs de mon contenu personnalisé.

Mon contenu personnalisé contient un champ "Corps" (Type de texte), un champ "Description" (Type de texte), un champ Int (type INT), un champ de fichier joint (type FID?).

J'ai testé plusieurs façons; Ceci est mon dernier essai.

// I get the entity object "my_custom_content"
$entity_object = NodeType::load("my_custom_content");
dpm($entity_object); //Work perfectly


$test = \Drupal::getContainer()->get("entity_field.manager")->getFieldDefinitions("my_custom_content",$entity_object->bundle())

Le code renvoie une erreur:

Le type d'entité my_custom_content n'existe pas.

Avec ça $entity_object, comment puis-je obtenir la liste des champs de mon contenu personnalisé? Je vois la classe EntityFieldManager, la classe FieldItemList, mais je ne comprends toujours pas comment jouer avec Drupal 8.

2
matthieu lopez

Vous mélangez des types d'entité/nœud (contenu) types/paquets. Erreur commune :)

Surtout que la nommée UI est ... très malheureuse.

Ce qu'on appelle le contenu dans l'interface utilisateur est en réalité le type d'entité node. Et les types de contenu sont des types de nœuds (vous avez compris que beaucoup), qui sont des paquets du type d'entité de nœud.

getFieldDefinitions () attend un identifiant d'entité_type et un paquet. Dans votre cas, c'est-à-dire:

$definitions = \Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'my_custom_content');

Notez que cela rendra également les définitions de champ de base telles que NID, Vid, Titre, Status, etc.

TIPP: une fois que vous avez un objet de nœud, vous pouvez également obtenir la même définition de cet objet et d'autres informations utiles:

$node = Node::create(['type' => 'my_custom_content']);
$node->getFieldDefinitions();
$node->getFieldDefinition('body');
$node->hasField('body');

Donc, si vous voulez faire de manière dynamique quelque chose comme ceci, il peut simplifier votre code si vous créez d'abord le nœud avec les informations qui permettent toujours d'activer et de travailler avec les méthodes de votre objet d'entité.

Recommandation par défaut Lorsque vous travaillez avec des entités en 8.x: http://wizzlern.nl/drupal/drupal-8-entity-cheat-heet

10
Berdir