2017-11-27 25 views
0

여기 거래가 있습니다. 아래의 ActiveForm은 $ tt (라디오)와 $ value (문자열 숫자 입력)의 두 변수를 받아 컨트롤러로 보냅니다.비동기 적으로 컨트롤러에 값을 제출 하시겠습니까? yii2

$ 값은 InputField 모델에 정의 된 다른 규칙과 시나리오를 기반으로 유효성을 검사해야합니다. $ tt는 라디오 값이므로 지금은 규칙을 정의하지 않습니다.

트릭은 $ value에 대한 일종의 입력 유효성 검사가 있고 그 규칙이 사용자가 $ tt 값으로 설정 한 값에 따라 변경되어야한다는 것입니다. 이런 종류의 구성으로, 컨트롤러는 $ tt도 $ 값도받지 못한다. 나는 그 이유가 규칙에 상충되는 것이라고 생각한다.

이상적으로, 저는 컨트롤러에 확인 된 라디오 $ tt 값 (jQuery 또는 smthng)을 보내고 컨트롤러에 대해 모델에 대한 시나리오를 설정하여 적절한 유효성 검사 규칙을 설정하도록하고 싶습니다. 뷰의 $ 값이 작동합니다.

Yii2 전문가 : 1) 왜 내 컨트롤러가 어떤 가치를받지 못하는지 설명 할 수 있습니까? 2) 내가 할 계획이었던 것을 제안 해 주시겠습니까?

`

//보기 조각

 $valueForm = ActiveForm::begin([ 
       'id' => 'input-field', 
      'action' => ['value-search/index'], 
      'method' => 'post', 
     'options' => ['class' => 'form-horizontal'] ]); ?> 

<?= $valueForm->field($valueModel, 'tt') 
       ->radioList(['P_sat'=>'Sat. Pressure', 'T_sat'=>'Sat. Temperature']) 
       ->label('Select table type'); ?> 
<?= $valueForm->field($valueModel, 'value') 
       ->textInput(['options' => ['type'=>'number', 'name'=>'value','id'=>'value']]); ?> 
<?php ActiveForm::end() ?> 

// 모델

class InputField extends \yii\base\Model 

{

const SCENARIO_PSAT = 'P_sat'; 
const SCENARIO_TSAT = 'T_sat'; 
public $tt; 
public $value; 


public function scenarios() { 
    return [ 
     self::SCENARIO_PSAT => ['tt','value'], 
     self::SCENARIO_TSAT => ['tt','value'], 
    ]; 
} 

public function rules() { 
    return [ 
     ['tt','safe'], 
     ['value', 'double', 'numberPattern' => '/[0-9]+?(\.[0-9]{0,5})?/', 'min' => 0, 'max' => 22064, 
     'on' => self::SCENARIO_PSAT], 
     ['value', 'double', 'numberPattern' => '/[0-9]+?(\.[0-9]{0,5})?/', 'min' => 0, 'max' => 373.95, 
     'on' => self::SCENARIO_TSAT], 
    ]; 
} 
컨트롤러에서 10,403,210는 // 영업 활동

public function actionIndex() 
{ 
    $inputModel = new InputField; 

    $inputModel->load(\Yii::$app->request->post()); 

    $tt = $inputModel->tt; 


    switch($tt) { 
     case 'P_sat': $inputModel->scenario = $inputModel::SCENARIO_PSAT; 
        break; 
     case 'T_sat': $inputModel->scenario = $inputModel::SCENARIO_TSAT; 
        break; 
     default: throw new UserException('setTableType is not returning shit'); 
    } 


    if ($inputModel->validate('value')) { 
     $searchValue = $inputModel->value; 
     $this->test = $inputModel->tt; 
     $this->test2 = $inputModel->value; 

    } else { 
     throw new UserException('Input is not validated'); 
    } 

    return $this->render('index', [ 
     //'provider' => $provider, 
     'array' => $this->test, 
     'array2' => $this->test2 
    ]); 
} 

`

모델에서 $의 TT와 $ 값을받을 해야하는 모두 테스트 및 TEST2가, NULL이다 :(

+0

제출 버튼은 어디에 있습니까? 왜 클라이언트 측 유효성 검사를 사용하지 않았습니까? [예제를 확인하십시오] (http://www.yiiframework.com/doc-2.0/guide-input-validation.html#creating-validators) –

+0

시간에 제출 버튼을 사용하지 않았습니다 : /. 대신 enter를 사용하여 값을 제출했습니다. 그러나 어떤 이유로 든 validate()에 의한 서버 측 유효성 검사를 방해하는 것이있었습니다. 그런 다음 시나리오를 제거하고 "키워드"를 사용하여 특정 규칙을 실행했습니다. 하지만 validate()는 여전히 작동하지 않았으므로 서버의 데이터를 확인하는 별도의 함수를 만들어야했습니다. –

답변

0

시나리오에있다 값을로드하기 전에 설정하십시오.

public function actionIndex() 
{ 
    $inputModel = new InputField; 

    $inputModel->load(\Yii::$app->request->post()); 

    $tt = $inputModel->tt; 


    switch($tt) { 
     case 'P_sat': $inputModel->scenario = $inputModel::SCENARIO_PSAT; 
       break; 
     case 'T_sat': $inputModel->scenario = $inputModel::SCENARIO_TSAT; 
       break; 
     default: throw new UserException('setTableType is not returning shit'); 
    } 


    if ($inputModel->load(\Yii::$app->request->post()) && $inputModel->validate('value')) { 
     $searchValue = $inputModel->value; 
     $this->test = $inputModel->tt; 
     $this->test2 = $inputModel->value; 

    } else { 
     throw new UserException('Input is not validated'); 
    } 

    return $this->render('index', [ 
     //'provider' => $provider, 
     'array' => $this->test, 
     'array2' => $this->test2 
    ]); 
}