]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Добавление новых файлов feature_fomichev_erp-473_matrix_erp_feed_image_order
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 6 Oct 2025 14:30:16 +0000 (17:30 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 6 Oct 2025 14:30:16 +0000 (17:30 +0300)
erp24/controllers/MatrixErpPropertyController.php
erp24/web/js/matrix_erp_property/_form.js

index 2602738b7c26718746cf5611a511a9dc2c19d56f..aed15c8498e816f422832ebe01e617f96df0fc2a 100644 (file)
@@ -153,15 +153,27 @@ class MatrixErpPropertyController extends Controller
 
                         // Фильтруем пустые записи (созданные 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) {
index 48b33c7354e23d2022bb8d1e750ae94589c0d8be..2d46b67188fd6457663996597f898a104cca2962 100644 (file)
@@ -76,11 +76,48 @@ $(document).ready(() => {
 
     // Обработчик добавления новых элементов
     $(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();
@@ -91,10 +128,14 @@ $(document).ready(() => {
 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');
     }
 }
 
@@ -159,15 +200,5 @@ function updateNumRowValues() {
             }
         }
     });
-
-    // Обновляем основную картинку на первую в новом порядке
-    updateMainImageFromFirstFile();
-}
-
-function updateMainImageFromFirstFile() {
-    // Основная картинка обновляется автоматически на сервере
-    // после сохранения формы в методе updateMainImageFromFirstMedia
-    // Здесь ничего не делаем - сервер сам обработает обновление
-    console.log('Main image will be updated on server side');
 }