yii ajax表单验证,需要基于某些字段的更多字段

时间:2014-03-25 09:34:33

标签: ajax validation yii

我想ajax验证我的表单,我跟着this正常工作,但是在第一列的值上,我想让用户填写其他列,

如果选择的值是汽车,我希望用户也填写车牌号,但如果用户选择了自行车,我就不需要该车牌号。

在模型中验证函数之前我已经实现了我的逻辑,但问题是在前端,如果以前不需要字段,但现在需要,表单不会显示这个。

它不会被提交,但表单字段不会变红,并且错误消息不会显示。

我该如何实现这个

更新

我还在模型规则中添加了新的必填字段,并使用$('#my-form').trigger('reset');重置表单,但那些新需要的字段不会 有红色星号表示它们是必需的。

自从我开始赏金之后,有没有办法在每个领域都有焦点之前显示所有信息?

5 个答案:

答案 0 :(得分:1)

我有一个想法......你必须创建场景......但是你应该有一些你想要验证的固定数量...就像你说你有复选框汽车或自行车(或收音机或下拉列表)一样选择你可以通过ajax再次加载你的表格在那个动作你可以设置你的场景,如果选择了汽车将设置为汽车,如果选择了自行车则设置为自行车...并使用所选选项再次加载表格。使用那个特定场景,你可以动态验证...我认为这是唯一的方法......

答案 1 :(得分:1)

我解决这个问题的方法是创建方案并在客户端动态更新它们,而无需通过AJAX再次加载整个表单。

在model.php中创建如下方案: -

...
public function rules(){
    return array(
        ...
        array('license_plate', 'required', 'on'=>'car'),
        array('some_column', 'some_validation', 'on'=>'bike')
        ...
    );
}
...

现在您询问是否可以根据用户的输入选择更改验证。假设用户必须从选择(汽车或自行车),具有值1的汽车和具有值2的自行车中进行选择。更新控制器的创建动作,如下所示: -

public function actionCreate(){
    $model = new Vehicle();
    if(isset($_POST['ajax']) && $_POST['ajax'] == 'FORM_ID'){
        if($_POST['Vehicle']['type'] == 1)
            $model->setScenario('car');
        else
            $model->setScenario('bike');
        //You can have n-number of scenarios here based upon your application.
    }
    $this->performAjaxValidation($model);
    if(isset($_POST['Vehicle']))
        $model->attributes = $_POST['Vehicle'];
    if($model->type == 1)
        $model->setScenario('car');
    else
        $model->setScenario('bike');
    //You can have n-number of scenarios here based upon your application.
}

现在,在执行此操作时,即使方案已更改,我也遇到了错误消息不会消失的问题。我用这样的Javascript解决了这个问题: -

(在您的视图文件中包含此脚本)

$(document).on('change', '#DROPDOWN_ID', function(e){
    $(':input','#FORM_ID')
        .not('#DROPDOWN_ID')
        .val('')
        .removeAttr('checked')
        .removeAttr('selected');
    $('.help-block, .error').hide(); //NOTE 1.0
    var settings = $('#FORM_ID').data('settings');
    $.each(settings.attributes, function () {
        this.status = 2;
    });
    var form = $("#FORM_ID");
    form.data('settings', settings);
    $.fn.yiiactiveform.validate(form, function (data) {
        $.each(settings.attributes, function () {
            $.fn.yiiactiveform.updateInput(this, data, $("#FORM_ID"));
        });
    });
});

请将“FORM_ID”和“DROPDOWN_ID”替换为您的表单ID以及验证选项所依赖的下拉列表ID。

  

注释1.0说明:

     

我正在使用YiiBooster,所以我的所有表单都在Bootstrap中。验证   我的表单中的错误有类'help-block error',请替换它   使用表单中用于显示错误的类来   正确隐藏它们。

参考文献:

  1. Validating other fields on change of one field - Yii
  2. Changing scenarios on client side without loading the form again
  3. 我希望这可以解决这个问题。

答案 2 :(得分:0)

如果我理解正确,您需要custom validation rules而不是标准的必需规则。

答案 3 :(得分:0)

当用户从下拉列表中选择自行车/汽车时,例如您将表单发布到控制器,在那里设置一个新场景,并为新创建的输入部分呈现特定字段并将它们插入到dom中。这是另一个问题,它们没有经过验证的客户端,因为它们不是当前呈现的activeform的一部分。为了实现这一点,请看看我的帖子: Dynamic added form fields based on 1-to-n relation - What framework alternatives?

答案 4 :(得分:0)

使用原始javascript比yii自定义验证更容易实现您的逻辑。 您可以使用ajax下拉列表将ajax回调绑定到该下拉列表。通过更改其值,将调用所需的操作,其中将在那里验证域逻辑,并返回结果(如true / false),您可以在其中决定要向用户显示哪个字段。 您还可以将required类附加到ajax回调后所需的字段。