Yii:动态创建字段的Ajax验证

时间:2012-09-19 09:05:15

标签: jquery yii validation

我有一个用CActiveForm创建的表单,HTML输出就是这样的

...
    <tr>
        <td><input class="span9" placeholder="Type in the seminar title" name="CvSeminar[0][title]" id="CvSeminar_0_title" maxlength="255" value="Some Value" type="text">        <span class="help-inline error" id="CvSeminar_0_title_em_" style="display: none"></span>    </td>
        <td><input class="span1" name="CvSeminar[0][yearIssued]" id="CvSeminar_0_yearIssued" maxlength="4" value="2009" type="text">        <span class="help-inline error" id="CvSeminar_0_yearIssued_em_" style="display: none"></span>    </td>
        <td><a href="#" class="removeSeminarRow"><i style="margin-top: 10px" class="icon-remove"></i></a></td>
    </tr>
    <tr>
        <td><input class="span9" placeholder="Type in the seminar title" name="CvSeminar[1][title]" id="CvSeminar_1_title" maxlength="255" value="Some Value" type="text">        <span class="help-inline error" id="CvSeminar_1_title_em_" style="display: none"></span>    </td>
        <td><input class="span1" name="CvSeminar[1][yearIssued]" id="CvSeminar_1_yearIssued" maxlength="4" value="2006" type="text">        <span class="help-inline error" id="CvSeminar_1_yearIssued_em_" style="display: none"></span>    </td>
        <td><a href="#" class="removeSeminarRow"><i style="margin-top: 10px" class="icon-remove"></i></a></td>
    </tr>
...

正如你所看到的,我创建了一个区域,每行包含两个字段。我还创建了一个按钮,用户可以在其中添加新行。用户点击按钮时的html输出是:

<tr>
   <td><input class="span9" placeholder="Type in the seminar title" name="CvSeminar[1000][title]" id="CvSeminar_1000_title" maxlength="255" type="text"><span class="help-inline error" id="CvSeminar_1000_title_em_" style="display: none"></span></td>
   <td><input class="span1" name="CvSeminar[1000][yearIssued]" id="CvSeminar_1000_yearIssued" maxlength="4" type="text"><span class="help-inline error" id="CvSeminar_1000_yearIssued_em_" style="display: none"></span></td>
   <td><a href="#" class="removeSeminarRow"><i style="margin-top: 10px" class="icon-remove"></i></a></td>
</tr>

当我创建一个新行并将其留空时,我的问题就出现了。服务器端的Ajax验证工作正常。 Yii用json回应新字段有错误。

{"CvSeminar_1000_title":["Title cannot be empty."],"CvSeminar_1000_yearIssued":["Year cannot be empty"]}

问题出在客户端。由于yiiactiveform对新添加的行一无所知,如何更新yiiactiveform以包含新添加的字段?

由于

2 个答案:

答案 0 :(得分:1)

添加新行时,只需使用要验证的新属性更新表单设置。

var settings = $(myform).data('settings');
settings.attributes.push({
   ...Validation settings here
});
$(myform).data('settings', settings);

查看Yii生成的javascript,以便了解要使用的内容。

答案 1 :(得分:0)

嗯,经过大量的研究,我找到了解决方案。不是最好的,但肯定是最干净的。

由于yiiactiveform对我事先创建的CvSeminar_1000_titleCvSeminar_1000_yearIssued一无所知:

for($i = 1000; $i <= 1050; $i++) {
    $form->textField(new CvSeminar, '['.$i.']title'); 
    $form->error(new CvSeminar, '['.$i.']title'); 
    $form->textField(new CvSeminar, '['.$i.']yearIssued');
    $form->error(new CvSeminar, '['.$i.']yearIssued');
}
  • 注1:是的,我知道!这不是最好的解决方案,但它运行正常!
  • 注意2:我没有回显表单元素,只是调用方法以强制CActiveForm创建适当的js ajax验证。