Drupal 7 - 根据角色和视图显示菜单项

时间:2014-03-14 09:50:37

标签: menu module drupal-7 roles

我正在开发一个需要很少分层用户角色的Drupal项目。高级别用户将拥有某些管理员角色,但也会有两个较低级别的角色 - 销售人员和标准客户。销售人员角色需要能够创建标准客户,然后查看与他们创建的任何客户相关的数据。

由于我使用的是profile2,典型的用户帐户任务菜单如下所示

http://oi57.tinypic.com/333v447.jpg

现在,当登录用户是销售人员角色并且他们转到“我的帐户”时,他们不应该看到我的订阅,订单或发票。还应禁用供应商详细信息profile2链接。但由于他们可以查看他们添加到系统中的客户数据,因此如果他们查看其他用户屏幕,则必须显示这些链接

在代码方面,我为初学者玩了以下想法

function mymodules_menu_alter(&$menu) {
  global $user;

  $viewed_user_id = null;
  $uid = arg(1);
  if ( arg(0) == 'user' && is_numeric($uid) ) {
    $viewed_user_id = $uid;
  }

  if (in_array('sales executive', $user->roles) && $viewed_user_id == $user->uid ) {    
    unset($menu['user/%user_category/edit/vendor_details']);
  }

  if (in_array('sales executive', $user->roles) ) {    
    unset($menu['user/%user/user-recurring-entities']);
  }
}

问题是,首次检查vendor_details表现得很奇怪。它既可以显示所有角色的菜单,也可以不显示任何角色。我认为缓存可能会影响这个?

第二次检查根本不起作用,因为$ menu数组中不存在这样的菜单项。

所以我的基本问题是,如何让整个事情发挥作用?也许我的做法是错的?

1 个答案:

答案 0 :(得分:0)

这绝对是一个有趣的方法。

Drupal菜单具有权限检查内置,理论上,如果您无权访问某个页面,则不会显示菜单链接。这是默认行为。

实施例。让我们以“订单”为例,如果使用视图构建订单页面,您可以编辑视图,并设置视图权限以定位特定角色或Drupal权限。

当然,您可以使用各种方式来组合您的页面,例如。 views是一个,panel是另一个,或者只是简单的hook_menu。但或多或少你应该直接使用权限访问而不是菜单。有时您需要编写自己的权限版本,这是您在代码中所做的。