Есть стандартный виджет форм, через который реализована загрузка файла и стандартная проблема с двойной отправкой.
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;
});
}