在这里,我的情况是,如果取消选中该复选框,则相应的字段将被禁用,那么对于禁用的字段,客户端验证不应在此处执行,例如,如果我取消选中复选框(有父亲),那么与该复选框相关的字段,如父亲的名字、姓氏......因此,对于这些字段,客户端验证不应执行。如果我再次选中该复选框,则客户端验证应执行
在这里,我的问题是当我取消选中复选框时,客户端验证也正在进行并且表单未提交,在这种情况下任何人都可以帮助我。这是我的示例代码
<?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>";
?>
您可以使用方案来执行此操作。
更改$modelFamilyFather的验证规则以包含"on"=>"hasFather"。例:
array('firstname, lastName, occupation, averageMonthlyIncome', 'required', 'on' => 'hasFather'),
这仅激活"hasFather"方案的规则。
然后编辑控制器的 performAjaxValidation 方法,以便在复选框的值更改时更改方案:
我不知道您的表单名称,复选框(是否称为"类型"?)或模型,因此您需要替换下面的"您的表单名称"和"复选框名称"。
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"替换为模型的名称,并将复选框名称替换为复选框名称。
您需要检查的其他三件事:
- 确保模型中具有复选框的属性。如果你不这样做,你需要做一个。
- 将复选框的默认值设置为 0。所以在你的控制器中,之前将模型发送到窗体,添加 $model->复选框名称 = 0;
- 确保您的表单具有"enableAjaxValidation"=>true,'enableClientValidation' => true,
我已经使用自己的模型、属性和复选框在本地对此进行了测试,并且它有效。