Я сделал такую сортировку в списке продуктов OpenCart (пользовательский дизайн бэкенда)
Порядок сортировки был дополнительным столбцом order INT(11)
в базе данных
У нас было 3 поля ввода: up
/ down
/ custom
Где custom
был выпадающий список всех индексов от 1
до max-items
.
Все входы одинаковы:
Возьмите новое значение order
и сдвиньте все элементы, кроме себя. Сдвиг вверх или вниз зависит от того, перемещаете ли вы элемент вперед или назад от текущей позиции
UPDATE order FROM products SET order = :newOrder WHERE id = :currentItemId
if ($newOrder > $oldOrder)
UPDATE order FROM products SET order + 1 WHERE order >= :newOrder AND id != :currentItemId
else
UPDATE order FROM products SET order - 1 WHERE order <= :newOrder AND id != :currentItemId
При вставке выполняется то же обновление, только первый запрос становится INSERT INTO
Чтобы избавиться от безобразного обновления sh страницы при каждом действии, мы выполняем Ajax запросов и пересортируем DOM с jQuery