Бортовой журнал Ктулху

Предотвращение двойной отправки формы загрузки файла в Yii2

Есть стандартный виджет форм, через который реализована загрузка файла и стандартная проблема с двойной отправкой.

 

PHP

$form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data'],'id' => 'upload','action' => "url"]);
echo $form->field($model, 'var1')->hiddenInput([])->label(false);
echo $contacts_upload_form->field($contacts, 'file')->fileInput(['class' => 'file'])->label(false);
echo Html::submitButton('<i class="glyphicon glyphicon-floppy-disk"></i> Сохранить', []);
ActiveForm::end();

JS

В такой ситуации нужно использовать именно events из js библиотеки ActiveForm.

$('form#upload').on('beforeSubmit', function (e) {
        e.preventDefault();
        var form = e.target;
        var formdata = new FormData(form);
        $.ajax({
            url: 'url',
            method: form.method,
            processData: false,
            contentType: false,
            async: false,
            type: 'post',
            dataType: 'json',
            data: formdata,
            success: function (data) {               
            },
            error: function (data) {               
            }
        });
        return false;
    });

Список доступных событий:

beforeValidate.

afterValidate.

beforeValidateAttribute.

afterValidateAttribute.

beforeSubmit.

ajaxBeforeSend.

ajaxComplete.

Прочитать о них можно здесь.

Так вот, пример, как будет отрабатывать только один раз:

function someFunc(e) {
 e.preventDefault();
 var $form = $('#someForm');
 $form.on('beforeSubmit', function() {
  var data = $form.serialize();
  $.ajax({
    url: $form.attr('action'),
    type: 'POST',
    data: data,
success: function (data) {
},
error: function(jqXHR, errMsg) {
}
});
return false;
});
}