我正在为我的客户端创建一个管理模块,使他们可以访问有关其内容的某些管理功能。我首先通过实现hook_perm
:
function mymodule_perm()
{
return array(
'manage projects',
);
}
然后,我可以通过添加到已存在的 admin 部分来创建我的菜单:
function mymodule_menu()
{
$items['admin/projects'] = array(
'title' => 'Projects',
'description' => 'Manage your projects.',
'page callback' => 'manage_projects_overview',
'access callback' => 'user_access',
'access arguments' => array('manage projects'),
'type' => MENU_NORMAL_ITEM,
'weight' => -100,
);
$items['admin/projects/add'] = array(
'title' => 'Add project',
'access arguments' => array('manage projects'),
'page callback' => 'mymodule_projects_add',
'type' => MENU_NORMAL_ITEM,
'weight' => 1,
);
return $items;
}
这将使用添加项目子部分将项目部分添加到管理区域。一切都好。
我想要的行为是我的客户端只能在登录时看到“项目”部分。我已经通过勾选模块权限部分中经过身份验证的用户的“管理项目”权限来完成此操作。现在为了让我的客户端实际访问管理区域,我还需要在用户权限部分的“系统模块”下勾选“访问管理页面”。这很好用,当我以客户端身份登录时,我只能看到管理区域中的 Projects 部分。但有一件事,在左栏中显示的导航菜单中,我可以看到以下项目:
- Administer
- Projects
- Content management
- Site building
- Site configuration
- User management
我只期待看到管理和项目项目,而不是其他项目。当我点击例如内容管理我得到一个没有子部分的内容管理标题页面。站点构建,站点配置和用户管理也是如此。真正奇怪的是,报告没有显示,这也是一个顶级的管理部门。
除了我的“项目”部分之外,为什么还会显示这些其他项目?如果我没有以管理员身份登录,如何阻止它们出现?
答案 0 :(得分:2)
您的问题是他们可以查看这些页面。
来自系统模块的hook_menu
:
$items['admin/build'] = array(
'title' => 'Site building',
'description' => 'Control how your site looks and feels.',
'position' => 'right',
'weight' => -10,
'page callback' => 'system_admin_menu_block_page',
'access arguments' => array('access administration pages'),
'file' => 'system.admin.inc',
);
所以当你给他们access administration pages
时,你给了他们访问网站建设部分的权限,但没有给他们任何项目。解决这个问题的一个快速方法是:
hook_menu_alter
将这些菜单项的访问设置更改为他们无权访问的内容。要么制作自己的烫发器,要么使用现有的烫发器。答案 1 :(得分:1)
我不确定菜单路由器显示的原因。但我可以帮忙......
为什么不改变你的道路:
projects/add
projects/%/edit
这类似于节点模块的菜单钩子。它可能不是您正在寻找的,但如果您不希望这些用户可以访问管理员资料,那么它可能是正确的方式。