loveorigami / yii2-modal-ajax

A wrapper around Yii2 Bootstrap Modal for using an ActiveForm via AJAX inside.
MIT License
50 stars 29 forks source link

Не работает загрузка файлов в модальном окне #6

Closed webspec2012 closed 6 years ago

webspec2012 commented 6 years ago

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

loveorigami commented 6 years ago

Все верно, не отправляется. Потому что в Ajax файлы отправляются через "костыль" FormData...

https://stackoverflow.com/questions/5392344/sending-multipart-formdata-with-jquery-ajax

webspec2012 commented 6 years ago

Да, если применить, то всё работает, хотелось бы чтоб уже по дефолту рабатало =)

loveorigami commented 6 years ago

Я не силен в js. Напишите, как у вас получилось. И я добавлю в релиз.

webspec2012 commented 6 years ago

Я тоже не силен, поэтому сделал по дубовому:

/**
     * Adds event handlers to the form to check for submit
     */
    ModalAjax.prototype.formSubmit = function () {
        var form = jQuery(this.element).find('form');
        if (form.attr('method') !== 'GET' && window.FormData !== undefined) {

            // Convert form to ajax submit
            jQuery.ajax({
                method: form.attr('method'),
                url: form.attr('action'),
                data: new FormData(form[0]),
                processData: false,
                contentType: false,
                context: this,
                beforeSend: function (xhr, settings) {
                    jQuery(this.element).triggerHandler('kbModalBeforeSubmit', [xhr, settings]);
                },
                success: function (data, status, xhr) {
                    var contentType = xhr.getResponseHeader('content-type') || '';
                    if (contentType.indexOf('html') > -1) {
                        // Assume form contains errors if html
                        this.injectHtml(data);
                        status = false;
                    }
                    jQuery(this.element).triggerHandler('kbModalSubmit', [data, status, xhr, this.selector]);
                }
            });
        } else {
            // Convert form to ajax submit
            jQuery.ajax({
                method: form.attr('method'),
                url: form.attr('action'),
                data: form.serialize(),
                context: this,
                beforeSend: function (xhr, settings) {
                    jQuery(this.element).triggerHandler('kbModalBeforeSubmit', [xhr, settings]);
                },
                success: function (data, status, xhr) {
                    var contentType = xhr.getResponseHeader('content-type') || '';
                    if (contentType.indexOf('html') > -1) {
                        // Assume form contains errors if html
                        this.injectHtml(data);
                        status = false;
                    }
                    jQuery(this.element).triggerHandler('kbModalSubmit', [data, status, xhr, this.selector]);
                }
            });
        }

        return false;
    };
loveorigami commented 6 years ago

Ок, спасибо. Потестирую )