你如何建立一个无限的动态菜单系统?

时间:2011-02-18 22:02:53

标签: php dynamic menu

我有一个wiki类型的应用程序,管理员可以在其中创建页面。必须将每个页面放入菜单系统,该系统由管理员即时创建

Menu Heading
L Subheading
  L Page1

但是,菜单可能有更多页面,例如:

Menu Heading
L Subheading
  L Page1
  L New Subheading
    L Page2

菜单必须易于修改,必须有办法订购标题/副标题以及内页。

所以基本上,一个完全动态的菜单是我不需要任何种类的静态数据。

我有一个当前的方法,但我无法控制页面顺序。如果我没有得到很多回应如何去做,我将提出我目前的做事方式(我只是不想把想法放到你的脑海中,我正在寻找一种新的方法)

由于

编辑:谢谢大家的回复,但是,我认为情况比我现在可以说的要复杂得多。让我想一个更好的方式来问我的问题...我可能会在下周重新发布

5 个答案:

答案 0 :(得分:1)

使用hierarchical schema,为每个项目添加排序顺序,就是这样。

答案 1 :(得分:1)

完成具有父级的系统的最简单方法 - >孩子 - >孩子...关系将是一棵树。使用可能如下所示的设置:

 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;

添加子项时,必须扩大父树_left与右项之间的差距。你应该在你的sub,sub items等中递归地执行此操作。如果我没有误会,可以在1个查询中完成。

尝试在网上搜索更详细的示例,这是一种常用的树结构,称为嵌套集。

答案 2 :(得分:0)

如下结构表应该这样做。

  

MenuItemId | ParentId |订单|含量

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

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

等。

插入商品只需要简单的重新订购。

答案 3 :(得分:0)

您正在寻找什么,称为递归,这是相关问题example,我也建议您阅读this article

答案 4 :(得分:0)

你想知道什么?

如果您对结构感兴趣,请查看MySQL网站上的this article on hierarchical data