Yii2 activeform ajax提交和验证

her*_*ron 12 javascript php ajax yii2 active-form

目前同时实现ajax提交和验证.我正在使用自定义功能:

    $('.edit_form').submit(function (e) {
        e.preventDefault();
        var form = $(this);
        var formData = $(this).serialize();
        if (form.find('.has-error').length) {
            return false;
        }

        $.ajax({
            url: form.attr("action"),
            type: form.attr("method"),
            data: formData,
            success: function (data) {
                 ...
            },
            error: function () {
                alert("Something went wrong");
            }
        });

    });
Run Code Online (Sandbox Code Playgroud)

这里是php端,为了验证我的配置看起来像这样:

$form = ActiveForm::begin([
    'id' => "some_form",
    'action' => ['user/edit'],
    'options' => ['class' => 'edit_form'],
    'enableAjaxValidation' => false,
    'enableClientValidation' => true,
]); ?>
Run Code Online (Sandbox Code Playgroud)

我敢肯定,这不是达到我需要的最佳方式.特别是我用于在验证错误的情况下阻止提交的这部分:

    if (form.find('.has-error').length) {
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

有什么建议?如何使用Yii 2的内置设置正确实现ajax提交和验证?

Nad*_*der 16

使用beforeSubmit事件而不是submit, 只有在表单通过验证后才会触发beforeSubmit.

$('form').on('beforeSubmit', function(e) {
    var form = $(this);
    var formData = form.serialize();
    $.ajax({
        url: form.attr("action"),
        type: form.attr("method"),
        data: formData,
        success: function (data) {
             ...
        },
        error: function () {
            alert("Something went wrong");
        }
    });
}).on('submit', function(e){
    e.preventDefault();
});
Run Code Online (Sandbox Code Playgroud)


Dha*_*ara 10

你可以使用AjaxSubmitButton.

你的表格应该是b

$form = ActiveForm::begin([
    'id' => "some_form",
    'action' => 'javascript:void(0)',
    'options' => ['class' => 'edit_form'],
]);
Run Code Online (Sandbox Code Playgroud)

在这里使用AjaxSubmitButton

AjaxSubmitButton::begin([
                                'label' => 'Submit',
                                'id' => 'some_form',
                                'ajaxOptions' => [
                                    'type' => 'POST',
                                    'url' => \yii\helpers\Url::to(['/user/edit']),
                                    'success' => new \yii\web\JsExpression(
                                            'function(data){
                                                if(data=="success")
                                                    {
                                                    }else{
                                                        $.each(data, function(key, val) {
                                                            $("#"+key).after("<div class=\"help-block\">"+val+"</div>");
                                                            $("#"+key).closest(".form-group").addClass("has-error");
                                                        });
                                                    }
                                                }'
                                    ),
                                ],
                                'options' => ['class' => 'btn btn-success', 'type' => 'submit'],
                            ]);
                            AjaxSubmitButton::end(); 
Run Code Online (Sandbox Code Playgroud)

在你的控制器中

public function actionEdit()
{
     $model = new User;
     if($model->save())
     {
        $result = 'success';
        Yii::$app->response->format = trim(Response::FORMAT_JSON);
                return $result;
     }else{
         $error = \yii\widgets\ActiveForm::validate($model);
                Yii::$app->response->format = trim(Response::FORMAT_JSON);
                return $error; 
     }
}
Run Code Online (Sandbox Code Playgroud)

  • https://packagist.org/packages/demogorgorn/yii2-ajax-submit-button在Yii2中将此链接用于AjaxSubmitButton (2认同)