我正在构建一个Drupal站点,并添加了两个自定义菜单,以提供两组不同的管理链接(有些人会看到一个菜单或另一个菜单,有些人会看到这两个菜单,而匿名/低级用户会看到两者都不是)。
问题是,目前所有用户都可以看到菜单(但菜单项不可见)。
我正在尝试创建一个简单的权限模块 - 并创建了管理表单,用于指定哪些菜单可由哪个角色查看。
但我找不到一个钩子,它可以让我覆盖特定菜单的可见性 - 只有项目。
那么,现在我在数据库中有一个权限列表,如何限制Drupal中按角色访问菜单?
-
我查看了每个角色的菜单和菜单访问。不幸的是,这些工作在项目级别而不是直接在菜单上工作。
答案 0 :(得分:6)
每个菜单都在一个块中,并且可以将块设置为对于给定的用户组(访问级别)可见。 在drupal管理站点:结构/块
答案 1 :(得分:2)
每个角色菜单模块?
答案 2 :(得分:1)
只要您使用块作为菜单,就可以使用角色访问来进行块设置,由核心提供。
答案 3 :(得分:0)
对于菜单列表,此功能有效:menu_get_names();
但它没有任何许可检查或挂钩
您想在哪里限制菜单列表?如果在节点编辑时你可以通过hook_form_alter改变菜单。
答案 4 :(得分:0)
这不是最优雅的解决方案,但您可以在主题中进行访问检查。
答案 5 :(得分:0)
我想出了一个解决方案 - 我没有使用自动生成的菜单块进行显示,而是创建了一个块并将以下代码放入我的模块中:
function amh_menu_block($op = 'list', $delta = 0, $edit = array())
{
if ($op == 'list') {
$blocks[0] = array(
'info' => t('AMH Menu block'),
'weight' => 0,
'status' => 1,
'region' => 'left',
);
return $blocks;
} elseif ($op == 'view') {
switch($delta) {
case 0:
$block = array(
'subject' => '',
'content' => _amh_menu_display(),
);
break;
}
return $block;
}
}
function _amh_menu_display()
{
global $user;
$content = '';
if ($user->uid != 0) {
$result = db_query('SELECT * FROM {amh_menu_permission} p LEFT JOIN {menu_custom} m ON p.menu_name = m.menu_name LEFT JOIN {users_roles} u ON p.rid = u.rid WHERE u.uid = %d OR p.rid = 2', $user->uid);
} else {
$result = db_query('SELECT * FROM {amh_menu_permission} p LEFT JOIN {menu_custom} m ON p.menu_name = m.menu_name WHERE p.rid = 1');
}
$menus = array();
while ($m = db_fetch_object($result)) {
$menu = menu_tree($m->menu_name);
if ($menu) {
$content .= "\r\n<h2>" . $m->title . "<h2>\r\n";
$content .= theme_menu_tree($menu);
}
}
return $content;
}
这似乎工作正常。
答案 6 :(得分:0)
“每个菜单的菜单管理”模块将使您可以按角色限制对每个菜单的编辑访问。 https://www.drupal.org/project/menu_admin_per_menu