Yii2: Как проверить форму с помощью AJAX и затем снова отправить данные с помощью AJAX
Я не могу найти способ в Yii2 для следующего:
- Сначала проверьте мою форму через AJAX, потому что у меня есть уникальное поле.
- Затем, если проверка правильна, отправьте данные формы в действие формы через 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 () {...});