// Фильтруем пустые записи (созданные MultipleInput при добавлении новых строк)
if (!empty($loadDataMatrixErpMedia)) {
- $loadDataMatrixErpMedia = array_filter($loadDataMatrixErpMedia, function($mediaData) {
+ // Сначала проверяем, есть ли файлы для загрузки
+ $filesToUpload = [];
+ if (isset($_FILES['MatrixErpProperty']['name']['mediaFiles'])) {
+ foreach ($_FILES['MatrixErpProperty']['name']['mediaFiles'] as $index => $fileData) {
+ if (!empty($fileData['mediaFile'])) {
+ $filesToUpload[$index] = true;
+ }
+ }
+ }
+
+ $loadDataMatrixErpMedia = array_filter($loadDataMatrixErpMedia, function($mediaData, $index) use ($filesToUpload) {
// Сохраняем запись если:
// 1. Есть ID (существующая запись)
// 2. Есть file_id (уже загруженный файл)
- // 3. Есть заполненное имя ИЛИ есть файл для загрузки в текущей сессии
+ // 3. Есть заполненное имя
+ // 4. Есть файл для загрузки в текущей сессии
return !empty($mediaData['id']) ||
!empty($mediaData['file_id']) ||
- (!empty($mediaData['name']) && trim($mediaData['name']) !== '');
- });
+ (!empty($mediaData['name']) && trim($mediaData['name']) !== '') ||
+ isset($filesToUpload[$index]);
+ }, ARRAY_FILTER_USE_BOTH);
// Сортируем данные по foto_order перед обработкой
usort($loadDataMatrixErpMedia, function($a, $b) {
// Обработчик добавления новых элементов
$(document).on('multipleinput.afterAddRow', function(_e, row) {
+ console.log('multipleinput.afterAddRow triggered for row:', row);
// Добавляем handle для нового элемента
addSortableHandleToRow(row);
updateNumRowValues();
});
+ // Дополнительный обработчик для кнопки добавления (любая кнопка с текстом содержащим '+')
+ $(document).on('click', 'button:contains("+")', function() {
+ console.log('Add button clicked (generic selector)');
+ // Даем время на добавление строки в DOM
+ setTimeout(function() {
+ $('.multiple-input-list__item').each(function() {
+ addSortableHandleToRow(this);
+ });
+ updateNumRowValues();
+ }, 100);
+ });
+
+ // Также отслеживаем изменения в DOM для надежности
+ const observer = new MutationObserver(function(mutations) {
+ mutations.forEach(function(mutation) {
+ if (mutation.type === 'childList') {
+ mutation.addedNodes.forEach(function(node) {
+ if (node.nodeType === 1 && node.classList && node.classList.contains('multiple-input-list__item')) {
+ console.log('New row detected via MutationObserver');
+ addSortableHandleToRow(node);
+ updateNumRowValues();
+ }
+ });
+ }
+ });
+ });
+
+ // Начинаем наблюдение после инициализации
+ setTimeout(function() {
+ const container = document.querySelector('.multiple-input-list');
+ if (container) {
+ observer.observe(container, { childList: true, subtree: true });
+ console.log('MutationObserver started');
+ }
+ }, 500);
+
// Обработчик удаления элементов
$(document).on('multipleinput.afterRemoveRow', function(_e) {
updateNumRowValues();
let mediaSortableInstance = null;
function addSortableHandleToRow(row) {
+ console.log('addSortableHandleToRow called for row:', row);
if (!$(row).find('.sortable-handle').length) {
+ console.log('Adding sortable handle to row');
// Добавляем handle в первую ячейку строки
$(row).find('td:first').prepend('<div class="sortable-handle" style="cursor: move; padding: 5px; background: #f8f9fa; border-right: 1px solid #dee2e6; display: inline-block; margin-right: 10px; vertical-align: top;"><i class="fa fa-bars"></i></div>');
$(row).find('td:first').css('display', 'flex');
+ } else {
+ console.log('Sortable handle already exists in row');
}
}
}
}
});
-
- // Обновляем основную картинку на первую в новом порядке
- updateMainImageFromFirstFile();
-}
-
-function updateMainImageFromFirstFile() {
- // Основная картинка обновляется автоматически на сервере
- // после сохранения формы в методе updateMainImageFromFirstMedia
- // Здесь ничего не делаем - сервер сам обработает обновление
- console.log('Main image will be updated on server side');
}