// Получаем данные из формы
$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;
$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;
}
}
$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)) {
.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
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');
// Добавляем 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);
+ }
}
});