Yii2: Как проверить форму с помощью AJAX и затем снова отправить данные с помощью AJAX

Я не могу найти способ в Yii2 для следующего:

  1. Сначала проверьте мою форму через AJAX, потому что у меня есть уникальное поле.
  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;
});
});

Проблема в том, что yii.ActiveForm.js не вызывает события afterVAlidate или beforeSubmit, когда я устанавливаю "enableAjaxValidation" в true в моей ActiveForm.

1 ответ

Пытаться $('form#subscribe-form').on('beforeSubmit', function () {...});

Другие вопросы по тегам