Logo Koncept47

Drupal : masquer onglets, actions et opérations selon le rôle utilisateur

08/04/2025
CMS, Drupal, PHP, UX/UI design,

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 :

  • les onglets d'administration ( aussi appelés onglets locaux, ex : Modifier, Champs, Affichage…),
  • les liens d'action rapide (ex : Ajouter un vocabulaire),
  • ou encore les liens d’opération (ou liens contextuels associés à une entité, ex : Supprimer le terme dans une liste de taxonomie).

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.

Pourquoi utiliser ces hooks ?

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.

Masquer des onglets d’administration avec
hook_menu_local_tasks_alter

Ce 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']);
}
  • RefinableCacheableDependencyInterface est 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 avec kint() ou dsm()

Masquer une action rapide avec
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]);
    }
  }
}

Masquer les liens d’opération par entité avec hook_entity_operation_alter

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']);
    }
  }
}

Conclusion

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.

Dans la même catégorie

Vous avez un projet internet? Parlons en aujourd'hui

Contactez-nous!
Copyright ©2025 Koncept47 | Gestion des cookies
linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram