到目前为止,在前面的所有例子中,我们都简单的将菜单项的access callback键设置为了TRUE,这意味着所有的用户都可以访问我们的菜单。一般情况下,通过在模块中使用hook_perm()来定义权限,并使用一个函数来测试这些权限,从而实现对菜单的访问控制。这里所用的函数的名字定义在菜单项的access callback键中,它一般为user_access。让我们定义一个名为receive greeting的权限;如果用户没有哪个角色具有该权限的话,当他/她访问页面http://example.com/?q=menufun时,将会收到一个“拒绝访问”消息。
/**
* Implementation of hook_perm().
*/
function menufun_perm() {
return array('receive greeting');
}
/**
* Implementation of hook_menu().
*/
function menufun_menu() {
$items['menufun'] = array(
'title' => 'Greeting',
'page callback' => 'menufun_hello',
'access callback' => 'user_access',
'access arguments' => array('receive greeting'),
'weight' => -10,
);
$items['menufun/farewell'] = array(
'title' => 'Farewell',
'page callback' => 'menufun_goodbye',
);
return $items;
}
在前面的代码中,是根据user_access('receive greeting')的返回结果来判定是否允许访问的。这样,菜单系统就相当于一个门卫,它会基于用户的角色来判定哪些路径可以访问,哪些路径不可以访问。
提示 user_access()函数是默认的访问回调。如果你没有定义访问回调的话,那么访问参数将被菜单系统传递给user_access()。
子菜单一般不会继承父菜单项的访问回调和访问参数。所以必须为每个菜单项定义access arguments键。如果访问回调不是user_access的话,那么还需要定义access callback键。不过也有例外,那就是类型为MENU_DEFAULT_LOCAL_TASK的菜单项,它可以继承父菜单项的访问回调和访问参数,不过为了清晰起见,对于这些默认的本地任务菜单项,最好能够为其明确的定义这些键。
老葛的Drupal培训班 Think in Drupal
评论
$items['menufun/farewell'] =
$items['menufun/farewell'] = array(
'title' => 'Farewell',
'page callback' => 'menufun_goodbye',
'access arguments' => array('receive greeting'),
);
如果没有添加这一行,那么Farewell子菜单将会隐藏无法显示。
这个没有关系吧,我不确定,这段代码我应该在本地跑过,我用的
这个没有关系吧,我不确定,这段代码我应该在本地跑过,
我用的是用户1,所以不受权限的影响,另外菜单的显示,可能和缓存有关,我不确定,这是不是一个问题.
这些都是官方的更正说明 http://www.drupal
这些都是官方的更正说明
http://www.drupalbook.com/errata2
确实这些都是官方的勘误。
确实这些都是官方的勘误。
具体这个例子是在:http://www.drupalbook.com/errata2?page=1 底部最下方 。
-----------------------------------------------------------------
不过把那行注释了与不注释,用普通用户怎么没发现什么差别,子菜单都能显示。好了,如果那行没有的话,确实子菜单无法显示;多rebuild menus 和 empty chche 几次之后,子菜单果真不见了。
(继承的特性已经在某个版本中取消了。)