2009-12-07 76 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