Drupal 10 : Créer un formateur de champ

Apprendre à créer un formateur de champ.

Cet article a été initialement rédigé pour Drupal 8 mais son contenu est toujours d'actualité pour Drupal 9 et Drupal 10.

N'hésitez pas à nous contacter ou à vous inscrire à notre formation «Drupal pour les développeurs et développeuses» pour en savoir plus !

Voyons maintenant comment se passe dans Drupal 10 l'une des actions que l'on fait le plus lors de la réalisation de projets : la création de formateurs de champs.
L’essentiel des
Hooks qui étaient nécessaires en Drupal 7 sont devenus depuis Drupal 8 des méthodes à implémenter dans une classe.

Les Hooks utilisés pour implémenter un formateur de champ étaient les suivants :

Nom du hook Drupal 7

Equivalent Drupal 10

hook_field_formatter_info()

Annotation de type @FieldFormatter
Namespace : Plugin\Field\FieldFormatter

A noter que les paramètres par défaut qui vivaient dans le hook D7 ont maintenant leur propre méthode FormatterInterface::defaultSettings().

hook_field_formatter_view()

FormatterInterface::viewElements()

hook_field_formatter_settings_form()

FormatterInterface::settingsForm()

hook_field_formatter_settings_summary()

FormatterInterface::settingsSummary()

hook_field_formatter_prepare_view()

FormatterInterface::prepareView()

La création d’un nouveau formateur de champ passe par la création d’un plugin, qui va étendre la classe abstraite Drupal\Core\Field\FormatterBase.

Cette classe implémente l’interface Drupal\Core\Field\FormatterInterface qui décrit les méthodes à surcharger et leur but.

Les nouveaux Plugins à créer doivent être placés dans le répertoire /src/Plugin/ de votre module. Un Plugin de formateur de champ doit être ensuite mis dans Field/FieldFormatter.

Il faut donc créer le fichier qui contiendra votre classe dans /src/Plugin/Field/FieldFormatter. Le nom du fichier doit correspondre au nom de la classe suivi de l’extension .php.

Il est important de respecter les noms et placements car cela est utilisé par le chargement automatique (PSR-4) de Drupal pour charger les classes au moment nécessaire.

Nous allons pour cet exercice appliquer la recette pour créer un formateur, nous verrons dans les chapitres suivants les particularités associées aux Plugins.

Implémentation du formateur

La première chose à faire dans le fichier est de définir le Namespace courant (toujours pour le chargement automatique et PSR-4).

namespace Drupal\<module>\Plugin\Field\FieldFormatter;

Ensuite, nous allons dire à Drupal que nous déclarons une classe d’un plugin. Cette partie remplace le hook_field_formatter_info() et se fait à l’aide d’une annotation de type @FieldFormatter.

/**
 * Plugin implementation of the 'remote_cover' formatter.
 *
 * @FieldFormatter(
 *   id = "remote_cover",
 *   label = @Translation("Remote Cover"),
 *   field_types = {
 *     "string"
 *   },
 * )
 */
  • id attend un nom machine unique.
  • label est la version humaine du nom visible dans la configuration de l’affichage des entités.
  • field_types liste les types de champs sur lesquels ce formateur est applicable.

Puis on déclare notre classe qui étend Drupal\Core\Field\FormatterBase.

class RemoteCover extends FormatterBase {}

Il ne reste plus qu’à implémenter les méthodes dont vous avez besoin comme viewElements() ou prepareView().

On notera la présence d’une méthode view() possédant une implémentation par défaut dans la classe abstraite Drupal\Core\Field\FormatterBase. Cette méthode s’occupe de faire le rendu du champ complet (rajout du label et d’autres informations). Il est donc possible pour un formateur de champs de la surcharger pour modifier le comportement par défaut des champs Drupal dans un cas particulier. La modification d’un formateur existant pour adapter son comportement se voit simplifiée grâce à la programmation objet. Il suffit maintenant d’étendre un formateur existant au lieu de Drupal\Core\Field\FormatterBase et de modifier uniquement le code nécessaire en appelant la méthode parente si nécessaire.

Commentaires

Drupal_test Vendredi 25 novembre 2016 - 14:23
Bonjour, J'ai bien le type de champs qui s'affiche dans la liste, et le double champs s'affiche bien dans le formulaire. Cependant, je ne parviens pas le passer en enable dans le Display Manager et je souhaiterai avoir la possibilité de répéter ce champs dans mon formulaire > Allowed number of values. Merci pour cette documentation
Artusamak Mardi 29 novembre 2016 - 10:05
Bonjour,   Ne seriez-vous pas entrain de confondre plusieurs choses ? Le formateur est là pour afficher la valeur collectée lors de la saisie via un widget. La gestion d'un champ multiple se fait donc au niveau du widget et non d'un formateur. Si vous n'arrivez pas à l'activer dans le Display Manager, c'est probablement parce qu'aucun widget ou formateur n'a été associé à votre type de champ. Vérifiez qu'il n'y a pas d'erreur dans votre nom de fichier, nom de classe ou annotation. Cela devrait débloquer la liste.

Votre commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.
Votre adresse servira à afficher un Gravatar et à vous notifier des réponses. Votre commentaire sera anonymisé si ce billet est dépublié pendant plus de 3 mois.
Pour lutter contre le spam notre système enregistre votre adresse IP et votre adresse e-mail si vous la partagez.
Nous vous invitons à consulter notre politique de confidentialité pour comprendre les traitements faits de ces données et comment les rectifier.

À propos de Julien

Co-fondateur - Scrum master & Expert technique

Utilisateur de Drupal depuis 2008, j’ai fait mes armes comme développeur chez Commerce Guys puis me suis mis à encadrer les nouveaux arrivants avant de donner des formations, participer aux avant ventes et accompagner les équipes au passage à Scrum.

Je suis impliqué dans la communauté française de Drupal depuis 2009, j’ai été tour à tour président puis vice-président de l’association Drupal France et francophonie entre 2011 et 2013.