diff --git a/modules/backend/formwidgets/Relation.php b/modules/backend/formwidgets/Relation.php index 0812379a6..27f8259a0 100644 --- a/modules/backend/formwidgets/Relation.php +++ b/modules/backend/formwidgets/Relation.php @@ -143,7 +143,6 @@ class Relation extends FormWidgetBase $result = $query->getQuery()->get(); } - // Some simpler relations can specify a custom local or foreign "other" key, // which can be detected and implemented here automagically. $primaryKeyName = in_array($relationType, ['hasMany', 'belongsTo', 'hasOne']) diff --git a/modules/system/assets/js/framework.js b/modules/system/assets/js/framework.js index d1fd1ff2b..e479731b5 100644 --- a/modules/system/assets/js/framework.js +++ b/modules/system/assets/js/framework.js @@ -41,34 +41,23 @@ if (window.jQuery.request !== undefined) { $triggerEl.trigger(_event, context) if (_event.isDefaultPrevented()) return - var data = {}, - loading = options.loading !== undefined ? options.loading : null, + var loading = options.loading !== undefined ? options.loading : null, isRedirect = options.redirect !== undefined && options.redirect.length, useFlash = options.flash !== undefined, useFiles = options.files !== undefined if (useFiles && typeof FormData === 'undefined') { console.warn('This browser does not support file uploads via FormData') - } - - $.each($el.parents('[data-request-data]').toArray().reverse(), function extendRequest() { - $.extend(data, paramToObj('data-request-data', $(this).data('request-data'))) - }) - - if ($el.is(':input') && !$form.length) { - var inputName = $el.attr('name') - if (inputName !== undefined && options.data[inputName] === undefined) - options.data[inputName] = $el.val() - } - - if (options.data !== undefined && !$.isEmptyObject(options.data)) { - $.extend(data, options.data) + useFiles = false } if ($.type(loading) == 'string') { loading = $(loading) } + /* + * Request headers + */ var requestHeaders = { 'X-OCTOBER-REQUEST-HANDLER': handler, 'X-OCTOBER-REQUEST-PARTIALS': this.extractPartials(options.update) @@ -78,6 +67,52 @@ if (window.jQuery.request !== undefined) { requestHeaders['X-OCTOBER-REQUEST-FLASH'] = 1 } + /* + * Request data + */ + var requestData, + inputName, + data = {} + + $.each($el.parents('[data-request-data]').toArray().reverse(), function extendRequest() { + $.extend(data, paramToObj('data-request-data', $(this).data('request-data'))) + }) + + if (options.data !== undefined && !$.isEmptyObject(options.data)) { + $.extend(data, options.data) + } + + if ($el.is(':input') && !$form.length) { + inputName = $el.attr('name') + if (inputName !== undefined && options.data[inputName] === undefined) { + data[inputName] = $el.val() + } + } + + if (useFiles) { + requestData = new FormData($form.length ? $form.get(0) : null) + + if ($el.is(':file') && inputName) { + $.each($el.prop('files'), function() { + requestData.append(inputName, this) + }) + + delete data[inputName] + } + + $.each(data, function(key) { + requestData.append(key, this) + }) + } + else { + requestData = $form.serialize() + if (requestData) requestData = requestData + '&' + if (!$.isEmptyObject(data)) requestData += $.param(data) + } + + /* + * Request options + */ var requestOptions = { url: window.location.href, crossDomain: false, @@ -304,24 +339,9 @@ if (window.jQuery.request !== undefined) { } } - /* - * Prepare request data - */ - var requestData - if (useFiles && typeof FormData !== 'undefined') { - requestData = new FormData($form.length ? $form.get(0) : null) - - $.each(data, function(key) { - requestData.append(key, this) - }) - + if (useFiles) { requestOptions.processData = requestOptions.contentType = false } - else { - requestData = $form.serialize() - if (requestData) requestData = requestData + '&' - if (!$.isEmptyObject(data)) requestData += $.param(data) - } /* * Allow default business logic to be called from user functions @@ -440,7 +460,7 @@ if (window.jQuery.request !== undefined) { } } - $(document).on('change', 'select[data-request], input[type=radio][data-request], input[type=checkbox][data-request]', function documentOnChange() { + $(document).on('change', 'select[data-request], input[type=radio][data-request], input[type=checkbox][data-request], input[type=file][data-request]', function documentOnChange() { $(this).request() })