Программирование древовидного меню
При программировании меню с неограниченной вложенностью категорий возникают проблемы
№1 - как вывести ресурс, когда названия у страниц совпадают
Первое решение заключается в добавлении уникального id для страницы, как например сделано в DLE.
Второе решение - при сохранении страницы в дополнительное поле в базе данных сразу записывать полный путь и уже проверять именно его.
Третий вариант - рекурсивный поиск, т.е. /категория1/категория2/категория3/категория4/товар раскладываем url на составляющие и ищем в базе данных вначале товар - если он уникален, поиск закончен, если нет, то проверяем дальше категорию 4, потом 3 и т.п.
№2 - как быть с дублями страниц, когда товар добавлен в несколько категорий
Решение 1 - не обращать внимание и выводить как есть, это худший вариант.
Решение 2 - выделить главную категорию, оставшиеся страницы запрещать к индексированию метатегом.
Решение 3 - отказаться от чпу для товаров и страниц и выводить их отдельно на уникальной странице для каждого.
Решение 4 - отказаться от размещения в несколько категорий
№3 - как выводить категории
Когда для категорий создана отдельная таблица, проблем как правило не возникает.
Когда записи сами могут являться категориями, возникает вопрос, как отличить где категория, а где просто запись. В CMS MODX данную проблему решили добавлением логического значения, если галочка стоит, то в дереве отображать как категорию, иначе как страницу.