Yii2:如何使用 AJAX 验证表单,然后再次使用 AJAX 提交数据

Yii2: How to validate a form with AJAX and then submit the data using AJAX again

我无法在 Yii2 中找到以下方法:

  1. 首先通过 AJAX 验证我的表单,因为我有一个 UNIQUE 字段。
  2. 然后,如果验证正确,则通过 AJAX 将表单数据提交到表单操作。

这是我目前得到的:

在我看来:

<?php
        $form = ActiveForm::begin([
            'id' => 'subscribe-form',
            'action' => ['site/subscribe'],
            'validationUrl' => ['site/validate-subscribe'],
            'validateOnSubmit' => true,
            'enableAjaxValidation' => true,
        ]) ?>
        <?= $form->field($model, 'name')->input('text', ['class' => 'w-input']) ?>
        <?= $form->field($model, 'email')->input('text', ['class' => 'w-input']) ?>

        <div class="form-group">
            <?= Html::submitButton('SUSCRIBIRSE', ['class' => 'w-inline-block btn', 'name' => 'login-button']) ?>
        </div>
        <?php ActiveForm::end() ?>

在我的控制器中:

public function actionValidateSubscribe(){
    if (Yii::$app->request->isAjax) {
        Yii::$app->response->format = Response::FORMAT_JSON;

        $model = new Subscription(Yii::$app->getRequest()->getBodyParams()['Subscription']);

        if (!$model->validate()) {
            return ActiveForm::validate($model);
        }
    }
}

public function actionSubscribe()
{

    if (Yii::$app->request->isAjax) {
        Yii::$app->response->format = Response::FORMAT_JSON;

        $model = new Subscription(Yii::$app->getRequest()->getBodyParams()['Subscription']);

        if(!$model->validate()){
            throw new NotAcceptableHttpException('Tiene errores de validación en la forma');
        }



        if($model->save()){
            Yii::$app->mailer->compose('subscription', ['model'=>$model])
                ->setTo([$model->name => $model->email])
                ->setFrom(['Test' => 'info@test.com'])
                ->setSubject('Por favor confirme su suscripción')
                ->send();
        }

        $response = [
            'data'=>$model->getAttributes(),
            'success'=>'true'
        ];
        return $response;
    }
}

在我的 JS 中:

$(document).ready(function () {
$('body').on('beforeSubmit', 'form#subscribe-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) {
            // do something with response
        },
        error  : function () {

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

问题是,当我在 ActiveForm 中将 "enableAjaxValidation" 设置为 true 时,yii.ActiveForm.js 没有触发 afterVAlidate 或 beforeSubmit 事件。

尝试$('form#subscribe-form').on('beforeSubmit', function () {...});