В MySQL есть статья, озаглавленная «Управление иерархическими данными в MySQL» , которую я ранее считал весьма бесценной. В нем обсуждаются два распространенных метода хранения динамической навигации и их ограничения.
Один из моих модулей может оказаться полезным: CatalystX :: Menu :: Suckerfish
Структура меню сгенерирована из атрибутов метода. В нем отсутствует способ изменить состояние пункта меню текущей страницы, но это не должно быть сложно добавить.
SQL Server 2008 имеет отличный новый тип данных под названием «HierarchyID», который устраняет много головной боли при работе с иерархическими данными.
Мы используем подход, аналогичный вашему, с иерархией меню, хранящейся в базе данных. Было бы неплохо вместо этого автоматически сгенерировать структуру меню на основе методов отправки, но у подхода БД есть и другие преимущества. Например, мы можем изменить / ограничить доступ, не перестраивая приложение, и мы можем создавать пункты меню, которые не отображаются в дереве отправки, такие как внешние ссылки. Мы также можем предоставить произвольно подробные метки, которые не обязательно сопоставляются с путем отправки, чтобы упростить задачу для людей.
Главный недостаток (помимо необходимости дублировать дерево отправки) заключается в том, что на самом деле управление иерархическими данными в MySQL немного неудобно. См. ответ cballou для получения хорошего ресурса по этой теме.
Когда дело доходит до отображения и скрытия частей дерева, CSS - ваш друг.
Например, ваше подменю фруктов может быть
id = "fruitmenu"
вы устанавливаете для всех подменю значение
display: none;
в верхней части таблицы стилей
Затем вы используете идентификатор в теге тела каждой страницы, чтобы сделать их видимыми в соответствии с более конкретным правилом.
Так, например, на странице фруктов, на которой есть
, подменю фруктов видно, потому что оно регулируется правилом вроде
#fruitpage #fruitmenu {display: block ;}
Инструменты Google для веб-мастеров предоставляют некоторые полезные идеи и поддержку для создания и управления картами сайта: