2015-06-06 45 views
3

我找不到Yii2以下方式提交数据:Yii2:如何验证表单与AJAX,然后使用AJAX再次

  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' => '[email protected]']) 
       ->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事件。

回答

3

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