Yii2 中的条件验证
Conditional Validation in Yii2
我有一个具有两个值(必填字段)的单选按钮,基于该值显示一个字段(有两个字段最初是隐藏的,其显示基于单选按钮的值)应该是必需的。所以我对最初隐藏的字段使用了条件验证。
这是我的模型代码:
public function rules()
{
return [
[['receipt_no', 'date_of_payment', 'payment_method_id',
'total_amount'], 'required'],
['nonmember_name', 'required', 'whenClient' => function($model)
{
return $model->is_member == 2;
}, 'enableClientValidation' => false],
['member_id', 'required', 'whenClient' => function($model)
{
return $model->is_member == 1;
}, 'enableClientValidation' => false],
[['receipt_no', 'date_of_payment', 'payment_method_id',
'total_amount','is_member'], 'required','on' => 'receipt'],
];
}
我用的场景receipt
,is_member
是单选按钮字段。如果我 select is_member
的值为 1,那么字段 member_id
是可见的,它应该是必需的。如果 is_member
的值为 2,则显示 nonmember_name
并且它应该成为必填字段。通过模型中的代码,我设法实现了它。但是现在使用此模型的其他操作(将新的一行数据保存到模型中)出现错误
Array ( [nonmember_name] => Array ( [0] => Name cannot be blank. ) )
所以我的问题是如何针对特定场景进行条件验证(我认为我的错误是由于条件验证中定义的必需规则造成的)
编辑:
这是我的单选按钮
<?= $form->field($model, 'is_member')->radioList(array('1'=>'Member',2=>'Non Member'))->label('Member or Not'); ?>
在规则中
public function rules()
{
return [
[
'nonmember_name',
'required',
'when' => function ($model) {
return $model->is_member == 2;
},
'whenClient' => "function (attribute, value) {
return $('#id').val() == '2';
}"
]
];
}
我更喜欢在模型的规则中使用函数,这样将来使用起来会容易得多。
有一件事很多答案都没有提到,那就是你必须手动重新触发 Yii2 客户端验证!
$("#w0").yiiActiveForm("validateAttribute", "createuserform-trainer_id");
在我下面的示例中,有两种类型的帐户:培训师和实习生。在我的管理面板中,管理员可以创建一个新用户。如果他们选择 "trainer",就没有什么可做的了。如果他们选择 "trainee",则必须为 "trainee" 分配一个 "trainer" 才能进入。
所以在代码方面:
如果用户角色 == 实习生,则需要 trainer_id 并显示它的表单输入。
否则隐藏 trainer_id 输入并且 trainer_id 将不需要。
型号 规则:
public function rules()
{
return [
[
'trainer_id', 'required', 'when' => function ($model) {
return $model->role == 2;
}, 'whenClient' => "isUserTypeTraineeChosen"
],
];
}
查看 表格后:
<?php $this->registerJs('
function isUserTypeTraineeChosen (attribute, value) {
if ($("#createuserform-role").val() == 2) {
$(".field-createuserform-trainer_id").show();
} else {
$("#createuserform-trainer_id").val(null);
$(".field-createuserform-trainer_id").hide();
}
return ($("#createuserform-role").val() == 2) ? true : false;
};
jQuery( "#createuserform-role" ).change(function() {
$("#w0").yiiActiveForm("validateAttribute", "createuserform-trainer_id");
});
jQuery( "#createuserform-role" ).keyup(function() {
$("#w0").yiiActiveForm("validateAttribute", "createuserform-trainer_id");
});
'); ?>
注意:这是一个下拉列表,因此更改和键入都是准确检测其更改状态所必需的。如果您不使用下拉菜单,则两者都不是必需的。
我还使用 CSS 将 trainer_id
输入设为默认隐藏,因为默认用户类型是培训师。
我有一个具有两个值(必填字段)的单选按钮,基于该值显示一个字段(有两个字段最初是隐藏的,其显示基于单选按钮的值)应该是必需的。所以我对最初隐藏的字段使用了条件验证。
这是我的模型代码:
public function rules()
{
return [
[['receipt_no', 'date_of_payment', 'payment_method_id',
'total_amount'], 'required'],
['nonmember_name', 'required', 'whenClient' => function($model)
{
return $model->is_member == 2;
}, 'enableClientValidation' => false],
['member_id', 'required', 'whenClient' => function($model)
{
return $model->is_member == 1;
}, 'enableClientValidation' => false],
[['receipt_no', 'date_of_payment', 'payment_method_id',
'total_amount','is_member'], 'required','on' => 'receipt'],
];
}
我用的场景receipt
,is_member
是单选按钮字段。如果我 select is_member
的值为 1,那么字段 member_id
是可见的,它应该是必需的。如果 is_member
的值为 2,则显示 nonmember_name
并且它应该成为必填字段。通过模型中的代码,我设法实现了它。但是现在使用此模型的其他操作(将新的一行数据保存到模型中)出现错误
Array ( [nonmember_name] => Array ( [0] => Name cannot be blank. ) )
所以我的问题是如何针对特定场景进行条件验证(我认为我的错误是由于条件验证中定义的必需规则造成的)
编辑:
这是我的单选按钮
<?= $form->field($model, 'is_member')->radioList(array('1'=>'Member',2=>'Non Member'))->label('Member or Not'); ?>
在规则中
public function rules()
{
return [
[
'nonmember_name',
'required',
'when' => function ($model) {
return $model->is_member == 2;
},
'whenClient' => "function (attribute, value) {
return $('#id').val() == '2';
}"
]
];
}
我更喜欢在模型的规则中使用函数,这样将来使用起来会容易得多。
有一件事很多答案都没有提到,那就是你必须手动重新触发 Yii2 客户端验证!
$("#w0").yiiActiveForm("validateAttribute", "createuserform-trainer_id");
在我下面的示例中,有两种类型的帐户:培训师和实习生。在我的管理面板中,管理员可以创建一个新用户。如果他们选择 "trainer",就没有什么可做的了。如果他们选择 "trainee",则必须为 "trainee" 分配一个 "trainer" 才能进入。
所以在代码方面:
如果用户角色 == 实习生,则需要 trainer_id 并显示它的表单输入。 否则隐藏 trainer_id 输入并且 trainer_id 将不需要。
型号 规则:
public function rules()
{
return [
[
'trainer_id', 'required', 'when' => function ($model) {
return $model->role == 2;
}, 'whenClient' => "isUserTypeTraineeChosen"
],
];
}
查看 表格后:
<?php $this->registerJs('
function isUserTypeTraineeChosen (attribute, value) {
if ($("#createuserform-role").val() == 2) {
$(".field-createuserform-trainer_id").show();
} else {
$("#createuserform-trainer_id").val(null);
$(".field-createuserform-trainer_id").hide();
}
return ($("#createuserform-role").val() == 2) ? true : false;
};
jQuery( "#createuserform-role" ).change(function() {
$("#w0").yiiActiveForm("validateAttribute", "createuserform-trainer_id");
});
jQuery( "#createuserform-role" ).keyup(function() {
$("#w0").yiiActiveForm("validateAttribute", "createuserform-trainer_id");
});
'); ?>
注意:这是一个下拉列表,因此更改和键入都是准确检测其更改状态所必需的。如果您不使用下拉菜单,则两者都不是必需的。
我还使用 CSS 将 trainer_id
输入设为默认隐藏,因为默认用户类型是培训师。