web-dev-qa-db-ja.com

特定のユーザーロールに基づいてメニュー項目を表示/非表示にする

ログインしたユーザーの役割に基づいて、いくつかのメインメニューを紹介する必要があります。たとえば、ロールを持つユーザーAはいくつかのメニューを見ることができ、ロールBを持つユーザーはいくつかのメニューの別のセットを見ることができます。

4
Sidhees

これは、アクセス許可を管理するルートを使用して実現できます。次の例を見てください。

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

このアプローチでは、すべてのユーザーに同じメニューを表示できますが、リンクはルートから権限を取得するため、administer mymodule権限を持つユーザーのみが[設定]リンクを表示できます。 _role: '$rid'を使用して、ロールを使用して管理することもできます。

2
Lyndon Cox

Drupal 8では、funky.moduleファイルでプログラムによるアプローチのために次のコードを使用することもできます。以下のアプローチでは、メニューの表示とは関係なくアクセスルールを設定できます。

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

これは、モジュールがfunkyと呼ばれることを前提としています。また、次のようなものが含まれるfunky.links.menu.ymlファイルがあることも前提としています。

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

ユーザーに役割があるかどうかのみを区別する場合は、その役割によってcache_contextをさらに強化できます。上記の例では、user.roles:role_bが適切です。キャッシュコンテキストのドキュメントはこちら: https://www.drupal.org/docs/8/api/cache-api/cache-contexts

1
Gogowitsch

メニューブロックを設定するだけです

enter image description here

次に、[表示]> [役割]で、チェックマークを付けます☑このブロックメニューを表示できるようにする役割

enter image description here

1
No Sssweat

Menu Item Role Access を使用するだけです。コードを書くよりもずっと簡単になります。

0
coderama