Тема Debut, вероятно, изменилась с момента загрузки этого учебника, и поскольку она не поддерживается, вероятно, не будет обновлена.
Если вы добавите вход type="text"
вместо type="file"
, свойство добавляется как ожидалось. Это происходит потому, что функция _initAddToCart
(assets/theme.js
строка 6447) получает элемент формы HTML и передает его другой функции.
var $data = $(this.selectors.productForm, this.$container);
this._addItemToCart($data);
Затем в функции _addItemToCart
(assets/theme.js
строка 6513), форма сериализована в строку:
var params = {
url: '/cart/add.js',
data: $(data).serialize(),
dataType: 'json',
};
$.post(params).done(...
Эта функция будет игнорировать входные данные файла, как описано в документации jQuery:
Data from file select elements is not serialized.
Для отправки файла можно использовать API браузера FormData . Но чтобы использовать его с вызовом jQuery AJAX, необходимо установить некоторые свойства :
var params = {
url: '/cart/add.js',
// data: $(data).serialize(),
dataType: 'json',
// Disable the jQuery data processing, and send the FormData object
contentType: false,
processData: false,
data: new FormData($(data).get()[0])
};
$.post(params).done(...
Однако, поскольку файл HTML <input>
имеет name="properties[Photo]"
, только последний из загруженных файлов будет добавлен в свойство Photo
элемента корзины. Я пробовал с name="properties[Photo][]"
, но вызов cart/add.js
возвращает только ошибку 500 с сообщением «Внутренняя ошибка сервера».
Таким образом, чтобы загрузить несколько файлов, вы можете добавить собственный код в функцию _addItemToCart
, чтобы получить каждый файл из <input>
и , добавить к FormData с различным ключом для каждого файла.