You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:47:18