yii-treemp - поведение AcriveRecord работы с деревом
yii-treemp - поведение AcriveRecord работы с деревом
Здравствуйте...
Недавно потребовалось сделать возможность работы с деревом. Среди алгоритмов-структур подметил "Вложенное множество" и "Материализованный путь". Вложенное множество как вы знаете грустный алгоритм в плане вставки. Материализованный путь будет получше на смешанных операциях. В общем мне нужен был материализованный путь и к сожалению нормальной реализации я не нашел, было что-то совсем невнятное.
Пришлось сделать свою версию. Встречайте:
http://www.yiiframework.com/extension/y ... -behavior/
Я старался написать расширение добротно и покрыл его тестами. Если хотите что-то добавить, то можете не париться что-нибудь сломать, скорее всего тесты это отловят.
Спасибо за внимание.
Недавно потребовалось сделать возможность работы с деревом. Среди алгоритмов-структур подметил "Вложенное множество" и "Материализованный путь". Вложенное множество как вы знаете грустный алгоритм в плане вставки. Материализованный путь будет получше на смешанных операциях. В общем мне нужен был материализованный путь и к сожалению нормальной реализации я не нашел, было что-то совсем невнятное.
Пришлось сделать свою версию. Встречайте:
http://www.yiiframework.com/extension/y ... -behavior/
Я старался написать расширение добротно и покрыл его тестами. Если хотите что-то добавить, то можете не париться что-нибудь сломать, скорее всего тесты это отловят.
Спасибо за внимание.
Re: yii-treemp - поведение AcriveRecord работы с деревом
Здравствуйте. Выпустил вторую v2.0.1 версию библиотеки, многое отрефакторил. Добавил демо. Добавил виджетов. Улучил скорость. Покрытие тестами сделал выше. Сделал русскую и английскую документацию.
Если требуется решить задачу с хранением дерева. Добро пожаловать.
Релиз для Yii1 последний. Далее буду портировать на Yii2
Если требуется решить задачу с хранением дерева. Добро пожаловать.
Релиз для Yii1 последний. Далее буду портировать на Yii2
-
- Сообщения: 977
- Зарегистрирован: 2014.08.27, 21:54
Re: yii-treemp - поведение AcriveRecord работы с деревом
Дорабатывал это расширение в одном проекте. Не хватало сортировки записей.
Т.е. в ветку с 20 записями добавляю новую. Она становится 21. А затем нужно ее сделать 3...
Т.е. в ветку с 20 записями добавляю новую. Она становится 21. А затем нужно ее сделать 3...
Re: yii-treemp - поведение AcriveRecord работы с деревом
Согласен. В этой части алгоритм Nested чутка выигрывает. Я в Yii2 хочу выпустить версию с поддержкой сортировки от расширения http://www.yiiframework.com/extension/yii-sorter/. Получится 2 самых быстрых алгоритма работы. Кроме того добавлю виджет редактирования дерева с перемещением. Я где-то его видел, я его в конце концов хочу заимплементить в расширение.
Последний раз редактировалось wartur 2015.01.12, 14:33, всего редактировалось 1 раз.
Re: yii-treemp - поведение AcriveRecord работы с деревом
Я надеюсь вам помогло поле $sequenceOrder в поведении.Loveorigami писал(а):Дорабатывал это расширение в одном проекте. Не хватало сортировки записей.
Т.е. в ветку с 20 записями добавляю новую. Она становится 21. А затем нужно ее сделать 3...
-
- Сообщения: 977
- Зарегистрирован: 2014.08.27, 21:54
Re: yii-treemp - поведение AcriveRecord работы с деревом
Нет...
У меня path выполняет функцию order. Для того, чтобы одним простым запросом отсортировать записи в гриде и оформить в виде наглядного дерева с отступами.
При перемещении узла (иконки со стрелочками) просто пересчитывал path для ветки.
У меня path выполняет функцию order. Для того, чтобы одним простым запросом отсортировать записи в гриде и оформить в виде наглядного дерева с отступами.
При перемещении узла (иконки со стрелочками) просто пересчитывал path для ветки.
Re: yii-treemp - поведение AcriveRecord работы с деревом
Ааа. Понятно.Loveorigami писал(а):Нет...
У меня path выполняет функцию order. Для того, чтобы одним простым запросом отсортировать записи в гриде и оформить в виде наглядного дерева с отступами.
При перемещении узла (иконки со стрелочками) просто пересчитывал path для ветки.
Я от того, что бы path сортировал специально уходил. Я считаю это не верным. Алгоритм сортировки должен быть отдельно, а path отдельно. Иначе получается смешение функциональности и пропадает некоторое удобство пользования материализованным путем. Например материализованный путь в моей реализации может знать все узлы до первого. Во второй версии библиотеки я добавил метод, который позволяет извлекать модели от текущего до корня, что может позволить быстро строить бредкамп.
-
- Сообщения: 977
- Зарегистрирован: 2014.08.27, 21:54
Re: yii-treemp - поведение AcriveRecord работы с деревом
У меня функциональность MP ничем не отличается от той, что присуща MP.
Единственное, что - сортирую по path и делаю отступ, кратный количеству символов в path.
Очень наглядно потом видно все ветки в админке.
А если отдельным полем делать сортировку, то по сути, она будет повторять path, при этом вносить путаницу при выводе дочерних элементов с отступами (как на рис выше).
Единственное, что - сортирую по path и делаю отступ, кратный количеству символов в path.
Очень наглядно потом видно все ветки в админке.
А если отдельным полем делать сортировку, то по сути, она будет повторять path, при этом вносить путаницу при выводе дочерних элементов с отступами (как на рис выше).
Re: yii-treemp - поведение AcriveRecord работы с деревом
каким образом идет сортировка? не вижу на скрине разделителя путей (обычно через точку 005.001.003).Loveorigami писал(а): Единственное, что - сортирую по path и делаю отступ, кратный количеству символов в path.
-
- Сообщения: 977
- Зарегистрирован: 2014.08.27, 21:54
Re: yii-treemp - поведение AcriveRecord работы с деревом
Разделитель есть, просто он пустой на примере. за условный разделитель принято 3 символа. Хотел, чтобы поле было числовым, а не varchar (с точкой).
Сортировка идет order by path ASC
Сортировка идет order by path ASC
Re: yii-treemp - поведение AcriveRecord работы с деревом
если категорий станет тысяча, тушим свет?Loveorigami писал(а):Разделитель есть, просто он пустой на примере. за условный разделитель принято 3 символа. Хотел, чтобы поле было числовым, а не varchar.
Сортировка идет order by path ASC
сам делал на неделе сортировку дерева на основе http://dbushell.github.io/Nestable/ и было бы интересно найти лучшую практику. Но ваш метод, имхо, не очень гибок.
-
- Сообщения: 977
- Зарегистрирован: 2014.08.27, 21:54
Re: yii-treemp - поведение AcriveRecord работы с деревом
Заранее определяю, сколько цифр нужно для записей.
Если > 1000, использую 4 символа.
+ есть метод перевода пути на следующий разряд - если набралось > 1000 записей.
Если > 1000, использую 4 символа.
+ есть метод перевода пути на следующий разряд - если набралось > 1000 записей.
Последний раз редактировалось Loveorigami 2015.01.25, 16:15, всего редактировалось 2 раза.
Re: yii-treemp - поведение AcriveRecord работы с деревом
ну это понятно. костыль для костыля.Loveorigami писал(а):Заранее определяю, сколько цифр нужно для записей.
Если > 1000, использую 4 символа.
+ есть метод перевода пути на следующий разряд - если набралось > 1000 записей.
-
- Сообщения: 977
- Зарегистрирован: 2014.08.27, 21:54
Re: yii-treemp - поведение AcriveRecord работы с деревом
Да, но первоочередная задача ставилась - сделать вложенность записей в gridView. Толковых решений для Nested или Adjency List не нашел. Выбрал MP и доделал сортировку по пути.zelenin писал(а):ну это понятно. костыль для костыля.Loveorigami писал(а):Заранее определяю, сколько цифр нужно для записей.
Если > 1000, использую 4 символа.
+ есть метод перевода пути на следующий разряд - если набралось > 1000 записей.
-
- Сообщения: 977
- Зарегистрирован: 2014.08.27, 21:54
Re: yii-treemp - поведение AcriveRecord работы с деревом
Точнее - 1000 одного уровня. У каждого родителя может быть своя условно 1000 детей...zelenin писал(а): если категорий станет тысяча, тушим свет?
Для моей задачи 1000 хватает с головой и выше )
Re: yii-treemp - поведение AcriveRecord работы с деревом
грид легко - поменял соседние строки, пересчитал и все.Loveorigami писал(а): Да, но первоочередная задача ставилась - сделать вложенность записей в gridView. Толковых решений для Nested или Adjency List не нашел. Выбрал MP и доделал сортировку по пути.
я решил сделать произвольную сортировку, поэтому искал наиболее комплексный подход.
Сейчас у меня в разделе около сотни категорий и дело можно решить тупым перебором/пересбором дерева.
Но в другом разделе у меня категорий тысячи, поэтому необходимо бескостыльное решение.
-
- Сообщения: 977
- Зарегистрирован: 2014.08.27, 21:54
Re: yii-treemp - поведение AcriveRecord работы с деревом
В таком случае - выше предлагался интересный вариант сортировки (на разряженных массивах, как пишет сам автор).
http://www.yiiframework.com/extension/yii-sorter/
https://github.com/wartur/yii-sorter/bl ... ITHM.ru.md
http://www.yiiframework.com/extension/yii-sorter/
https://github.com/wartur/yii-sorter/bl ... ITHM.ru.md