2017-11-19 8 views
0

양식의 스위치 값에 따라 모델에서 규칙을 동적으로 대체하려고합니다. 감안Yii2 - 모델에 설정된 규칙을 동적으로 전환하십시오.

:

<?php 
    $form = ActiveForm::begin([ 
     'enableAjaxValidation' => true, 
     'validationUrl' => Url::toRoute('anounce/validation') 
    ]); 
?> 

컨트롤러 : 모델

public function actionValidation() 
{ 
    $model = new Anounce(); 
    if (Yii::$app->request->isAjax && $model->load(Yii::$app-> 
     request->post())) { 
     Yii::$app->response->format = 'json'; 
     return ActiveForm::validate($model); 
    } 
} 

발췌 : idanounce_type

class Anounce extends \yii\db\ActiveRecord 
{ 
    private $currentRuleSet; // Current validation set 
    // Here are arrays of rules with assignment 
    private $fullRuleSet; // = [...]; 
    private $shortRuleSet; // = [...]; 
    private $minRuleSet; // = [...]; 

    public function init() 
    { 
     parent::init(); 
     $this->currentRuleSet = $this->fullRuleSet; 
    } 

    public function rules() 
    { 
     return $this->currentRuleSet; 
    } 

    public function beforeValidate() 
    { 
     if ($this->idanounce_type === self::FULL) { 
      $this->currentRuleSet = $this->fullRuleSet; 
     } else if ($this->idanounce_type === self::SHORTER) { 
      $this->currentRuleSet = $this->shortRuleSet; 
     } else if ($this->idanounce_type === self::MINIMAL) { 
      $this->currentRuleSet = $this->minRuleSet; 
     } 
     return parent::beforeValidate(); 
    } 
} 

변수 규칙 간의 스위치이다. 유감스럽게도 값이 currentRuleSet에 할당되었지만 전체 규칙 집합 (또는 init에 사용 된 규칙 집합)에 따라 유효성 검사가 수행되었습니다.

규칙의 동적 전환을 작성하는 방법은 무엇입니까?

답변

1

여기서 원하는 것은 사용자의 입력에 따라 유효성을 변경하는 것입니다. 모델에서 시나리오를 정의하여이 작업을 수행 할 수 있습니다.

먼저 유효성을 검사 할 필드를 입력하는 시나리오를 설정하십시오. 예 : username, passwordemail 필드가 있고 두 시나리오를 정의한 경우 SCENARIO_FIRST에만 usernamepassword 만 유효성을 검사합니다.

public function actionValidation() 
{ 
    $model = new Anounce(); 

    //example 
    if($condition == true) 
    { 
     $model->scenario = Anounce::SCENARIO_FIRST; 
    } 

    if (Yii::$app->request->isAjax && $model->load(Yii::$app-> 
     request->post())) { 
     Yii::$app->response->format = 'json'; 
     return ActiveForm::validate($model); 
    } 
} 

여기에 시나리오에 대한 자세한 내용을 읽고 여기에 유효성 검사를 사용하는 방법 :

http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios

+0

사운드

public function scenarios() { return [ self::SCENARIO_FIRST => ['username', 'password'], self::SCENARIO_SECOND => ['username', 'email', 'password'], ]; } 

그런 다음 컨트롤러에서 입력에 따라 시나리오를 설정 좋은. 시나리오에 따라 규칙을 변경 (!)하는 법을 알고 있습니까? '게시'시나리오에서는 게시 이미지를'[[ 'upload'], 'file', 'skipOnEmpty'=> true, 'extensions'=> 'png, jpg']'로로드하고 'PDF' true, 'extensions'=> 'pdf'] ' –

+0

두 규칙을 사용하고 ON을 사용할 수 있습니다. 'png, jpg', 'on'=> 'PUBLICATION'] 다음에 다른 규칙의 경우 [[업로드]], [파일], [skipOnEmpty] 'extension'=> 'pdf', 'on'=> 'PDF'] – mrateb

+0

위대한! 마지막으로 - 사용자가 무언가를 변경할 때뿐만 아니라 데이터베이스에서 모델링 할 때 데이터를로드 할 때 (초기 설정 = 기본 시나리오 설정) 규칙을 전환해야했습니다. 불행히도, 나는 데이터를 데이터베이스에서 모델로 로딩 할 때이 메소드/이벤트를 찾지 못했습니다. 어쩌면 그런 방법/이벤트를 아십니까? –