2015-07-14 17 views
12

Obecnie można przesłać i zatwierdzić ajax jednocześnie. Używam funkcji niestandardowej jak:Yii2 activeform ajax przesyłanie i sprawdzanie poprawności

$('.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"); 
      } 
     }); 

    }); 

A tutaj jest strona php, do walidacji mój config wygląda tak:

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

Jestem pewien, że to nie jest najlepszy sposób, aby osiągnąć to, co ja potrzeba. Zwłaszcza ta część, której używam do zapobiegania przesyłaniu w przypadku błędu sprawdzania oryginalności:

if (form.find('.has-error').length) { 
     return false; 
    } 

Jakieś sugestie? Jak poprawnie wykonać zgłoszenie i walidację ajaxu przy użyciu wbudowanych ustawień Yii 2?

+0

spróbuj 'enableAjaxValidation' => true –

Odpowiedz

15

Zastosowanie beforeSubmit wydarzenie zamiast złożyć The beforeSubmit zostanie uruchomiony tylko wtedy, gdy forma przechodzi walidację.

$('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(); 
}); 
+1

Wygląda na to, że działa tylko w przypadku sprawdzania poprawności, ale nie w przypadku sprawdzania poprawności niestandardowej. – stfsngue

8

można użyć AjaxSubmitButton.

Formularz powinien b

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

użytkowania AjaxSubmitButton tutaj

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(); 

W kontrolerze

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; 
    } 
} 
+0

'AjaxSubmitButton' nie jest dostępny w Yii2. Czy mógłbyś podać informacje o bibliotece, które wykorzystałeś do tego? –

+1

https://packagist.org/packages/demogorgorn/yii2-ajax-submit-button użyj tego linku dla AjaxSubmitButton w Yii2 – Dhara

2

Here mam znaleźć kilka ciekawych sztuczek javascript po stronie walidacji

Więc javascript przedłożyć przycisk może być tak:

$('body').on('click', '#submit', function(e) { 
    e.preventDefault(); 
    var yiiform = $('#my-form'); 
    $.ajax({ 
    type: yiiform.attr('method'), 
     url: yiiform.attr('action'), 
     data: yiiform.serializeArray(), 
     success: function(data) { 
     if(data.success == 'true') { 
      window.location.href = 'http://my.success.page'; 
     } else { 
      // here there is (maybe) the right way to trigger errors 
      $.each(data, function(key, val) { 
      yiiform.yiiActiveForm('updateAttribute', key, [val]); 
      }); 
     } 
     } 
    }); 
} 

wyzwalane przez:

<?= Button::widget([ 
    'label' => Yii::t('app', 'Submit'), 
    'options' => [ 
     'id'=>'submit', 
     'class' => 'btn btn-primary pull-right', 
    ]]);?> 

a kontroler działanie odpowie:

... 
if ($model->load(Yii::$app->request->post())) { 
    Yii::$app->response->format = Response::FORMAT_JSON; 
    if($model->save()) { 
     return ['success'=>'true']; 
    } else { 
     return ActiveForm::validate($model); 
    } 
} 
... 

szczegółów na temat ActiveForm: : validate() można znaleźć here

Powiązane problemy