2011-02-18 89 views
1

我有一个维基类型的应用程序,管理员可以创建页面。每个页面都要投入菜单系统,它是由管理员在即时创建你如何制作无限动态菜单系统?

Menu Heading 
L Subheading 
    L Page1 

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

Menu Heading 
L Subheading 
    L Page1 
    L New Subheading 
    L Page2 

菜单必须易于修改,并且必须有一种方法来订购标题/小标题以及页面中的页面。

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

我有一个当前的方法,除了我无法控制页面顺序。如果我没有得到很多答复如何去做,我会把我目前的做事方式(我只是不想把想法放到你的头上,我正在寻找一种新的方法)

谢谢

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

+0

“没有任何种类的静态数据”:因为数据库不包含静态数据? – zzzzBov 2011-02-18 22:14:13

回答

0

表格结构如下应该这样做。

MenuItemId | ParentId |订单|内容

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

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

等。

插入项目应该只需要一个简单的重新排序。

+0

这是一个非常简单的设置,这是一个噩梦,如果你需要找到所有的孩子,如果你需要更多的深度为1。 – Michael 2011-02-18 22:28:03

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个简单的querys的完整结构,像这样:

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个查询中完成。

在网上尝试并搜索更详细的exampled这是一个常用的称为嵌套集的树结构。