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个字段中的其余部分。否则,如果没有填充任何字段,则应允许验证通过。对吗?如果没有,请用上述解决方案正确工作的确切要求更新您的问题,我唯一怀疑的是您试图在客户端而不是服务器端检查它,如果是这种情况,请描述。在此表单中,如果没有填写任何字段,它也不会通过验证。我已经更新了答案,如果你看到上面,你还没有相应地更新规则,更新它们,它将正常工作,并使用==空
而不是=空
使用我在答案的更新部分添加的代码。