From: Vladimir Fomichev Date: Mon, 6 Oct 2025 14:19:35 +0000 (+0300) Subject: Исправление ошибок X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=526ebf5b694eecf14332adeebd21ceb7c2942f96;p=erp24_rep%2Fyii-erp24%2F.git Исправление ошибок --- diff --git a/erp24/controllers/MatrixErpPropertyController.php b/erp24/controllers/MatrixErpPropertyController.php index 6416705d..2602738b 100644 --- a/erp24/controllers/MatrixErpPropertyController.php +++ b/erp24/controllers/MatrixErpPropertyController.php @@ -151,8 +151,19 @@ class MatrixErpPropertyController extends Controller // Получаем данные из формы $loadDataMatrixErpMedia = ArrayHelper::getValue($postMatrixErpProperty, 'mediaFiles'); - // Сортируем данные по foto_order перед обработкой + // Фильтруем пустые записи (созданные MultipleInput при добавлении новых строк) 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)) { diff --git a/erp24/views/matrix_erp_property/_form.php b/erp24/views/matrix_erp_property/_form.php index e4cc6ee0..52ad8704 100644 --- a/erp24/views/matrix_erp_property/_form.php +++ b/erp24/views/matrix_erp_property/_form.php @@ -247,21 +247,4 @@ $this->registerJs( .sortable-handle:hover { background: #e9ecef !important; } - - \ No newline at end of file + \ No newline at end of file diff --git a/erp24/web/js/matrix_erp_property/_form.js b/erp24/web/js/matrix_erp_property/_form.js index 1deafb13..48b33c73 100644 --- a/erp24/web/js/matrix_erp_property/_form.js +++ b/erp24/web/js/matrix_erp_property/_form.js @@ -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('
'); + $(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('
'); - $(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('
'); - } + 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); + } } });