Как сделать бесконечную систему динамического меню? - PullRequest
1 голос
/ 19 февраля 2011

У меня есть приложение типа вики, где администратор может создавать страницы. Каждая страница должна быть помещена в систему меню, которая создается на лету администратором

Menu Heading
L Subheading
  L Page1

Однако для меню может быть больше страниц, таких как:

Menu Heading
L Subheading
  L Page1
  L New Subheading
    L Page2

Меню должно легко изменяться, и должен быть способ упорядочить заголовки / подзаголовки, а также страницы внутри.

так что, в принципе, полностью динамическое меню - это то, что мне нужно. НЕТ СТАТИЧЕСКИХ ДАННЫХ ЛЮБОГО РОДА.

У меня есть текущий метод, который работает, за исключением того, что я не могу контролировать порядок страниц. Если я не получу много ответов о том, как это сделать, я изложу свой нынешний способ ведения дел (я просто не хочу вкладывать идеи в вашу голову, я ищу новый подход)

Спасибо

РЕДАКТИРОВАТЬ: Спасибо всем за ваши ответы, однако я думаю, что ситуация немного сложнее, чем я могу выразить словами прямо сейчас. Дайте мне подумать о лучшем способе задать мой вопрос ... Я сделаю репост на следующей неделе

Ответы [ 5 ]

1 голос
/ 19 февраля 2011

Самый простой способ создания системы, в которой есть отношения родитель -> ребенок -> ребенок ... - это дерево.Где вы используете установку, которая может выглядеть следующим образом:

 id | name      | parent | tree_left | tree_right
----+-----------+--------+-----------+-----------
 0  | root      | NULL   | 0         | 9
 1  | child1    | 0      | 1         | 4
 2  | subchild1 | 1      | 2         | 3
 3  | child2    | 2      | 5         | 8
 4  | subchild2 | 3      | 6         | 7

Это будет база данных для:

root
|_ child 1
   |_ subchild 1
|_ child 2
   |_ subchild 2

Вы можете получить полную структуру в 2 простых запроса, например так:

SELECT * from menu WHERE name = root;
SELECT * FROM menu WHERE tree_left > $root['tree_left'] AND tree_right <  $root['tree_right'] order by tree_left DESC;

Когда вы добавляете детей, вы должны увеличить расстояние между вашим родительским tree_left и правым.Вы должны делать это рекурсивно, когда вы в подпунктах, подпунктах и ​​т. д. Что можно сделать за 1 запрос, если я не ошибаюсь.

Попробуйте поискать в Интернете более подробный пример. Это часто используемая древовидная структура, называемая вложенным множеством.

1 голос
/ 19 февраля 2011

Хорошо используйте иерархическую схему , добавьте порядок сортировки для каждого элемента и все.

0 голосов
/ 19 февраля 2011

Что именно вы хотите знать?

Если вы заинтересованы в структуре, прочитайте эту статью об иерархических данных на веб-сайте MySQL.

0 голосов
/ 19 февраля 2011

То, что вы ищете, называется рекурсией, вот соответствующий вопрос пример , также я бы рекомендовал прочитать эту статью .

0 голосов
/ 19 февраля 2011

Таблица должна быть структурирована следующим образом.

MenuItemId |ParentId |Заказать |Содержание

TopLevelItem1 (MenuItemId: 1)
 |
 |-> MenuItem2 (ParentId: 1, Order 1)
 |-> MenuItem3 (ParentId: 2, Order 2)

TopLevelItem2 (MenuItemId: 4)
 |
 |-> MenuItem4 (ParentId: 4, Order 1)

и т. Д.

Для вставки элементов требуется просто изменить порядок.

...