1

这里我的情况是,如果复选框未选中,则相应的字段将被禁用,然后对于禁用的字段,客户端验证不应在此处执行,例如,如果我取消选中(有父亲)的复选框,则与该复选框相关的字段像父亲的名字,姓氏......所以对于这些字段客户端验证不应该执行。如果我再次选中该复选框,则应执行客户端验证

在这里我的问题是,当我取消选中复选框时,客户端验证也在发生并且表单没有提交,在这种情况下任何人都可以帮助我。这是我的示例代码

<?php echo $form->checkBox($modelFamilyFather, '[1]type',   array('id'=>'type', 'checked'=>'checked','onChange' => "
    if(this.value==checked)
    {

         $('#" . CHtml::activeId($modelFamilyFather, '[1]firstname') .
    "').removeAttr('disabled','disabled');

            $('#" . CHtml::activeId($modelFamilyFather,
    '[1]lastName') . "').removeAttr('disabled','disabled');



         $('#" . CHtml::activeId($modelFamilyFather, '[1]occupation') .
    "').removeAttr('disabled','disabled');

    $('#" . CHtml::activeId($modelFamilyFather, '[1]averageMonthlyIncome') .
    "').removeAttr('disabled','disabled');

    }

    else {
        $('#" . CHtml::activeId($modelFamilyFather, '[1]firstname') .
    "').attr('disabled','disabled');

            $('#" . CHtml::activeId($modelFamilyFather,
    '[1]lastName') . "').attr('disabled','disabled');



         $('#" . CHtml::activeId($modelFamilyFather, '[1]occupation') .
    "').attr('disabled','disabled');

    $('#" . CHtml::activeId($modelFamilyFather, '[1]averageMonthlyIncome') .
    "').attr('disabled','disabled');

    }



    "))." <label for='Father'>Has a Father</label>";

    ?>
4

1 回答 1

5

您可以使用场景来执行此操作。

更改 $modelFamilyFather 的验证规则以包含 'on' => 'hasFather'。例子:

array('firstname, lastName, occupation, averageMonthlyIncome', 'required', 'on' => 'hasFather'),

这仅激活“hasFather”场景的规则。

然后编辑控制器的 performAjaxValidation 方法以在复选框的值更改时更改场景:

我不知道您的表单、复选框(是否称为“类型”?)或模型的名称,因此您需要替换下面的“your-form-name”和“checkBoxName”。

protected function performAjaxValidation($model)
{
    if(isset($_POST['ajax']) && $_POST['ajax']==='your-form-name')
    {
        if($_POST['ModelFamilyFather']['checkBoxName'] == 1){
            $model->scenario = 'hasFather';
        }
        echo CActiveForm::validate($model);
        Yii::app()->end();
    }
}

然后,您还需要编辑从表单获取输入的方法。同样,我不知道代码的名称或该部分的外观,但您需要执行以下操作:

if(isset($_POST['ModelFamilyFather']))
{
    $model->attributes=$_POST['ModelFamilyFather'];
    if($model->checkBoxName == 1)
        $model->scenario = 'hasFather';
    if($model->save())
        $this->redirect(array('view','id'=>$model->id));
}

将“ModelFamilyFather”替换为您的模型名称,将 checkboxName 替换为您的复选框名称。

您需要检查的其他三件事:

  1. 确保模型中的复选框具有属性。如果你不这样做,你需要做一个。
  2. 将复选框的默认值设置为 0。因此,在您的控制器中,在将模型发送到表单之前,添加 $model->checkBoxName = 0;
  3. 确保您的表单具有 'enableAjaxValidation'=>true, 'enableClientValidation' => true,

我已经用我自己的模型、属性和复选框在本地对此进行了测试,并且它有效。

于 2013-01-30T19:18:23.837 回答