проверка, если другие поля не пусты - PullRequest
0 голосов
/ 24 января 2019

В форме у меня есть три поля: 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 Ответ

0 голосов
/ 24 января 2019

Обновление

Я подозреваю, что причина, по которой вы говорите, что она не работает, заключается в том, что вы пытаетесь достичь ее в форме внешнего интерфейса или на стороне клиента, в то время как выиспользование 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;, в настоящее время вы проверяете, если оба не равны нулю , тогда поле является обязательным, что противоположно тому, что вы хотите.

После изменения ваши правила должны выглядеть следующим образом

[
    ['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;
    },
],
...