sverel
Новичок
Древовидная структура + статус активности
Задача: реализовать древовидную структуру каждый нод который имеет свой статус активности (опубликован или нет). Например, дерево категорий в интернет-магазине.
- Инструмент:
Делать деревья - не проблема. Nested sets рулит
Статус активности - тоже не проблема. Отдельное поле TINYINT(1).
Проблема начинается при совмещении NESTED_SETS и статуса активности, ведь статус активности должен наследоваться всеми дочерними нодами дерева. Т.е. если я группе "инструменты" ставлю статус=0 (не показывать), то все дочерние подразделы должны тоже пропасть с сайта. Но т.к. для построения дерева используется запрос:
То группа "инструменты" не попадает под фильтр, однако "отвёртки", "кисточки", "дрели" попадают и выводятся на сайте.
Можно при смене статуса ставить этот же статус всем дочерним элементам. Но в этом случае, теряется индивидуальные статусы у всех дочерних. Например, "кисточки" и "дрели" были не активными и внутри "инструментов" отображались только "дрели". Потом я "инструменты" сначала деактивировал, а потом снова активировал. В итоге все дочерние становятся активными и теперь и "кисти" и "отвёртки" выводятся на сайте.
Пример реализации этой задачи можно найти в ФотоШопе со слоями и группами. Можно деактивировать группу и все дочерние слои исчезнут. Но при активации группы все дочерние слои сохранят свой статус активности и те кто были неактивны - такими и останутся.
Можно конечно вместо Nested Sets заюзать алгоритм ID -> PARENT_ID, но в дереве 200 нодов и выводится оно целиком на каждой странице сайта. Выполнять 200 SQL-запросов для каждой страницы - это жесть.
Ещё можно используя NESTED_SETS на этапе построения дерева в проходе по массиву проверять: есть ли у текущего элемента активный родитель, про-родитель, ...., про-про-про-родитель. Но это тоже жеесть, ведь для элемента "плоские кисти" надо проверить активность "кисточек" (родительская) и "инструментов" (про-родитель). А как это сделать в плоском массиве? Извратится конечно технически можно, написав скрипт в 20 строчек, но сдаётся мне это жопачное решение такое же как и ID -> PARENT_ID.
Есть какие-нибудь "правильные" решения у данной задачи?
Задача: реализовать древовидную структуру каждый нод который имеет свой статус активности (опубликован или нет). Например, дерево категорий в интернет-магазине.
- Инструмент:
- Отвёртки
- Кисточки
- Плоские кисти
- Круглые кисти - Дрели
Делать деревья - не проблема. Nested sets рулит
Статус активности - тоже не проблема. Отдельное поле TINYINT(1).
Проблема начинается при совмещении NESTED_SETS и статуса активности, ведь статус активности должен наследоваться всеми дочерними нодами дерева. Т.е. если я группе "инструменты" ставлю статус=0 (не показывать), то все дочерние подразделы должны тоже пропасть с сайта. Но т.к. для построения дерева используется запрос:
PHP:
SELECT * FROM `tbl`
WHERE `active`=1
ORDER BY `left_key`
Можно при смене статуса ставить этот же статус всем дочерним элементам. Но в этом случае, теряется индивидуальные статусы у всех дочерних. Например, "кисточки" и "дрели" были не активными и внутри "инструментов" отображались только "дрели". Потом я "инструменты" сначала деактивировал, а потом снова активировал. В итоге все дочерние становятся активными и теперь и "кисти" и "отвёртки" выводятся на сайте.
Пример реализации этой задачи можно найти в ФотоШопе со слоями и группами. Можно деактивировать группу и все дочерние слои исчезнут. Но при активации группы все дочерние слои сохранят свой статус активности и те кто были неактивны - такими и останутся.
Можно конечно вместо Nested Sets заюзать алгоритм ID -> PARENT_ID, но в дереве 200 нодов и выводится оно целиком на каждой странице сайта. Выполнять 200 SQL-запросов для каждой страницы - это жесть.
Ещё можно используя NESTED_SETS на этапе построения дерева в проходе по массиву проверять: есть ли у текущего элемента активный родитель, про-родитель, ...., про-про-про-родитель. Но это тоже жеесть, ведь для элемента "плоские кисти" надо проверить активность "кисточек" (родительская) и "инструментов" (про-родитель). А как это сделать в плоском массиве? Извратится конечно технически можно, написав скрипт в 20 строчек, но сдаётся мне это жопачное решение такое же как и ID -> PARENT_ID.
Есть какие-нибудь "правильные" решения у данной задачи?