ユーザーを作成および更新できる管理者には、「管理者」と「マネージャー」の 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;
}