如何检查 yii2 中 OR 条件的验证?

How to check validation in OR conditions in yii2?

我的表单中有两个单选按钮和两个文本输入:personIDotherPerson。用户应该 select 第一个单选然后填写 personID textInput 或选择第二个单选然后 otherPerson textInput 将启用并可以填写 otherPerson。同时只有一个选择,必须填写其中一个。

如何在客户端检查所需的验证?如果启用第一个无线电,则 personID 是必需的,否则 otherPerson。我已经按照代码尝试了,但它不起作用。

 ['personID', 'required', 'when' => function ($model) {
        return $model->rdPerson== 0;
    }, 'whenClient' => "function (attribute, value) {
        return $('input[name=rdPerson]').val()==0;
    }"]

 ['otherPerson', 'required', 'when' => function ($model) {
            return $model->rdPerson== 1;
        }, 'whenClient' => "function (attribute, value) {
            return $('input[name=rdPerson]').val()==1;
        }"]

如何解决这个问题?

我的表格:

<?= $form->field($model, 'rdPerson')->radio(['name' => 'rdPerson', 'value' => 0]); ?>
<?php echo $form->field($model, 'personID')->textInput(); ?>


<?= $form->field($model, 'rdPerson')->radio(['name' => 'rdPerson', 'value' => 1])?>
<?php echo $form->field($model, 'otherPerson')->textInput(); ?>

您需要对您的表单字段和您在 whenClient 中使用的脚本添加一些更改,不要手动提供输入名称,因为它们是由 ActiveForm 自动生成的,请更改您的字段定义使用分组单选按钮,这意味着不是使用 name='rdPerson'$form->field($model,'rdPerson'),而是使用数组名称将它们分组,如 $form->field($model,'rdPerson[]')。因为否则您使用它的方式将始终检索第一个单选按钮,只要您的 whenClient 被字段 personIdotherPerson 触发,因此不会工作。

同样在 whenClient 中,您应该检查 :checked 单选按钮的值,而不是直接访问 .val(),因此 checked 单选按钮的值为检索到。

将表单字段更改为

<?= $form->field($model, 'rdPerson[]')->radio(['value' => 0,'uncheck'=>null]); ?>
<?php echo $form->field($model, 'personID')->textInput(); ?>


<?= $form->field($model, 'rdPerson[]')->radio(['value' => 1,'uncheck'=>null]) ?>
<?php echo $form->field($model, 'otherPerson')->textInput(); ?>

并将您的模型规则更新为以下内容

[['personID'], 'required', 'when' => function($model, $attribute) {
        return $model->rdPerson == 0;
    },
    'whenClient' => 'function(attribute,value){ return ($("input[name=\''.\yii\helpers\Html::getInputName($this, 'rdPerson[]').'\']:checked").val()==0)}'],
[['otherPerson'], 'required', 'when' => function($model, $attribute) {
        return $model->rdPerson == 1;                    
    }, 'whenClient' => 'function(attribute,value){ return ($("input[name=\''.\yii\helpers\Html::getInputName($this,'rdPerson[]').'\']:checked").val()==1)}'],

希望这对您有所帮助。