我有两个级别的管理员可以创建和更新用户,“管理员”和“经理”。
在我的用户 _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;
}