2017-11-27 20 views
0

だからここでの取り引きだ。以下のActiveFormは$ tt(radio)と$ value(string数値入力)という2つの変数を受け取り、それらをコントローラに送ります。非同期でコントローラに値を送信しますか? yii2

$値は、InputFieldモデルで定義されているさまざまなルールやシナリオに基づいて検証する必要があります。 $ ttはラジオの値なので、今のところルールを定義していません。

このトリックは、$ valueに対して何らかの入力検証がありたいと思っています。そのためのルールは、ユーザーが$ tt値として設定した内容に応じて変更する必要があります。この種の設定では、コントローラは$ ttも$ valueも受け取っていないので、その理由はそれに矛盾するルールだと思います。

理想的には、チェックされたラジオ$ tt値(jQueryまたはsmthng)をコントローラに送信し、コントローラに対してモデルのシナリオを設定して適切な検証ルールが設定されるようにしたいと思います。ビューの$ valueが操作されます。

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], 
    ]; 
} 
モデルからの$ TTと$値を受信するようになっている両方のテストとTEST2は、NULLである

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 
    ]); 
} 

`

コントローラから:(

+0

送信ボタンはどこですか?なぜあなたはクライアント側の検証を使用していないのですか? [例を確認する](http://www.yiiframework.com/doc-2.0/guide-input-validation.html#creating-validators) –

+0

私は送信ボタンを使っていませんでした。代わりに、私はenterを使って値を送信していました。しかし何らかの理由で、validate()によってサーバー側の検証が妨げられていました。次に、シナリオを削除し、特定のルールを実行するために「when keyword」を使用しました。しかし、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 
    ]); 
} 
関連する問題