Il arrive fréquemment qu'on veuille customiser les utilisateurs de Drupal en ajoutant par exemple un champs prénom, nom ou age. Voyons comment on va ajouter un champ custom à l'entité User dans un module custom.
On va partir d'un module custom qui s'appelle "mon_module" et d'un champ firstname qu'on souhaite ajouter à notre entité.
1. Ajouter un champ custom à l'entité User dans l'admin de Drupal
Pour commencer on va aller ajouter notre champ firstname dans l'entité User dans le back-office de Drupal.
On se rend sur /admin/config/people/accounts/fields, on clique sur "Ajouter un champ" et on ajoute le champ firstname.
On finalise l'ajout :
On enregistre et on valide ce champ.
Quand on va sur admin/config/people/accounts/form-display ou sur admin/config/people/accounts/display ce champ est bien visible dans le formulaire et dans l'affichage de l'entité. Parfait! On peut passer à l'étape suivante.
2. Exporter la configuration du champ
Comme le mentionne cet article https://www.drupal.org/node/2693979 on va aller exporter la configuration, ici non pas pour un type de contenu mais pour les utilisateurs, ce qui est la même chose finalement.
On se rend dans admin/config/development/configuration/single/export et on va rechercher 2 fichiers liés à notre champ.
1. La configuration du champ
On choisit le type de configuration "champ" et on va chercher le champs qu'on veut exporter "Firstname".
On crée un fichier avec le nom de fichier indiqué dans l'export, ici c'est "field.field.user.user.field_firstname.yml" et on colle la configuration du champ.
2. La configuration du stockage de champ
On choisit le type de configuration "Stockage de champ" et on va chercher le champ qu'on veut exporter "user.field_firstname".
On crée un fichier avec le nom de fichier indiqué dans l'export, ici c'est "field.storage.user.field_firstname.yml" et on colle la configuration du stockage de champ.
3. Ajouter les fichiers de configuration à notre module custom
Dans notre module "mon_module" et à la racine on crée les répertoires "config/install" et on colle nos 2 fichiers de configuration.
Pour tester notre module, on doit au préalable supprimer le champ Firstname qu'on a créé dans le back-office. Puis on peut activer notre module pour tester si le champ est bien créé.
Après avoir activer le module on voit bien notre champ qui est ajouté en revanche le champ n'est pas visible sur le formulaire ni sur l'affichage.
Si vous cherchez à ajouter les 2 fichiers de configurations supplémentaires, pour pallier au problème, core.entity_form_display.user.user.default.yml et core.entity_view_display.user.user.default.yml quand vous installerez le module il y aura un conflit car la config user existe déjà.
Une solution possible ci-dessous.
4. Ajouter une configuration de formulaire et d'affichage de l'entité.
Pour ajouter une configuration de formulaire et d'affichage sans avoir le message d'erreur que la configuration User existe déjà. On peut ajouter un fichier .install à notre module et implémenter hook_install().
<?php
/**
* Implements hook_install().
*/
function martin_media_user_install() {
$entity_type = 'user';
$bundle = 'user';
$field['field_name'] = 'field_firstname';
entity_get_form_display($entity_type, $bundle, 'default')
->setComponent($field['field_name'], array())
->save();
entity_get_display($entity_type, $bundle, 'default')
->setComponent($field['field_name'], array())
->save();
}
Avec ce code on initialise avec une conf vide par défaut la configuration du formulaire et de l'affichage.
On peut également customiser l'affichage en ajoutant de la configuration dans le tableau passé en paramètre de setComponent.