Je porte un module de Drupal 7 vers 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 field_info_field_types()
fonction.
Dans Drupal 8 (8.0.0-rc3), j'obtiens une erreur "la fonction n'existe pas", malgré les informations indiquées par une page d'aide de référence de l'API Drupal , clairement obsolète.
En enquêtant, j'ai trouvé une page DrupalContrib , où la fonction est déclarée obsolète, et propose maintenant de l'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 pensé 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 de Drupal 8 où les définitions de types de champs sont centralisées.
Réponses:
Le premier niveau est un tableau. Les clés sont les identifiants des plugins. Vous pouvez les lister:
Voici le résultat:
Vous pouvez en choisir un et vider la définition du plugin.
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:
Dans ce cas, c'est l'objet TranslatableMarkup , qui a la méthode render pour accéder à la chaîne traduite.
la source
label
,description
etmodule
et les afficher sous forme de configuration dans laquelle l'utilisateur peut vérifier ceux pour lesquels il veut mon module ( MMS ) crée clonées jetons pour les domaines connexes.Chaque chaîne passée par t () est maintenant un objet. Vous pouvez y accéder sous forme de 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=&created%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.
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.
la source
label
,description
, lesmodule
chaînes de chaque type de terrain) je: 1) obtenir la liste deDrupal::service('plugin.manager.field.field_type')->getDefinitions()
comme déjà fait; 2) puis utiliser chaque clé du tableau retourné (le nom du type de champ) pour invoquer une classe spécifique (trouver laquelle et où dois-je approfondir) qui fournira des méthodes pour obtenir les informations nécessaires? TIA pour cette précision.$definition
ne s'agit pas d'un tableau de chaînes en D8, mais d'un tableau d'objets! Je dpm () pour les examiner, et a vu que chacune des chaînes nécessaires apparaît imbriqué cette façon:'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...)
. Suis-je en train de manquer quelque chose d'évident?TranslatableMarkup
classe et la disponibilité de larender()
méthode. Enfin, la bonne façon d'obtenir mes données estprint $definition['label']->render();
. Néanmoins, merci pour vos autres informations.Version mise à jour pour la réponse @Berdir. Utilisation en coquille.
Sortie ici: https://gist.github.com/sobi3ch/70635cc62defff606242
la source
Google semble trouver cette question lors de la recherche de ces
Si vous utilisez Drupal Console, vous pouvez également utiliser:
Il y a aussi ceci sur Drupal.org qui peut également aider:
Définition et utilisation des définitions de champ d'entité de contenu
Ce n'est pas facile de trouver des exemples de
la source