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

我用的场景receiptis_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 输入设为默认隐藏,因为默认用户类型是培训师。