Aller au contenu principal
Julien Dubois

Drupal 10 : Créer un formateur de champ

Ce billet a été produit dans le contexte d'Happyculture, il a pu être écrit en collaboration.

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


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"
 *   },
 * )
 */

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.

Pour rebondir