Проверка, если другие поля не пусты
В форме у меня есть три поля: family
, name
а также patronymic
,
Необходимо настроить валидацию таким образом, чтобы, если хотя бы один из них был заполнен, остальные также стали обязательными. Если не один не завершен, то проверка должна быть успешной.
[
['family'],
'required',
'when' => function ($model) {
return $model->name != null and $model->patronymic != null;
},
],
[
['name'],
'required',
'when' => function ($model) {
return $model->family != null and $model->patronymic != null;
},
],
[
['patronymic'],
'required',
'when' => function ($model) {
return $model->family != null and $model->name != null;
},
],
1 ответ
Обновить
Я подозреваю, что причина, по которой вы говорите, что это не работает, заключается в том, что вы пытаетесь достичь этого на веб-интерфейсе или на стороне клиента, в то время как вы используете when
в вашем текущем наборе правил, который не дает никакой идеи, если вы не можете сделать это в форме внешнего интерфейса, и нигде не упоминается. Хотя это работает, если вы инициализируете модель вручную и назначаете значения на стороне сервера.
Если это правильно, вам нужно использовать whenClient
вместе с when
вариант по правилам.
Смотрите обновленные правила ниже
return [
[
['family'], 'required', 'when' => function ($model) {
return $model->patronymic !== null || $model->name !== null;
},
'whenClient' => 'function(attribute,value){
return $("#' . \yii\helpers\Html::getInputId($this, 'patronymic') . '").val()!=="" || $("#' . \yii\helpers\Html::getInputId($this, 'name') . '").val() !=="";
}',
],
[
['patronymic'], 'required', 'when' => function ($model) {
return $model->family !== null || $model->name !== null;
},
'whenClient' => 'function(attribue,value){
return $("#' . \yii\helpers\Html::getInputId($this, 'family') . '").val()!=="" || $("#' . \yii\helpers\Html::getInputId($this, 'name') . '").val() !=="";
}',
],
[
['name'], 'required', 'when' => function ($model) {
return $model->patronymic !== null || $model->family !== null;
},
'whenClient' => 'function(attribute,value){
return $("#' . \yii\helpers\Html::getInputId($this, 'patronymic') . '").val()!=="" || $("#' . \yii\helpers\Html::getInputId($this, 'name') . '").val() !=="";
}',
],
];
Вам требуется "если одно из полей заполнено, то остальные обязательны". изменить условия на OR
вместо AND
например return $model->name != null and $model->patronymic != null;
должно быть return $model->name != null OR $model->patronymic != null;
, в настоящее время вы проверяете, если оба значения не равны NULL, тогда поле является обязательным, что противоположно тому, что вы хотите.
После изменения ваших правил должно выглядеть как ниже
[
['family'],
'required',
'when' => function ($model) {
return $model->name != null || $model->patronymic != null;
},
],
[
['name'],
'required',
'when' => function ($model) {
return $model->family != null || $model->patronymic != null;
},
],
[
['patronymic'],
'required',
'when' => function ($model) {
return $model->family != null || $model->name != null;
},
],