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.
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'
.
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
Utilisez simplement Accès au rôle d'élément de men . Cela le rend beaucoup plus facile que d'écrire du code.