在表单中,我有三个字段: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;
},
],
答案 0 :(得分:0)
更新
我怀疑您之所以说它不起作用的原因是因为您试图在前端表单或客户端上实现它,而您在当前规则集中使用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
,例如{{1} }应该为return $model->name != null and $model->patronymic != null;
,当前您正在检查两者都不为空,则该字段是必填字段,与您想要的相反。
更改规则后,如下所示
return $model->name != null OR $model->patronymic != null;