だからここでの取り引きだ。以下の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
]);
}
`
コントローラから:(
送信ボタンはどこですか?なぜあなたはクライアント側の検証を使用していないのですか? [例を確認する](http://www.yiiframework.com/doc-2.0/guide-input-validation.html#creating-validators) –
私は送信ボタンを使っていませんでした。代わりに、私はenterを使って値を送信していました。しかし何らかの理由で、validate()によってサーバー側の検証が妨げられていました。次に、シナリオを削除し、特定のルールを実行するために「when keyword」を使用しました。しかし、validate()はまだ動作していなかったので、サーバー上のデータを検証するために別の関数を作成しなければなりませんでした。 –