Yii2中的条件验证

时间:2015-12-10 10:03:20

标签: validation yii2 yii2-advanced-app

我有一个带有两个值(必填字段)的单选按钮,基于该值显示一个字段(有两个字段是隐式的,它是根据单选按钮的值显示的)应该是必需的。所以我对最初隐藏的字段使用了条件验证。

这是我的型号代码:

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

我使用方案receiptis_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'); ?>

2 个答案:

答案 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输入定位为隐藏,因为默认用户类型是培训师。