在提交之前手动触发活动表单验证

时间:2015-02-19 15:38:17

标签: yii2

是否可以通过javascript以编程方式调用活动表单验证?我需要在执行一些ajax操作之前调用验证过程。

9 个答案:

答案 0 :(得分:8)

猜猜我在这里回复有点晚了,但我只是有同样的问题,烧酒的解决方案对我也不起作用。

所以我看了一下ActiveForm的JS代码,发现它似乎监视变量中每个字段的状态,如果该字段是"未触及"除非提交实际表格,否则不会触发验证。所以我改变了我的呼吁:

var $form = $("#my-form"), 
    data = $form.data("yiiActiveForm");
$.each(data.attributes, function() {
    this.status = 3;
});
$form.yiiActiveForm("validate");

现在似乎按照我的预期正常工作。

答案 1 :(得分:6)

我们可以通过合并@BlueZed和@S Rana的答案来实现这一目标。

你可以写下面的脚本,所以我们可以检查一下如果表单中有任何错误,那么表单将不会提交(即使它也适用于表格(向导),如表格)。

    var $form = $("#form"), 
        data = $form.data("yiiActiveForm");
    $.each(data.attributes, function() {
        this.status = 3;
    });
    $form.yiiActiveForm("validate");

    if ($("#form").find(".has-error").length) {
        return false;
    }

答案 2 :(得分:2)

谢谢blue zed, 但在此之前 - 要附加表单字段,你需要做这些事情......

//您的输入

$inputData = $form->field($model,"prductName");

//删除下一行&将双引号转换为单引号

$newInputData= trim(preg_replace('/\s+/', ' ',str_replace('"',"'", $inputData)));

//然后像这样追加

$("#table").append("'.$newInputData.'");

//这对我来说和蓝色的zend解决方案一样,如下所示

$this->registerJs('
    $(document).on("click","input[type=text]",function(){
            var $form = $("#w0"), 
            data = $form.data("yiiActiveForm");
            $.each(data.attributes, function() {
                this.status = 3;
            });
            $form.yiiActiveForm("validate");        
    });
');

答案 3 :(得分:1)

是的,有可能,你应该试试这个:

$('#form-id').yiiActiveForm('validate');

答案 4 :(得分:1)

这对我有用

$this->registerJs( "
        $('body').on('beforeSubmit', 'form#product-form', function () {
             var form = $(this);
             // return false if form still have some validation errors
             if (form.find('.has-error').length) {
                  return false;
             }
             // submit form
             $.ajax({
                  url: form.attr('action'),
                  type: 'post',
                  data: form.serialize(),
                  success: function (response) {

                  }
             });
             return false;
        }); ");

答案 5 :(得分:0)

提交表单时激活验证。因此,这将起作用:

$form.data('yiiActiveForm').submitting = true;
$form.yiiActiveForm('validate', false);

validate的第二个参数称为forceValidate

答案 6 :(得分:0)

要从javascript手动验证,您应将以下代码放在表单提交事件的末尾。

return  $('#your-form-id').yiiActiveForm('validate');

对于新手用户,

$('#your-form-id').submit(function () {       
    return  $('#your-form-id').yiiActiveForm('validate');
});

另请注意,您应在ActiveForm上指定表单ID,如下所示

<?php $form = ActiveForm::begin(['id' => 'd4d-hub-form']); ?>

答案 7 :(得分:0)

我有同样的问题。在官方文档中没有明确的解决方案,我也不知道为什么Stackoverflow上的任何解决方案对我都不起作用。可能在yii2的不同版本中有不同的方法可以做到这一点。我花了很多时间来寻找解决方案。就我而言,我已经触发了对表单上个人输入的验证:

$('#form-id').data('yiiActiveForm').submitting = false;
$('#form-id').yiiActiveForm('validateAttribute', 'input-id'); //this will triger validation for input with id 'input-id'
$('#form-id').yiiActiveForm('validateAttribute', 'other-input-id'); //this will triger validation for input with id 'other-input-id'

请注意函数yiiActiveForm()的第二个参数它不是选择器,它不是属性的名称,它是属性输入的id !!!

答案 8 :(得分:0)

试试这个

$("#form-id").data('yiiActiveForm').submitting = true; 
$("#form-id").yiiActiveForm('validate');

如果任何字段无效,它将显示验证错误。 此外,如果所有字段都经过验证,则它将提交请求