у вас вложенность предполагается ограниченная строгая (категория/группа/элемент) или универсальная (категория1/категория2/категория3/ … категория_n/элемент)?
по всем признакам универсальная
в ней есть несколько проблем:
работа ссылокй (вам необходимо создать свой класс создания и разбора ссылки стандартными методами будет сложно описать работу с сылками)
определение группа является конечной или в ней есть вложенные группы
привязка конечной группы к элементу
каждый раз придётся проверять правильность переданного пути потому как вы написали "/cat/subcat1/subcat2/test.html" грубо говоря вам надо проверить цепочку
первое если группа cat если у неё группа subcat1 если у subcat1 группа subcat2 и тд
сформировать ссылку опять же придётся подтянуть всю цепочку
может изложите изначальную задачу есть разные варианты реализации (более простые и эффективные) этот вариант просто ну очень грузовой! если вы рассчитываете на не большие объёмы то может и не нужна универсальная вложенность!
Мне бы в принципе хватило 5 уровней вложенности, т.к. более смысла я вообще не вижу делать, возможно три даже - т.е. /cat/subcat/subcat2/test.html Я думаю более не нужно в принципе. Самый простой вариант, который я рассматривал - это тупо формирование и запись url при добавлении новости к примеру. Т.е. добавляем новость, выбираем категорию - новости->культура. В итоге получаем готовый url - /новости/культура/новость.html Но это по сути хардкод, т.к. если у нас к примеру 100 новостей в категории новости->культура, что будет если мы захотим сменить название категории или еще чего. Поэтому вот решил поинтересоваться как сделать чтоб было все правильно
А у Вас не так много вариантов, кстати, с учетом того, что по-хорошему нужно проверять всё дерево на существование.
Т. е. если /cat1/cat2/cat3/.../catN/test.html должен открываться, а, скажем, /cat1/kat2/cat3/.../catN/test.html должен выдавать 404, то материализованный путь - это самый простой вариант. Проблема с переименованием решается триггерами, благо это не такая уж частая штука.
А вообще я бы посидел тут и послушал, какие еще варианты решения можно придумать. Возможно, народ решает при помощи каких-нибудь мутированных nested set?
Он не только имеет право, он существует и активно используется (правда, чаще всего в связке с какими-нибудь приблудами типа постресного ltree). Взять хотя бы DMOZ.
Более того, в большинстве случаев дерево категорий довольно маленькое (скажем, до тысячи элементов), поэтому триггеры, отвечающие за целостность, особо не создают нагрузки.
Фишка в том, что если сеошники не упороты (и не меняют slug категорий по сто раз на дню), то денормализованный путь - это самый быстрый способ прогулок по деревьям. Поэтому если селектов существенно больше чем инсертов-апдейтов, то очень всё быстро и прикольно.
Но я бы все-таки послушал про другие методы реализации на практике. Задача-то частая, а вот дальше ltree я как-то не совал пока носа.
либо жесткая структура для каталогов товаров там обычно раздел/категория/группа но ссылки делаю строго раздел/алиас категория/алиас группа/алиас без всяких премудрств
Спасибо, теперь примерно представляю как это будет. Но запнулся на одной вещи, а именно получении url - не могу выбрать правильно подкатегорию. Т.е. в таблице category к примеру есть
id | parent_id | name
---|-----------|------
1 | 0 | Новости
2 | 1 | Культура
Не пойму как выбрать по id потомка родителя, т.е. к примеру у нас Категория с id = 2, а как получить ссылку вида Новости/Культура, т.е. подняться по дереву до родителя ?
функцию parent должна быть в моделе категорий её туда над добавить я написал как она должна выглядеть
запись $model = AR::model()->findByPk($id); надо подправить на $model = НазваниеКлассаКатегорий::model()->findByPk($id);
по поводу куда это
это можно создать удобную функцию которая автоматом будет гинерить ссылку или ещё как то! я вам принцип работы говорю я же не знаю как у вас код организован и как вам будет удобнее это использовать
Mihail, еще раз Огромное Вам спасибо, даже не представляете как вы мне помогли
Мне нужно было получить всех потомков родительской категории, т.е. к примеру по ссылке /novosti/ выбрать все записи которые принадлежат категории Новости и всем подкатегориям данной категории и т.д. Если взять ту таблицу, что я выше писал, получается я передаю parent_id, получаю всех его потомков+самого родителя(parend_id -> id).
Кстати, почему то решил передавать в условие именно строку, а нет, массив нужен, в итоге, благодаря вам, у меня получилась такая вещь: