it-swarm.com.de

Ein- / Ausblenden eines Menüelements basierend auf einer bestimmten Benutzerrolle

Ich habe eine bestimmte Anzahl von Hauptmenüs, die basierend auf der angemeldeten Benutzerrolle angezeigt werden müssen. Beispielsweise kann der Benutzer mit der Rolle A nur wenige Menüs sehen, und der Benutzer mit der Rolle B sieht einen weiteren Satz weniger Menüs.

4
Sidhees

Dies kann mithilfe der Routen zum Verwalten der Berechtigungen erreicht werden. Nehmen Sie das folgende Beispiel:

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

Mit diesem Ansatz können Sie allen Benutzern dasselbe Menü anzeigen. Da die Links jedoch die Berechtigungen von den Routen übernehmen, können beispielsweise nur Benutzer mit der Berechtigung administer mymodule Den Link "Einstellungen" sehen. Sie können Rollen auch verwenden, um es zu verwalten, indem Sie _role: '$rid' Verwenden.

2
Lyndon Cox

In Drupal 8) können Sie auch den folgenden Code in Ihrer funky.module - Datei für einen programmatischen Ansatz verwenden. Der folgende Ansatz ermöglicht Zugriffsregeln unabhängig von der Menüsichtbarkeit:

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

Dies setzt voraus, dass Ihr Modul funky heißt. Es wird auch davon ausgegangen, dass Sie eine funky.links.menu.yml - Datei haben, die etwas Ähnliches enthält:

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

Wenn Sie nur unterscheiden, ob ein Benutzer eine Rolle hat oder nicht, können Sie den cache_context durch diese Rolle weiter verschärfen. Für das obige Beispiel wäre user.roles:role_b Geeignet. Die Dokumentation für Cache-Kontexte finden Sie hier: https://www.drupal.org/docs/8/api/cache-api/cache-contexts

1
Gogowitsch

Alles was Sie tun müssen, ist Ihren Menüblock zu konfigurieren

(enter image description here

Markieren Sie dann unter Sichtbarkeit> Rollen ☑ die Rollen, die Sie in diesem Blockmenü anzeigen möchten.

(enter image description here

1
No Sssweat

Verwenden Sie einfach Menüelement Rollenzugriff . Es macht es viel einfacher als das Schreiben von Code.

0
coderama