Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Yii2 如果其他字段不为空,则进行验证_Yii2_Yii2 Validation - Fatal编程技术网

Yii2 如果其他字段不为空,则进行验证

Yii2 如果其他字段不为空,则进行验证,yii2,yii2-validation,Yii2,Yii2 Validation,在表单中,我有三个字段:family、name和patronymic 有必要以这样一种方式设置验证:如果其中至少有一个已填写,则其他验证也将成为必需的。如果没有一个未完成,则验证必须成功 [ ['family'], 'required', 'when' => function ($model) { return $model->name != null and $model->patronymic != null; }, ], [

在表单中,我有三个字段:
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;
    },
],

更新

我怀疑的是,你之所以说它不起作用,是因为你试图在前端表单或客户端实现它,而你在当前规则集中使用的是
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() !=="";
        }',
    ],
];


您需要“如果其中一个字段已填充,则其余字段都是必需的。”将条件更改为
,而不是
,例如
返回$model->name!=null和$model->patronymic!=无效应该是
返回$model->name!=空或$model->patronymic!=无效,当前您正在检查两者是否均不为空,则该字段为必填字段,与您想要的相反

更改规则后,应如下所示

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

如果全部为空,则必须填写其中一个字段。您在寻找什么?如果其中一个字段已填充,则其余字段都是必填字段。请将条件更改为
,而不是
,例如
返回$model->name!=null和$model->patronymic!=无效应该是
返回$model->name!=空或$model->patronymic!=无效,更改所有应力条件请在回答“不工作”中查看更新部分。仅当所有字段均不为空时验证成功。@triest23您已经提到,只有当3个字段中的任何一个字段已填写,而其余2个字段未填写时,才会引发验证,那么它应该要求您填写这2个字段中的其余部分。否则,如果没有填充任何字段,则应允许验证通过。对吗?如果没有,请用上述解决方案正确工作的确切要求更新您的问题,我唯一怀疑的是您试图在客户端而不是服务器端检查它,如果是这种情况,请描述。在此表单中,如果没有填写任何字段,它也不会通过验证。我已经更新了答案,如果你看到上面,你还没有相应地更新规则,更新它们,它将正常工作,并使用
==空
而不是
=空
使用我在答案的更新部分添加的代码。