2009-12-07 55 views
8

我对其他人如何处理网站导航感兴趣。不是造型或可用性部分,而是生成部分。大多数网站都有某种“导航树”,以一种或多种菜单级别的形式显示 - 您以何种形式保存并处理此树?最简单的解决方案是一个静态菜单模板,如下所示:你如何生成网站导航?

<ul id="menu"> 
    <li><a href="…">One</a></li> 
    <li><a href="…">Two</a></li> 
    <li><a href="…">Three</a></li> 
</ul> 

但这不是很灵活。您不能简单地在菜单中标记当前页面,并且根据当前页面没有显示或隐藏部分菜单树的简单方法。 (或者是什么?)

我想出了一个导航树,像这样:

 
    - title: Fruits 
     nodes: 
     - title: Apples 
     - title: Oranges 
     - title: Bananas 
    - title: Music and Stuff 
     url: music 
     nodes: 
     - title: Classical 
     - title: Jazz 

这棵树被通过特殊Navigation类,它可以成为依赖于当前请求的导航部分装路径。这看起来好一点,但我仍然很好奇其他人的解决方案。

回答

6

MySQL有资格"Managing Hierarchical Data in MySQL"的文章,我以前发现是相当宝贵的。它讨论了存储动态导航的两种常用技术及其局限性。

+1

+1链接 – Yacoby

+0

非常棒的资源,尤其是嵌套设置的东西。 –

+0

虽然没有“正确”的解决方案,但我认为这已被接受。 (我不想让这是一个CW给人们的良好答案的声誉点。) – zoul

5

如果ASP.NET你的味道,Sitemaps工大

+0

Perl/Catalyst在这里,但是谢谢你,这很有用。 – zoul

+1

是的。他们依靠包含站点地图的XML文件。如果您不使用ASP.Net,您可能仍然可以使用基于XML的解决方案。 – DOK

1

SQL Server 2008中有一个名为 “HIERARCHYID” 一个漂亮的新的数据类型,这带走了很多与分层数据一起工作的头痛。

4

您可能会发现有用我的模块之一:从方法属性生成CatalystX::Menu::Suckerfish

菜单结构。它缺少改变当前页面菜单项的状态的方法,但这应该不难添加。

方法属性是任意字符串MenuPath和MenuTitle,它们指定树中菜单选项的斜杠分隔的路径以及用作菜单选项标签和html标题属性的字符串(如果适用)。

3

我们使用与您的方法相似的方法,并在数据库中存储菜单层次结构。根据调度方法自动生成菜单结构会很好,但DB方法还有其他优点。例如,我们可以在不重建应用程序的情况下更改/限制访问,并且可以创建不映射到调度树的菜单项,例如外部链接。我们还可以提供任意冗长的标签,这些标签不一定映射到调度路径,以便让人们更容易。

主要的缺点(除了必须重复调度树)是实际上管理MySQL中的分层数据有点尴尬。请参阅cballou's answer以获取有关该主题的良好资源。

2

当谈到树的部分显示和隐藏时,CSS是你的朋友。

例如,你的水果子菜单可以

id="fruitmenu"

您将所有子菜单

display:none;

在样式表的顶部。

然后,根据更具体的规则,在每个页面的正文标记中使用ID以使其可见。

因此,例如,你的水果页面,其中有

<body id="fruitpage">

,因为它是由规则支配像

#fruitpage #fruitmenu {display:block;}

+0

这是我在静态网站上做的,但我(1)不喜欢我必须键入的规则的数量和(2)每次我都感到有点内疚更改'cursor'属性来假装当前菜单项不可点击:) – zoul

+0

我不明白为什么你必须更改光标 - 当然,隐藏列表顶部的词条是可点击的?你可以在CSS中组合规则!一个带有逗号的长规则。 – AmbroseChapel

+0

对不起,错过了您的评论。有时整个菜单是可见的,只有当前项目突出显示并且不可点击。这是当我必须用'游标'属性'欺骗'时。并且没有办法结合'body.foo#foo'规则,是吗?如果有10页带有子菜单,则必须写10个'body.foo#foo'规则。 (当然有一个共同的'display'子句。)这会很快变老,我宁愿写一个可重用的类,从文件生成菜单。 – zoul