我有一个带有两个值(必填字段)的单选按钮,基于该值显示一个字段(有两个字段是隐式的,它是根据单选按钮的值显示的)应该是必需的。所以我对最初隐藏的字段使用了条件验证。
这是我的型号代码:
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
是单选按钮字段。如果我为is_member
选择值1,则可以看到字段member_id
,它应该是必需的。如果is_member
的值为2,则显示nonmember_name
,它应成为必填字段。凭借我在模型中的代码,我设法实现了它。但现在使用此模型的其他操作(将新数据行保存到模型中)存在错误
数组([nonmember_name] =>数组([0] =>名称不能为空。)
所以我的问题是如何针对场景进行条件验证(我认为我的错误是由条件验证中定义的必需规则引起的)
修改
这是我的单选按钮
<?= $form->field($model, 'is_member')->radioList(array('1'=>'Member',2=>'Non Member'))->label('Member or Not'); ?>
答案 0 :(得分:6)
在规则
中public function rules()
{
return [
[
'nonmember_name',
'required',
'when' => function ($model) {
return $model->is_member == 2;
},
'whenClient' => "function (attribute, value) {
return $('#id').val() == '2';
}"
]
];
}
答案 1 :(得分:0)
我更喜欢在模型规则中使用函数,这使得将来更容易使用。
有一点需要提及的是,很多答案都没有提到,是你必须手动重新触发Yii2客户端验证!
$("#w0").yiiActiveForm("validateAttribute", "createuserform-trainer_id");
在下面的示例中,有两种类型的帐户:培训师和实习生。在我的管理面板中,管理员可以创建新用户。如果他们选择“培训师”,则无需做任何事情。如果他们选择“实习生”,则必须为该“实习生”指定一名“培训师”。
所以在代码方面:
如果用户角色= =受训者,则需要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
输入定位为隐藏,因为默认用户类型是培训师。