web-dev-qa-db-fra.com

Comment obtenir la liste des types de champs?

Je porte un module de Drupal 7 à Drupal 8. Dans les paramètres de configuration de ce module, j'ai besoin d'obtenir la liste des types de champs actuellement existants.

Dans Drupal 7, cela a été réalisé en utilisant la fonction field_info_field_types().

Dans Drupal 8 (8.0.0-rc3), j'obtiens une erreur "la fonction n'existe pas", malgré les informations indiquées par un page d'aide de référence de l'API Drupal , clairement dépassé.

En enquêtant, j'ai trouvé un page DrupalContrib , où la fonction est déclarée obsolète, et proposant maintenant d'utiliser Drupal::service('plugin.manager.entity.field.field_type')->getDefinitions().

Mais son utilisation déclenche une autre erreur "Service inconnu plugin.manager.entity.field.field_type", heureusement associée à la suggestion "Voulez-vous dire plugin.manager.field.field_type?"

J'ai donc essayé d'utiliser Drupal::service('plugin.manager.field.field_type')->getDefinitions() et wow: j'ai obtenu le tableau attendu des types de champs.

Mais chaque membre du tableau (un type de champ) est maintenant un objet (au lieu d'un tableau enfant), et les données que je recherche sont imbriquées dans des propriétés protégées, donc je ne peux pas y accéder.

À ce stade, je suis coincé. J'ai considéré qu'il pourrait exister une classe que je pourrais développer pour parcourir ces données, mais sans succès: je n'ai même pas pu comprendre quel est le composant dans Drupal 8 où les définitions de types de champs est centralisé.

10
cFreed

Le premier niveau est un tableau. Les clés sont les identifiants des plugins. Vous pouvez les lister:

$defs = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $defs as $key => $value ) {
   echo $key, "\n";
}

Voici le résultat:

comment
datetime
file
image
link
list_string
list_float
list_integer
path
text_with_summary
text
text_long
email
boolean
created
changed
timestamp
string_long
language
decimal
uri
float
password
string
integer
entity_reference
uuid
map
taxonomy_term_reference

Vous pouvez en choisir un et vider la définition du plugin.

var_dump($defs['comment']);

Si vous êtes intéressé par un objet spécial, vous pouvez creuser plus profondément avec l'aide de api.drupal.org. Mais ce sera plus facile, si vous recherchez le plugin dans le répertoire principal.

Pour accéder à un objet, localisez-le dans var_dump et utilisez une méthode:

$defs['comment']['description']->render();

Dans ce cas, c'est l'objet TranslatableMarkup , qui a la méthode render pour accéder à la chaîne traduite.

16
4k4

Chaque chaîne passée par t() est maintenant un objet. Vous pouvez y accéder en tant que chaînes, en fait, vous devriez le faire.

Il n'y a que très peu d'exceptions où vous ne pouvez pas simplement utiliser un tel objet tel quel, par exemple des clés de tableau, pour celles-ci, vous devez les convertir en chaîne. Tout le reste devrait simplement fonctionner.

PS: La documentation officielle de l'API est http://api.drupal.org/api/drupal/8 . Utilisez cela pour le noyau.

Une autre bonne ressource sont les enregistrements de changement: https://www.drupal.org/list-changes/published?keywords_description=field_info_field_types&to_branch=&version=&created_op=%3E%3D&created%5Bvalue%5D=&created%5Bmin%5D== & créé% 5Bmax% 5D =

Edit: En réponse à votre commentaire, je ne comprends pas très bien ce que vous voulez dire. Toutes les informations dont vous avez besoin sont là, utilisez-les.

$definitions = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $definitions as $field_type => $definition) {
  print $definition['label'];
  print $definition['description'];
  print $definition['provider'];
}

Encore une fois, ignorez simplement que l'étiquette/la description sont des objets. Ils ont des méthodes __toString () qui sont automatiquement appelées lorsque vous les imprimez/les utilisez.

4
Berdir

Google semble trouver cette question lors de la recherche de ces

Si vous utilisez Drupal Console, vous pouvez également utiliser:

drupal plugin:debug field.field_type

Il y a aussi ceci sur Drupal.org qui peut également aider:

Définition et utilisation des définitions de champ d'entité de conten

Ce n'est pas facile de trouver des exemples de

1
carl-16hands

Version mise à jour pour la réponse @Berdir. Utilisation dans Shell.

$definitions = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $definitions as $field_type => $definition) {
  print 'Label: '. $definition['label']. PHP_EOL;
  print 'Machine name: '. $field_type. PHP_EOL;
  print 'Descritpion: '. $definition['description']. PHP_EOL;
  print 'Provider: '. $definition['provider']. PHP_EOL . ' ---' . PHP_EOL;
}

Sortie ici: https://Gist.github.com/sobi3ch/70635cc62defff606242

1
sobi3ch