簡體   English   中英

Yii:根據用戶角色使用其他范圍

[英]Yii: Use a different scope based on user role

我有兩個級別的可以創建和更新用戶的管理員:“管理員”和“管理員”。

在我的用戶_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;
    }

好的,實際上,您可以通過在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 } ?>

如果僅用戶是admin,則將顯示下拉列表。
編輯:如果要使用函數調用獲取它,則可以使用它。

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')); ?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM