Допустим есть элементы какой-то группы, которые хранятся в БД. В таблице есть поле sort_index, по которому выполняется сортировка при выводе данных.
Собственно вопрос: Как лучше организовать механизм сортировки? Сейчас дляэтого используется метод sorting($index = 0), который в качестве параметра принимает желаемый индекс. Но для пользователя это кажется не совсем удобным т.к. приходится вычислять индекс желаемой позиции, (что не совсем логично и заставляет пользователя задумываться о реализации сортировки и понимать принцип ее работы) например:
$prev_id = $request->getParam('prev_id');
$item;
$prev_el = Item_Model::find($prev_id);
$item->sorting($prev_el->sort_index + 1);
Как я это вижу: у элемента есть метод, например, placeAfter, в качестве параметра ему передается элемент, после которого хотим поместить этот:
$item->placeAfter(Item_Model::find($prev_id));
У кого какие мнения на этот счет. Может оба эти варианта не удачны, и у вас свое видение решения задачи?
Valick
12.01.2013 - 14:58
вашпе ничего не понятно
давайте для начала выясним, что из себя представляет поле sort_index, тип и формат.
_____________
Стимулятор ~yoomoney - 41001303250491
Valick,
sort_index - integer, по которому выполняется сортировка:
select * from items order by sort_index
но это не важно, интересует как по вашему удобно выполнять сортировку. Т.е. абстрагироваться от самого механизма, а лишь сказать как хотелось бы.
Valick
12.01.2013 - 15:29
для того чтобы абстрагироваться от самого механизма, надо знать от чего абстрагироваться
вас интересует как оформить ссылку с GET параметром?
_____________
Стимулятор ~yoomoney - 41001303250491
Цитата |
вас интересует как оформить ссылку с GET параметром? |
нет, это уже следствие.
Например, %some_user%: "Я считаю, что удобно передавать элемент после которого нужно расположить текущий. вот так: $item->placeAfter($prevItem)"
тогда можно будет сортировать элементы так: index/?item_id=100&prev_item_id=8000.
Valick
12.01.2013 - 16:05
Цитата |
тогда можно будет сортировать элементы так: index/?item_id=100&prev_item_id=8000 |
это точно сортировка? похоже на выборку от 100 до 8000
или 8000 записей с шагом 100?
или 100 записей с шагом 8000?
или еще что...
сорь, сегодня я не экстрасенс, ночь трудная была
_____________
Стимулятор ~yoomoney - 41001303250491
Игорь_Vasinsky
12.01.2013 - 16:12
наверн это значит
поставить элемент с id=100 перед элементом у которого позиция 8000
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
что то я как-то хреново изъясняюсь...
Есть таблица в в которой хранятся, например, товары. На страницах сайта они выводятся отсортированными по sort_index (select * from items order by sort_index). В админке есть возможность сортировки товаров (изменение значения sort_index), например, так
http://jqueryui.com/sortable/. На пхп это выглядит так:
$prev_id = $request->getParam('prev_id');
$item;
$prev_el = Item_Model::find($prev_id);
$item->sorting($prev_el->sort_index + 1);
, что как я уже говорил, не совсем удобно (нужно знать, что для сортировки используется поле sort_index и т.д.). Как вариант можно определить метод, который принимает в качестве параметра предыдущий элемент и устанавливает нужный sort_index для текущего товара, и пересчитывает sort_index для всех остальных товаров, участвующих в операции (находятся до/после prev_item).
Пока писал понял, что это скорее всего самый оптимальный вариант
Цитата |
наверн это значит
поставить элемент с id=100 перед элементом у которого позиция 8000 |
у которого ид 8000
Игорь_Vasinsky
12.01.2013 - 16:24
id | sort_index
1 | 1
2 | 2
3 | 3
4 | 4
5 | 5
6 | 6
7 | 7
8 | 8
9 | 9
10 | 10
ну захотел ты переместить элемент с id=3 с позицией 3 на позицию 2
следо-но id=3 должен стать на позицию 2 - а все последующие двинуться на + 1 - так?
или по твоей задумке тупо с 3 на 2 меняется, а 2 на 3? как то не очень
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
tomash
12.01.2013 - 16:41
Можно сделать таблицу вида id, prev_id, next_id
тогда при добавлении или смене места товара не нужно обновлять все записи
собственно сортировать при выборке нужно по next_id, также можно получать список вверх или вниз от определенного идшника
_____________
Чтобы понять, что такое рекурсия - нужно понять, что такое рекурсия.
tomash
12.01.2013 - 16:43
при вставке, удалении нужно провести инсерт и два апдейта. При перемещении по-моему 5 апдейтов(количество записей проадейтить)
_____________
Чтобы понять, что такое рекурсия - нужно понять, что такое рекурсия.
id | sort_index
1 | 1
2 | 2
3 | 3
4 | 4
5 | 5
6 | 6
7 | 7
8 | 8
9 | 9
10 | 10
например, нужно 5 поставить после 2
Для этого элементам с sort_index от 3 до 4 делаем sort_index = sort_index+1а элементу 5 sort_index = 3
tomash
12.01.2013 - 17:06
kaww
т.е. если я переставлю 1000 елемент на первое место мне придется проапдейтить 1000 записей?
_____________
Чтобы понять, что такое рекурсия - нужно понять, что такое рекурсия.
tomash,
да, но это ведь не так уж и страшно и всего один запрос
update sort_index = sort_index+1 where sort_index > 'min' and sort_index < 'max'
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.