2014-03-03 5 views
0

"관리자"및 "관리자"를 만들고 업데이트 할 수있는 두 수준의 관리자가 있습니다.Yii : 사용자 역할에 따라 다른 범위 사용

내 User _form.php에 내 계정 수준의 "user_type"드롭 다운이 있습니다.

관리자가 "관리자"계정을 만들지 못하게하고 사용자가 자신의 레코드를 업데이트 할 때 해당 드롭 다운을 완전히 숨기려고합니다.

) 규칙()을 사용하여이 동작을 제어하는 ​​방법이 있습니까?

'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; 
    } 
을 b)는 I는 다음과 같이 보일 것 "hideAdmin"라는 범위를 만드는 방법에 대해 생각

마지막으로 이와 같은 드롭 다운 목록을 만듭니다.

<?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 - 지아 - 미르에서 큐를 복용 및 사용 권한을 확인하고 내가 원하는 범위와 함께 적절한 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; 
    } 
+0

를 사용할 수 있습니다. –

+0

findAll은 CActiveRecord 기본 클래스의 메서드이지만 함수를 호출하는 경우 –

+0

맞아요, 어떻게 작동 시킬지 모르겠습니다. UserType :: model() -> hideAdmin() -> findAll을 수행하면 작동합니다. 그렇다면 나는 어떻게 올바른 범위에서 파이프 작업을 수행 할 수 있습니까? – McB

답변

0

가 좋아 실제로 당신이보기 코드에서 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; 
    } 

당신은이 오류가 발생하는 이유를 분명히 scopeToUse()이 객체 그게 아닌 사용을

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

감사합니다. 양식을 사용하여 전자 메일과 암호를 업데이트하는 일반 사용자의 드롭 다운을 숨길 수있는 것은 내 견해에 포함되지만 드롭 다운을 필터링하여 '관리자'가 '관리자'로는 아무도 지정할 수 없도록하고 싶습니다. 'Admin'은 내 앱에서 수퍼 유저의 일종입니다. – McB

+0

그러면 어떤 기준으로 droprDown을 필터링 하시겠습니까? "관리자는 관리자가 아닌 사람을 누구에게 할당 할 수 있습니까?" 관리자 권한을 가진 사용자는 누구입니까? –

+0

위에서 정의한 범위에있는 것입니다. 'hideAdmin'=> 배열 ( '조건'=> 'USER_TYPE! = "관리자는"' 가), – McB

관련 문제