【问题标题】:yii ajax form validation,require more fields base on certain fieldyii ajax 表单验证,需要基于特定字段的更多字段
【发布时间】:2014-03-25 09:34:32
【问题描述】:

我想通过 ajax 验证我的表单,我关注了 this,它工作正常,但是在第一列的值上,我想让用户也填写其他列,

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

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

不会提交,但是表单域不会变红,也不会显示错误信息。

我怎样才能做到这一点

更新:

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

自从我开始赏金以来,有没有办法在每个字段获得焦点之前显示所有消息?

【问题讨论】:

  • yiiframework.com/wiki/466/… 您的要求是定制的。编写自定义脚本很好。上面的链接帮助我们编写这样的脚本来验证并在提交之前执行操作
  • 这个有赏金...有人愿意做 100 次重复吗??
  • 你的问题看起来很有趣,但是没有看到任何代码就很难说什么

标签: ajax validation yii


【解决方案1】:

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

【讨论】:

  • 这是一个很好的观点,但我不能有固定的场景。我想将必填字段传递给管理员用户。再次加载表单?喜欢renderPartial?
  • 是的......就像选择汽车一样......使用renderPartial和使用setScenario再次加载表单,如果其他条件你可以进入汽车场景......现在你知道选择了汽车所以 setScenario 在 section 的基础上......这就是方式......它非常棘手但会起作用......(并且不要忘记在 renderPartial 结束时使用 false 和 true 来通过 ajax 重新加载 yiiactiveform ......)
  • 您的解决方案是数据流量最大的解决方案,但结合从数据库加载所需字段并加载表单将起作用,但我决定有一个 ajax 请求并且只获取基于所需的字段在用户定义上,只需将星号放在字段标签旁边。
  • 对不起,客户端验证您需要使用该模型的场景重新加载表单...所以您可能需要再次加载完整表单...仅表单...使用 $this- >renderPartial('viewname',array('model'=>$model),false,true)
【解决方案2】:

我解决这个问题的方法是创建场景并在客户端动态更新它们,而无需通过 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 中。验证 我的表单中的错误有“帮助阻止错误”类,请替换它 使用表单中用于显示错误的类, 正确隐藏它们。

参考资料:

  1. Validating other fields on change of one field - Yii
  2. Changing scenarios on client side without loading the form again

我希望这能解决这个问题。

【讨论】:

  • 您的解决方案适用于静态场景,但如果我想将表单验证留给用户(例如管理员会说还需要哪些其他字段),这将不起作用,但谢谢跨度>
  • 顺便说一句,您可以像这样更轻松地重置表单:$('#FORM_ID').trigger('reset');
  • 恕我直言,我认为 Yii 不支持动态场景,我也搜索过:D 在您的问题中,您说您正在 beforeValidate() 函数中实现检查逻辑。它是动态的还是静态的? @tinybyte 并重置我应用该方法的表单,因为如果我使用您的方法,它还会重置用于选择汽车或自行车的下拉列表,这将再次更改表单的验证。 :P
【解决方案3】:

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

【讨论】:

  • 验证不是问题,显示在前端是问题,基于第一个字段选择,可能需要其他字段,我希望能够显示给客户,客户会得到注意到表单有一些错误,但我也需要让他填写这些新的必填字段。
  • 那么,请问您如何根据其他字段的值显示/隐藏<input>元素?你的意思不是很清楚。请显示代码和您尝试过的内容。
  • 我不需要隐藏任何东西,只要让它们看起来像必填字段。
【解决方案4】:

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

【讨论】:

  • 我可以做你想做的事(比如手动),但我想知道 [yii] 是否支持这个,静态场景也不适合我,但是谢谢
【解决方案5】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多