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 |
---|---|
|
Annotation de type @FieldFormatter A noter que les paramètres par défaut qui vivaient dans le hook D7 ont maintenant leur propre méthode |
|
|
|
|
|
|
|
|
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.