Comment créer des champs pseudo dans Drupal avec 2 hooks
Qu'est-ce qu'un champ pseudo ?
Dans Drupal, les champs pseudo sont des champs qui ne stockent pas de données dans la base de données, mais génèrent dynamiquement du contenu à la volée. Les champs pseudo permettent aux constructeurs de sites et aux développeurs d'ajouter du contenu personnalisé à des entités (telles que des nœuds, des utilisateurs et des termes de taxonomie) sans avoir besoin de créer un champ séparé pour cela.
Les champs pseudo se comportent comme des champs ordinaires à bien des égards. Cependant, au lieu de stocker des données dans la base de données, ils utilisent une fonction de rappel pour générer leur contenu lorsque l'entité est consultée.
Comment créer des champs pseudo ?
Sur Drupal 8, 9, 10
En utilisant hook_ENTITY_TYPE_view()
en combinaison avec hook_entity_extra_field_info()
, vous pouvez définir des champs pseudo personnalisés et spécifier exactement comment ils doivent être rendus lorsque l'entité est affichée.
Dans l'exemple suivant, nous allons ajouter un champ pseudo au type d'entité paragraphe qui rendra un bouton de partage Google Classroom partout où le paragraphe est utilisé. Le champ apparaîtra dans la gestion de l'affichage comme les champs créés dans l'entité.

La recette
Assurez-vous d'ajouter les deux lignes suivantes en haut du fichier.
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\Core\Entity\EntityInterface;
Dans le fichier my_module.module
de votre module personnalisé, définissez le champ pseudo en utilisant la fonction hook_entity_extra_field_info()
:
/**
* Implémente hook_entity_extra_field_info().
*/
function MY_MODULE_entity_extra_field_info() {
$display_fields = [];
$display_fields['paragraph']['google_classroom_button']['display']['google_classroom_button'] = [
'label' => t('Bouton Google Classroom'),
'description' => t('Affiche le bouton Google Classroom'),
'weight' => 100,
'visible' => TRUE,
];
return $display_fields;
}
Dans cet exemple, nous définissons un champ pseudo appelé google_classroom_button
pour le type d'entité paragraph
et le bundle google_classroom_button.
Si vous souhaitez ajouter le champ à un type de contenu, vous devez remplacer le mot paragraph par node et google_classroom_button par le nom de votre type de contenu, dans le code ci-dessus.
/**
* Implémente hook_ENTITY_TYPE_view().
*/
function MY_MODULE_paragraph_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) {
if ($display->getComponent('google_classroom_button')) {
$currentUrl = Url::fromRoute('<current>',[] , ['absolute' => 'true'])->toString();
$output = '<script src="https://apis.google.com/js/platform.js" async defer></script>';
$output .= '<div class="g-sharetoclassroom" data-size="64" data-url="' . $currentUrl . '" ></div>';
$build['google_classroom_button'] = [
'#type' => 'markup',
'#markup' => $output,
'#allowed_tags' => ['script', 'div'],
];
}
}
Le code ci-dessus vérifie si le composant « google_classroom_button » a été ajouté à la configuration d'affichage de l'entité Paragraphe. Si c'est le cas, il génère une sortie personnalisée pour le champ pseudo « google_classroom_button ».
Cas d'utilisation des champs pseudo
- Affichage de valeurs calculées ou d'agrégats (comme le nombre de commentaires sur un nœud)
- Intégration de contenu provenant d'autres sources (comme des vidéos YouTube ou des flux de médias sociaux)
- Affichage de balisage ou de HTML personnalisé (comme une liste de contenu connexe)
Réflexions finales
- C'est un moyen rapide d'obtenir des informations supplémentaires dans une entité sans avoir à gérer des modèles twig.
- Le champ pseudo ne sera pas disponible lors de la création d'une vue pour l'entité.