web-dev-qa-db-fra.com

afficher / masquer un élément de menu basé sur un rôle d'utilisateur spécifique

J'ai un certain nombre de menus principaux qui doivent être présentés en fonction du rôle d'utilisateur connecté. par exemple, l'utilisateur avec le rôle, A peut voir peu de menus et l'utilisateur avec le rôle B, voit un autre ensemble de quelques menus.

4
Sidhees

Cela peut être réalisé en utilisant les routes pour gérer les autorisations. Prenons l'exemple suivant:

mymodule.routing.yml

mymodule.home:
  path: '/mymodule'
  defaults:
    _controller: '\Drupal\mymodule\Controller\MyModuleController::overview'
    _title: 'My Module'
  requirements:
    _role: 'authenticated user'

mymodule.settings:
 path: '/admin/mymodule'
 defaults:
   _form: 'Drupal\mymodule\Form\MyModuleSettingsForm'
   _title: 'Settings'
 requirements:
   _permission: 'administer mymodule'

mymodule.view:
 path: '/mymodule/view'
 defaults:
   _controller: '\Drupal\mymodule\Controller\MyModuleController::view'
   _title: 'View'
 requirements:
   _role: 'authenticated user'

mymodule.edit:
 path: '/mymodule/edit'
 defaults:
   _form: 'Drupal\mymodule\Form\MyModuleEditForm'
   _title: 'Edit'
 requirements:
   _permission: 'edit mymodule'

mymodule.links.menu.yml

mymodule.home:
  title: 'My Module'
  parent: main
  route_name: mymodule.home
  weight: 10

mymodule.settings:
  title: 'Settings'
  parent: mymodule.home
  route_name: mymodule.settings
  weight: 10

mymodule.view:
  title: 'View'
  parent: mymodule.home
  route_name: mymodule.view
  weight: 10

mymodule.edit:
  title: 'Edit'
  parent: mymodule.home
  route_name: mymodule.edit
  weight: 10

Avec cette approche, vous pouvez afficher le même menu à tous les utilisateurs, mais comme les liens prennent les autorisations des itinéraires, seuls les utilisateurs avec le administer mymodule l'autorisation pourra voir le lien Paramètres par exemple. Vous pouvez également utiliser des rôles pour le gérer en utilisant _role: '$rid'.

2
Lyndon Cox

Dans Drupal 8, vous pouvez également utiliser le code suivant dans votre funky.module fichier pour une approche programmatique. L'approche ci-dessous permet d'avoir des règles d'accès indépendantes de la visibilité du menu:

/**
 * Implements hook_preprocess_menu().
 *
 * @param array[] $variables
 */
function funky_preprocess_menu(&$variables) {
  if (in_array('role_b', Drupal::currentUser()->getRoles())) {
    // Hide the menu item
    unset($variables['items']['the_key_you_used_in_your_menu_links_yml_file']);
  }
}

Cela suppose que votre module s'appelle funky. Cela suppose également que vous disposez d'un funky.links.menu.yml fichier contenant quelque chose de similaire à ceci:

the_key_you_used_in_your_menu_links_yml_file:
  title: 'Your menu caption'
  route_name: your_route
  menu_name: account
  cache_contexts:
    - user.roles

Si vous distinguez uniquement si un utilisateur a un rôle ou non, vous pouvez resserrer davantage le cache_context par ce rôle. Pour l'exemple ci-dessus, user.roles:role_b serait approprié. La documentation pour les contextes de cache est ici: https://www.drupal.org/docs/8/api/cache-api/cache-contexts

1
Gogowitsch

Il vous suffit de configurer votre bloc de menu

enter image description here

Ensuite, sous Visibilité> Rôles, cochez roles les rôles que vous souhaitez pouvoir afficher ce menu de blocage.

enter image description here

1
No Sssweat

Utilisez simplement Accès au rôle d'élément de men . Cela le rend beaucoup plus facile que d'écrire du code.

0
coderama