Проверка, если другие поля не пусты

В форме у меня есть три поля: 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;
    },
],
Другие вопросы по тегам