2015-07-14 13 views
12

वर्तमान में AJAX सबमिट और सत्यापन को एक ही समय में प्राप्त करने के लिए। मैं की तरह कस्टम समारोह का उपयोग कर रहा:Yii2 activeform AJAX सबमिट और सत्यापन

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

    }); 

और यहाँ php ओर, सत्यापन के लिए मेरी config कि ऐसा दिखता है:

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

मुझे यकीन है कि यह सबसे अच्छा तरीका है क्या हासिल करना नहीं है कर रहा हूँ मैं जरुरत। विशेष रूप से यह हिस्सा जिसे मैं सत्यापन त्रुटि के मामले में जमा करने से रोकने के लिए उपयोग करता हूं:

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

कोई सुझाव? Yii 2 की अंतर्निहित सेटिंग्स का उपयोग करके AJAX सबमिशन और सत्यापन को सही ढंग से कैसे प्राप्त करें?

+0

'enableAjaxValidation' => true –

उत्तर

15

उपयोग beforeSubmitके बजाय घटना सबमिट करते हैं, beforeSubmit केवल एक बार फ़ॉर्म सत्यापन गुजरता ट्रिगर किया जाएगा।

$('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

आज़माएं, यह केवल मूल प्रमाणीकरण के लिए काम कर रहा है, लेकिन कस्टम सत्यापन के लिए नहीं। – stfsngue

8

आप AjaxSubmitButton का उपयोग कर सकते हैं।

आपका प्रपत्र ख चाहिए

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

उपयोग AjaxSubmitButton यहाँ

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

अपने नियंत्रक में

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' yii2 में उपलब्ध नहीं है। क्या आप कृपया लाइब्रेरी जानकारी प्रदान कर सकते हैं जिसे आपने इसे जोड़ने के लिए उपयोग किया था! –

+1

https://packagist.org/packages/demogorgorn/yii2-ajax-submit-button Yii2 में AjaxSubmitButton के लिए इस लिंक का उपयोग करें – Dhara

2

Here मैं कुछ रोचक जावास्क्रिप्ट-साइड सत्यापन चाल को खोजने है

तो, एक जावास्क्रिप्ट सबमिट बटन पर हो सकता है के रूप में:

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

से शुरू हो रहा:

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

और कार्रवाई नियंत्रक के साथ जवाब देगा:

... 
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); 
    } 
} 
... 

ActiveForm के बारे में विवरण: : मान्य() पाया जा सकता है here

संबंधित मुद्दे