Php yii:如何按用户角色显示不同的菜单?

Php yii:如何按用户角色显示不同的菜单?,php,yii,yii-extensions,Php,Yii,Yii Extensions,问:如何按用户角色显示不同的菜单 描述:该应用程序具有多个角色。e、 g人力资源经理、客户经理、运营经理、员工、操作员等。我使用权限和yii用户模块创建这些角色。这些角色具有不同的功能。因此,应用程序在登录后会针对不同用户的角色显示不同的菜单。现在,我可以锁定不同用户的功能。e、 g当人力资源经理登录时,他/她不能路由到用户角色的其他功能。但我不知道如何为人力资源经理显示人力资源菜单 我不是yii的新手。但我是这些模块的新手(rihgts和yii用户) 您可以将if语句包装在您可能想要或不想要显

问:如何按用户角色显示不同的菜单

描述:该应用程序具有多个角色。e、 g人力资源经理、客户经理、运营经理、员工、操作员等。我使用权限和yii用户模块创建这些角色。这些角色具有不同的功能。因此,应用程序在登录后会针对不同用户的角色显示不同的菜单。现在,我可以锁定不同用户的功能。e、 g当人力资源经理登录时,他/她不能路由到用户角色的其他功能。但我不知道如何为人力资源经理显示人力资源菜单


我不是yii的新手。但我是这些模块的新手(rihgts和yii用户)

您可以将if语句包装在您可能想要或不想要显示的菜单项周围

在if语句中,您必须测试用户是否有资格查看您的菜单项

例如:

<?php if (Yii::app()->user->isGuest): ?>

  <?php $this->widget('zii.widgets.CMenu',array(
    'items'=>array(
  array(
        'label'=>'this menu item visible only for Guests (not logged in)', 
        'url'=>array('/site/index')),
      ),
    )); ?>

<?php endif; ?>

如果您正在使用,您可以根据用户权限设置CMenu项的“可见”参数,例如

$this->widget('zii.widgets.CMenu',array(
    'items'=>array(
        array(
            'label'=>'Home',
            'url'=>array('site/index'),
        ),
        array(
            'label'=>'HR',
            'url'=>array('/hr/index'),
            'visible'=>Yii::app()->user->checkAccess('hr')
        ),
        array(
            'label'=>'Accounts',
            'url'=>array('/account/index'),
            'visible'=>Yii::app()->user->checkAccess('account')
        ),
        array(
            'label'=>'Operations',
            'url'=>array('/operations/index'),
            'visible'=>Yii::app()->user->checkAccess('operations')
        ),
    ),
);
这样,用户只有在拥有该区域的访问权限时才能看到菜单中的项目

[编辑]

根据下面simaremare的评论,您可以通过扩展
CWebUser
来强制缓存当前请求之外的查询。首先,将用户设置为运行新类(我们称之为
TWebUser
),因此在main.php配置文件中

'components'=>array(
    'user'=>array(
        ...
        'class'=>'TWebUser',
        ...
    ),
    ...
),
现在我们需要创建
TWebUser
来缓存当前请求之外的内容(这就是
CWebUser
所做的():

TWebUser类扩展了CWebUser { private$_access=array(); 公共函数checkAccess($operation,$params=array(),$allowCaching=true) { if($allowCaching&&$params===array()&&isset($this->\u访问[$operation])) 返回$this->_访问[$operation]; $cache=Yii::app()->会话['checkAccess']; if($allowCaching&&!$this->getIsGuest()&&isset($cache[$operation])&&time()-$cache[$operation]['t']<1800) { $checkAccess=$cache[$operation]['p']; }否则{ $checkAccess=Yii::app()->getAuthManager()->checkAccess($operation,$this->getId(),$params); 如果($allowCaching&!$this->getIsGuest()) { $access=isset($cache)?$cache:array(); $access[$operation]=array('p'=>$checkAccess,'t'=>time()); Yii::app()->session['checkAccess']=$access; } } 返回$this->_access[$operation]=$checkAccess; } } 现在,将为整个会话设置访问结果。这意味着,如果您编辑给定帐户的RBAC权限,他们将必须注销并再次登录,以查看浏览器中反映的新更改


我希望这会有帮助!我肯定我从其他人那里找到了这个解决方法(可能是这样),但我找不到原始帖子来给他们评分。

谢谢你的帮助。是的,我知道这是Guest。但我在authitem tbl有不同的角色名称,例如人力资源经理。我的问题是我不知道如何检查人力资源经理角色。我尝试了isHRManager,但它不起作用。我尝试了isAuthenticated身份验证,但它也不起作用I check其他角色作为isGuest?这将在每次执行checkAccess()时执行查询,这似乎效率不高。您好@simaremare,这是一个很好的观点,默认用户类(
CWebUser
)只缓存当前请求的这些结果,我添加了一个更高效的更新。解释得很好,谢谢。它让我对自定义RBAC有了更多的了解。
class TWebUser extends CWebUser
{
    private $_access=array();

    public function checkAccess($operation,$params=array(),$allowCaching=true)
    {
        if($allowCaching && $params===array() && isset($this->_access[$operation]))
            return $this->_access[$operation];

        $cache = Yii::app()->session['checkAccess'];
        if($allowCaching && !$this->getIsGuest() && isset($cache[$operation]) && time() - $cache[$operation]['t'] < 1800)
        {
            $checkAccess = $cache[$operation]['p'];
        } else {
            $checkAccess = Yii::app()->getAuthManager()->checkAccess($operation,$this->getId(),$params);

            if($allowCaching && !$this->getIsGuest())
            {
                $access = isset($cache) ? $cache : array();
                $access[$operation] = array('p'=>$checkAccess, 't'=>time());
                Yii::app()->session['checkAccess'] = $access;
            }
        }

        return $this->_access[$operation] = $checkAccess;
    }
}