web-dev-qa-db-fra.com

HOOK_menu_alter pour supprimer les éléments du menu principal pour des rôles d'utilisateur spécifiques

J'essaie d'ajouter un lien de menu (admin/people/create? Operator = 1) au menu principal uniquement pour le rôle d'utilisateur de "superviseur".

J'ai essayé de faire ceci:

function mymodule_menu_alter(&$items) {

 if(in_array('Supervisor', array_values($user->roles)))
   $items['admin/people/create?operator=1']['type'] = {idk what goes here};

}

Mais je ne suis pas sûr d'être sur la bonne voie.

4
Mike

Je suppose que vous avez ajouté un lien vers le menu principal et que vous souhaitez le faire apparaître uniquement lorsque l'utilisateur a la bonne autorisation. Dans ce cas, hook_menu_alter() n'est pas le bon crochet à implémenter car:

  • Il n'est pas utilisé pour remplacer les liens ajoutés à ce menu
  • Il n'est pas possible d'utiliser admin/people/create? Operator = 1 comme chemin pour le lien du menu dans hook_menu() ou hook_menu_alter()

Ce que vous devez faire, après avoir ajouté le lien vers le menu principal, est d'activer un module qui contient le code suivant.

function mymodule_menu_link_alter(&$link) {
  if ($link['link_path'] == 'admin/people/create?operator=1' && $link['module'] == 'menu') {
    $link['options']['alter'] = TRUE;
  }    
}

function mymodule_translated_menu_link_alter(&$link) {
  if ($link['link_path'] == 'admin/people/create?operator=1' && $link['module'] == 'menu' && user_access('use advanced user creation link')) {
    $link['hidden'] = 1;
  }
}

function mymodule_permission() {
  return array(
    'use advanced user creation link' => array(
      'title' => t('Use advanced user creation link'), 
    ),
  );
}

La partie $link['module'] == 'menu' Permet de modifier le lien que vous avez ajouté manuellement dans le menu principal, et non les autres liens (c'est-à-dire ajoutés à partir d'un module). Dans la première fonction, $link['options']['alter'] = TRUE Indique Drupal pour invoquer hook_translated_menu_link_alter () pour ce lien; dans la deuxième fonction, qui est en fait une implémentation de hook_translated_menu_link_alter(), tandis que la première fonction est l'implémentation de hook_menu_link_alter () , $link['hidden'] = 1 masque en fait le menu à l'utilisateur actuellement connecté.
Au lieu de "utiliser un lien de création d'utilisateur avancé", vous pouvez utiliser une autre chaîne d'autorisation; tant que l'autorisation n'est accordée qu'aux rôles qui en ont besoin et qu'elle est unique, vous pouvez utiliser n'importe quelle chaîne de votre choix.

Je n'en ai pas trouvé, mais s'il y a un module qui rend les liens ajoutés au menu principal visibles aux utilisateurs avec des rôles spécifiques, je l'utiliserais à la place.

Comme note latérale, la vérification d'une autorisation est préférable à la vérification des rôles de l'utilisateur connecté. La raison en est que lorsque vous vérifiez les autorisations, le code est toujours similaire à if (user_access('permission to check')) {} quels que soient les rôles qui ont cette autorisation, tandis que lorsque vous vérifiez les rôles, le code peut passer de if (in_array('supervisor', array_values($user->roles))) {} à if (in_array('supervisor', array_values($user->roles)) || in_array('another role', array_values($user->roles))) {}; en d'autres termes, vous codez en dur quelque chose que vous pourriez changer à l'avenir.

11
kiamlaluno

Il y a le module Menu Per Role qui vous permet de définir les rôles autorisés à voir chaque élément de menu. Vous définissez les rôles à afficher ou les rôles à masquer. Pour les autres rôles, il reste avec la valeur par défaut. Voici une capture d'écran de l'écran des paramètres:

Menu item settings screen

0
Druvision