
Dans un projet Drupal, il est fréquent de devoir restreindre l’interface d’administration selon les rôles (administrateur, contributeur, webmaster…) avec des niveaux de droits différents..
Si les permissions sont le moyen recommandé pour contrôler l’accès aux pages et fonctionnalités, elles ne permettent pas toujours un contrôle fin sur l’affichage de certains éléments d’interface comme :
Dans ce cas, les hooks d’altération offrent une solution élégante et propre pour masquer dynamiquement ces éléments en fonction du rôle utilisateur.
Les interfaces mentionnées ci-dessus sont souvent générées automatiquement par Drupal (via le système de routing, les plugins LocalTask, LocalAction, EntityOperation…), et n'ont pas toujours de contrôle d'accès basé sur une permission explicite.
Ainsi, même si l'utilisateur ne peut pas réellement accéder à l'action, le lien peut apparaître à l’écran, ce qui peut être source de confusion.
D’où l’intérêt d’un masquage conditionnel via hook, en complément de la configuration des droits.

hook_menu_local_tasks_alterCe hook permet d’altérer les onglets d'administration qui s’affichent sur certaines pages (par exemple : Lister, Modifier, Gérer les champs... ).
use Drupal\Core\Cache\RefinableCacheableDependencyInterface;
/**
Masque des onglets pour les utilisateurs avec le rôle "webmaster".
*/
function monmodule_menu_local_tasks_alter(
array &$data,
string $route_name,
RefinableCacheableDependencyInterface &$cacheability
): void {
$current_user = \Drupal::currentUser();
// On ne fait rien pour les administrateurs
if (!in_array('webmaster', $current_user->getRoles())) {
return;
}
// Nom des routes associées aux onglets à masquer
$tabs_to_remove = [
'entity.taxonomy_vocabulary.overview_form',
'entity.taxonomy_vocabulary.fields',
'entity.taxonomy_vocabulary.field_ui',
];
// Parcours des onglets de niveau 0 et 1
foreach ($data['tabs'][0] ?? [] as $key => $tab) {
if (in_array($key, $tabs_to_remove)) {
unset($data['tabs'][0][$key]);
}
}
foreach ($data['tabs'][1] ?? [] as $key => $tab) {
if (in_array($key, $tabs_to_remove)) {
unset($data['tabs'][1][$key]);
}
}
// Ajoute une dépendance au contexte utilisateur pour le cache
$cacheability->addCacheContexts(['user.roles']);
}
RefinableCacheableDependencyInterfaceest utilisé pour ajouter un contexte de cache lié au rôle de l’utilisateur : c’est essentiel pour éviter qu’un cache admin ne soit réutilisé par un rôle limité.$data['tabs'][0]représente les onglets principaux,$data['tabs'][1]les sous-onglets (par exemple "Tableau" et "Grille" pour le module "Media Library").- Les clés utilisées (
entity.taxonomy_vocabulary.display, etc.) peuvent être repérées aveckint()oudsm()
hook_menu_local_actions_alter()Ce hook permet de modifier les actions rapides (souvent visibles en haut des pages admin), comme Ajouter un vocabulaire ou Ajouter un type de contenu.
/**
* Supprime l'action "Ajouter un vocabulaire" pour les webmasters.
*/
function monmodule_menu_local_actions_alter(array &$local_actions): void {
$current_user = \Drupal::currentUser();
if (in_array('webmaster', $current_user->getRoles())) {
$action_key = 'entity.taxonomy_vocabulary.add_form';
if (isset($local_actions[$action_key])) {
unset($local_actions[$action_key]);
}
}
}
Ce hook permet de modifier les actions affichées dans un tableau d’entités : par exemple, Modifier le vocabulaire, Supprimer, Ajouter un enfant...
use Drupal\Core\Entity\EntityInterface;
/**
* Altère les opérations d'entité en fonction du rôle utilisateur.
*/
function monmodule_entity_operation_alter(array &$operations, EntityInterface $entity): void {
$current_user = \Drupal::currentUser();
// On ne cible que les webmasters
if (!in_array('webmaster', $current_user->getRoles())) {
return;
}
$entity_type = $entity->getEntityTypeId();
// Supprimer les actions sur les vocabulaires
if ($entity_type === 'taxonomy_vocabulary') {
unset($operations['edit'], $operations['delete']);
}
// Supprimer les actions sur les termes de certains vocabulaires
if ($entity_type === 'taxonomy_term') {
unset($operations['add-child']);
$restricted_vocabularies = ['regions', 'thematiques'];
if (in_array($entity->bundle(), $restricted_vocabularies)) {
unset($operations['delete']);
}
}
}
Les hooks hook_menu_local_tasks_alter, hook_menu_local_actions_alter, et hook_entity_operation_alter sont des outils très pratiques pour simplifier l’interface d’administration sans complexifier la gestion des permissions.
Ils permettent un contrôle visuel plus fin, rôle par rôle.
Ces techniques sont particulièrement utiles dans des projets où certains profils utilisateurs (ex. : webmaster) doivent avoir accès à des contenus, mais sans être surchargés par les options d'administration complètes.