Итак, вот сделка. Предполагается, что нижеприведенная ActiveForm получит две переменные: $ tt (radio) и $ value (строковый цифровой ввод) и отправит их в контроллер.
$ value необходимо проверять на основе различных правил и сценариев, которые определены в модели InputField. $ tt — это значение радио, поэтому я не определяю правила для него на данный момент.
Хитрость в том, что я хотел бы, чтобы была какая-то проверка ввода для $ value, и правила для нее должны меняться в зависимости от того, что пользователь установил в качестве значения $ tt. При такой конфигурации контроллер никогда не получает ни $ tt, ни $ value, я думаю, причина в противоречивых правилах для него.
В идеале я хотел бы, чтобы мое представление отправляло проверенное значение $ 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],
];
}
// Операционное действие от контроллера
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
]);
}
`
И test, и test2, которые должны получить $ tt и $ value из модели, имеют значение 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->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
]);
}
Других решений пока нет …