]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Исправление ошибок
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 6 Oct 2025 14:19:35 +0000 (17:19 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 6 Oct 2025 14:19:35 +0000 (17:19 +0300)
erp24/controllers/MatrixErpPropertyController.php
erp24/views/matrix_erp_property/_form.php
erp24/web/js/matrix_erp_property/_form.js

index 6416705dbbbaa6e4621bdfb307814616657412ef..2602738b7c26718746cf5611a511a9dc2c19d56f 100644 (file)
@@ -151,8 +151,19 @@ class MatrixErpPropertyController extends Controller
                         // Получаем данные из формы
                         $loadDataMatrixErpMedia = ArrayHelper::getValue($postMatrixErpProperty, 'mediaFiles');
 
-                        // Ð¡Ð¾Ñ\80Ñ\82иÑ\80Ñ\83ем Ð´Ð°Ð½Ð½Ñ\8bе Ð¿Ð¾ foto_order Ð¿ÐµÑ\80ед Ð¾Ð±Ñ\80абоÑ\82кой
+                        // Ð¤Ð¸Ð»Ñ\8cÑ\82Ñ\80Ñ\83ем Ð¿Ñ\83Ñ\81Ñ\82Ñ\8bе Ð·Ð°Ð¿Ð¸Ñ\81и (Ñ\81озданнÑ\8bе MultipleInput Ð¿Ñ\80и Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ð¸ Ð½Ð¾Ð²Ñ\8bÑ\85 Ñ\81Ñ\82Ñ\80ок)
                         if (!empty($loadDataMatrixErpMedia)) {
+                            $loadDataMatrixErpMedia = array_filter($loadDataMatrixErpMedia, function($mediaData) {
+                                // Сохраняем запись если:
+                                // 1. Есть ID (существующая запись)
+                                // 2. Есть file_id (уже загруженный файл)
+                                // 3. Есть заполненное имя ИЛИ есть файл для загрузки в текущей сессии
+                                return !empty($mediaData['id']) ||
+                                       !empty($mediaData['file_id']) ||
+                                       (!empty($mediaData['name']) && trim($mediaData['name']) !== '');
+                            });
+
+                            // Сортируем данные по foto_order перед обработкой
                             usort($loadDataMatrixErpMedia, function($a, $b) {
                                 $orderA = $a['foto_order'] ?? 999;
                                 $orderB = $b['foto_order'] ?? 999;
@@ -164,17 +175,23 @@ class MatrixErpPropertyController extends Controller
                         $modelsMatrixErpMedia = [];
                         if (!empty($loadDataMatrixErpMedia)) {
                             foreach ($loadDataMatrixErpMedia as $index => $mediaData) {
+                                // Устанавливаем правильный foto_order для всех записей в соответствии с их позицией
+                                $fotoOrder = $index + 1;
+
                                 if (!empty($mediaData['id'])) {
                                     // Для существующих записей находим модель по ID
                                     $model = MatrixErpMedia::findOne($mediaData['id']);
                                     if ($model) {
                                         $model->load($mediaData, '');
+                                        $model->foto_order = $fotoOrder;
                                         $modelsMatrixErpMedia[] = $model;
                                     }
                                 } else {
                                     // Для новых записей создаем новую модель
                                     $model = new MatrixErpMedia();
                                     $model->load($mediaData, '');
+                                    // Устанавливаем foto_order в соответствии с позицией в отсортированном массиве
+                                    $model->foto_order = $fotoOrder;
                                     $modelsMatrixErpMedia[] = $model;
                                 }
                             }
@@ -222,12 +239,6 @@ class MatrixErpPropertyController extends Controller
                                 $modelMatrixErpMediaRow->created_admin_id = $adminId;
                                 $modelMatrixErpMediaRow->date = date("Y-m-d H:i:s");
                                 $modelMatrixErpMediaRow->created_at = date("Y-m-d H:i:s");
-
-                                // Устанавливаем foto_order - следующий доступный номер для этого guid
-                                $maxOrder = MatrixErpMedia::find()
-                                    ->where(['guid' => $modelEdit->guid])
-                                    ->max('foto_order') ?? 0;
-                                $modelMatrixErpMediaRow->foto_order = $maxOrder + 1;
                             }
                             if ($modelMatrixErpMediaRow->validate()) {
                                 if (empty($modelMatrixErpMediaRow->id)) {
index e4cc6ee0032aa031303742e434bb10b958230a08..52ad87046d5e009b8b937de5ce66e27933f2568a 100644 (file)
@@ -247,21 +247,4 @@ $this->registerJs(
 .sortable-handle:hover {
     background: #e9ecef !important;
 }
-</style>
-<script>
-    // Обработчик добавления новых элементов
-    $(document).on('multipleinput.afterAddRow', function(e, row) {
-        // Добавляем handle для нового элемента в первую ячейку
-        if (!$(row).find('.sortable-handle').length) {
-            $(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');
-        }
-        updateNumRowValues();
-    });
-
-    // Обработчик удаления элементов
-    $(document).on('multipleinput.afterRemoveRow', function(e) {
-        updateNumRowValues();
-    });
-
-</script>
\ No newline at end of file
+</style>
\ No newline at end of file
index 1deafb131589add370549a2b5ab35c986d0b572b..48b33c7354e23d2022bb8d1e750ae94589c0d8be 100644 (file)
@@ -73,11 +73,31 @@ $(document).ready(() => {
             initSortableMediaFiles();
         }, 100);
     });
+
+    // Обработчик добавления новых элементов
+    $(document).on('multipleinput.afterAddRow', function(_e, row) {
+        // Добавляем handle для нового элемента
+        addSortableHandleToRow(row);
+        updateNumRowValues();
+    });
+
+    // Обработчик удаления элементов
+    $(document).on('multipleinput.afterRemoveRow', function(_e) {
+        updateNumRowValues();
+    });
 });
 
 // Глобальная переменная для хранения экземпляра sortable
 let mediaSortableInstance = null;
 
+function addSortableHandleToRow(row) {
+    if (!$(row).find('.sortable-handle').length) {
+        // Добавляем 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');
+    }
+}
+
 function initSortableMediaFiles() {
     // Для таблиц MultipleInput нужно инициализировать sortable на tbody, а не на table
     let sortableContainer = document.querySelector('.multiple-input-list tbody');
@@ -107,38 +127,36 @@ function initSortableMediaFiles() {
 
         // Добавляем handle для перетаскивания к каждому элементу
         $('.multiple-input-list__item').each(function() {
-            if (!$(this).find('.sortable-handle').length) {
-                // Добавляем handle в первую ячейку строки
-                $(this).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>');
-                $(this).find('td:first').css('display', 'flex');
-            }
+            addSortableHandleToRow(this);
         });
     } else if (sortableContainer && mediaSortableInstance) {
         // Если sortable уже инициализирован, просто обновляем handles
         $('.multiple-input-list__item').each(function() {
-            if (!$(this).find('.sortable-handle').length) {
-                $(this).find('td:first').prepend('<div class="sortable-handle" style="cursor: move; padding: 5px; background: #f8f9fa; border-right: 1px solid #dee2e6; display: inline-block; vertical-align: top;"><i class="fa fa-bars"></i></div>');
-            }
+            addSortableHandleToRow(this);
         });
     }
 }
 
 function updateNumRowValues() {
     $('.multiple-input-list__item').each(function(index) {
-        // Ищем поле foto_order и устанавливаем порядок (начиная с 1)
+        // Ищем поле foto_order с более точным селектором
         let fotoOrderInput = $(this).find('input[name*="MatrixErpProperty[mediaFiles]"][name*="[foto_order]"]');
-        if (!fotoOrderInput.length) {
-            fotoOrderInput = $(this).find('input[name*="[foto_order]"]');
-        }
-        if (!fotoOrderInput.length) {
-            fotoOrderInput = $(this).find('input[type="hidden"][name*="foto_order"]');
-        }
 
         if (fotoOrderInput.length) {
             // Устанавливаем порядок начиная с 1
             const newOrder = index + 1;
             fotoOrderInput.val(newOrder);
             console.log('Set foto_order to', newOrder, 'for item', index);
+        } else {
+            // Если не нашли, попробуем более общий селектор
+            fotoOrderInput = $(this).find('input[name*="[foto_order]"]');
+            if (fotoOrderInput.length) {
+                const newOrder = index + 1;
+                fotoOrderInput.val(newOrder);
+                console.log('Set foto_order to', newOrder, 'for item', index, '(fallback selector)');
+            } else {
+                console.warn('foto_order input not found for item', index);
+            }
         }
     });