Yii:根据用户角色使用不同的范围

时间:2014-03-03 19:12:19

标签: php yii scopes

我有两个级别的管理员可以创建和更新用户,“管理员”和“管理员”。

在我的用户_form.php中,我有一个“user_type”下拉列表,其中包含我的帐户级别。

我想限制管理员创建“管理员”帐户,并且当用户更新自己的记录时,显然会完全隐藏下拉列表。

a)有没有办法使用rules()来控制这种行为? b)我考虑创建一个名为“hideAdmin”的范围,如下所示:

'hideAdmin' => array(
   'condition' => 'user_type != "Admin"',
),

然后在我的模型中创建一个名为“scopeToUse()”的公共方法,如下所示:

    public function scopeToUse() {
        $scope = 'hideAdmin()';
        if(Yii::app()->authManager->checkAccess('Admin', Yii::app()->user->id)) {
            $scope = 'orderAsc()';
        } 
        return $scope;
    }

最后,像这样创建我的下拉列表。

<?php echo $form->dropDownList($model,'user_type_id',
   CHtml::listData(UserType::model()->scopeToUse()->findAll(),'id','user_type')); ?>

我希望'scopeToUse()'会返回范围名称,它会起作用,但我最终还是得到了回复:

Fatal error: Call to a member function findAll() on a non-object

有关正确方法的任何想法吗?

修改

我最终从@ Rafay-Zia-Mir获取了一个提示,并在我的用户类中创建了一个检查权限的新方法,并返回了相应的CHtml :: listData以及我想要的范围。这不完全是我的意图,但最终结果是一样的,它使我不会在我的视图中放置太多代码,并且它允许我使用我的范围而不是复制选择标准。

这是代码:

    public function userTypeDropdown() {
        if(Yii::app()->authManager->checkAccess('Admin',Yii::app()->user->id)) {
            $listData = CHtml::listData(UserType::model()->findAll(),'id','user_type');
        } else {
            $listData = CHtml::listData(UserType::model()->hideAdmin()->findAll(),'id','user_type');
        };
        return $listData;
    }

1 个答案:

答案 0 :(得分:0)

实际上,您可以在View代码中使用If语句来执行此操作。你可以这样做

<?php 
          if(Yii::app()->authManager->checkAccess('Admin', Yii::app()->user->id)) {
         ?>
         <?php $criteria=new CDbCriteria();
             $criteria->condition="NOT user_type=Admin";
                echo $form->dropDownList($model,'user_type_id',
                    CHtml::listData(UserType::model()->findAll($criteria),'id','user_type')); ?>

         <?php } ?>

如果用户仅为管理员,则会显示下拉列表 编辑:如果您想使用函数调用来获取它,那么您可以使用它。

public function scopeToUse() {
        if(Yii::app()->authManager->checkAccess('Admin', Yii::app()->user->id)) {
            $this->getDbCriteria()->mergeWith(array(
        'condition' => 'NOT user_type="Admin"',
         'order'=>'id ASC'
    ));

        } 
        return $this;
    }

然后你可以使用

<?php  echo $form->dropDownList($model,'user_type_id',
                        CHtml::listData(UserType::model()->scopeToUse()->findAll(),'id','user_type')); ?>