0

ユーザーを作成および更新できる管理者には、「管理者」と「マネージャー」の 2 つのレベルがあります。

私の User _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;
    }
4

1 に答える 1

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')); ?>
于 2014-03-03T19:58:17.537 に答える