如何为Drupal特定角色配置/admin页面的链接显示与自定义?
Drupal 特定角色自定义/admin页面链接方案
一、隐藏/admin页面原有链接
1. 原生权限控制(推荐)
如果要隐藏的链接对应特定权限,直接给目标角色移除该权限就行——这是Drupal最安全的原生机制,不用写代码。比如要藏“内容类型管理”,就去掉角色的administer content types权限。
2. 代码移除无对应权限的链接
要是链接没绑定独立权限,用hook_menu_links_discovered_alter()修改:
function MYMODULE_menu_links_discovered_alter(&$links) { $current_user = \Drupal::currentUser(); if ($current_user->hasRole('你的目标角色机器名')) { // 移除指定admin链接,示例:删除内容类型管理链接 unset($links['entity.node_type.collection']); // 可继续添加其他要移除的链接机器名 } }
找链接机器名的方法:看页面源代码里链接的data-drupal-link-system-path属性,或者用Drush命令drush ev "print_r(array_keys(\Drupal::service('plugin.manager.menu.link')->getDefinitions()))"列出所有菜单链接机器名。
二、给目标角色添加专属/admin链接
1. 加进顶部管理工具栏
用hook_toolbar_alter()给目标角色的工具栏加自定义链接:
function MYMODULE_toolbar_alter(&$items) { $current_user = \Drupal::currentUser(); if ($current_user->hasRole('你的目标角色机器名')) { // 把链接加到"内容"分组下 $items['system.admin_content']['#items']['my_custom_link'] = [ '#type' => 'toolbar_item', '#title' => '我的专属操作', '#url' => \Drupal\Core\Url::fromRoute('你的自定义路由'), '#weight' => 10, // 控制显示顺序,数字越大越靠后 '#access' => TRUE, ]; } }
要加独立工具栏分组的话,直接新增顶级项:
function MYMODULE_toolbar_alter(&$items) { $current_user = \Drupal::currentUser(); if ($current_user->hasRole('你的目标角色机器名')) { $items['my_custom_toolbar_group'] = [ '#type' => 'toolbar_item', '#title' => '我的专属菜单', '#url' => \Drupal\Core\Url::fromRoute('<front>'), '#weight' => -5, // 让分组排在前面 '#items' => [ 'my_link_1' => [ '#type' => 'toolbar_item', '#title' => '操作1', '#url' => \Drupal\Core\Url::fromRoute('route_1'), ], 'my_link_2' => [ '#type' => 'toolbar_item', '#title' => '操作2', '#url' => \Drupal\Core\Url::fromRoute('route_2'), ], ], ]; } }
2. 加进/admin页面顶部标签栏
要把链接放在/admin页面的顶部本地任务(标签)里,用hook_menu_local_tasks_alter():
function MYMODULE_menu_local_tasks_alter(&$data, $route_name) { $current_user = \Drupal::currentUser(); // 只在admin首页添加 if ($route_name == 'system.admin' && $current_user->hasRole('你的目标角色机器名')) { $data['tabs'][0]['my_custom_tab'] = [ '#type' => 'local_task', '#title' => '我的专属页面', '#url' => \Drupal\Core\Url::fromRoute('你的自定义路由'), '#weight' => 10, ]; } }
3. 无代码添加到/admin内容区
不想写代码的话,直接建自定义块,在块的可见性设置里选目标角色,然后把块放到“管理页面”区域(要先启用区块布局模块)。
三、必看注意事项
- 改完代码一定要清Drupal缓存才会生效。
- 自定义路由要先在
MYMODULE.routing.yml里定义,示例:
my_custom_route: path: '/admin/my-custom-page' defaults: _controller: '\Drupal\MYMODULE\Controller\MyCustomController::content' _title: '我的专属页面' requirements: _permission: 'access content' # 换成角色已有的权限或自定义权限
- 能靠权限控制隐藏链接的,就别写代码,既安全又好维护。
内容的提问来源于stack exchange,提问作者chtouk
相关产品推荐
相关产品推荐

