验证其他字段是否为空

validation if other fields not empty

在表单中,我有三个字段:familynamepatronymic

有必要以这样一种方式设置验证,如果至少其中一个被填充,其他的也成为必需的。如果没有一个未完成,则验证必须成功。

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

更新

我怀疑你说它不起作用的原因是因为你试图在前端表单或客户端实现它,而你在当前的集合中使用 when如果您未能在前端表单中执行此操作,则这些规则不会给出任何想法,并且在任何地方都没有提及。尽管如果您手动初始化模型并在服务器端分配值,它会起作用。

如果正确,您需要使用 whenClientwhen 选项作为规则。

查看下面的更新规则

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() !=="";
        }',
    ],
];

您需要 "if one of the fields is filled, then the rest are required." 将条件更改为 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;
    },
],