2009-12-07 41 views
8

Tôi quan tâm đến cách người khác xử lý điều hướng trang web. Không phải là phần tạo kiểu hoặc khả năng sử dụng, mà là phần thế hệ. Hầu hết các trang web đều có một số loại “cây điều hướng” được hiển thị dưới dạng một hoặc nhiều cấp menu - bạn lưu và xử lý cây này ở dạng nào? Giải pháp đơn giản nhất là mẫu menu tĩnh, giống như sau:Làm cách nào để bạn tạo điều hướng trang web?

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

Nhưng điều này không linh hoạt. Bạn không thể chỉ cần đánh dấu trang hiện tại trong menu và không có cách hiển thị hoặc ẩn một phần nào của cây menu tùy thuộc vào trang hiện tại. (Hoặc là nó?)

tôi đã đưa ra một cây giao diện, một cái gì đó như thế này:

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

Cây này được nạp bởi một Navigation lớp học đặc biệt có thể phục vụ các bộ phận của điều hướng tùy thuộc vào yêu cầu hiện tại con đường. Điều này dường như làm việc tốt hơn một chút, nhưng tôi vẫn rất tò mò về các giải pháp của người khác.

Trả lời

6

MySQL có một bài viết tựa "Managing Hierarchical Data in MySQL" mà trước đây tôi đã tìm thấy là khá vô giá. Nó thảo luận về hai kỹ thuật phổ biến để lưu trữ điều hướng động và hạn chế của chúng.

+1

+1 cho liên kết – Yacoby

+0

Tài nguyên tuyệt vời, đặc biệt là đối với các công cụ thiết lập lồng nhau. –

+0

Tôi đánh dấu điều này được chấp nhận, mặc dù không có giải pháp 'đúng'. (Tôi không muốn làm cho CW trở thành người cung cấp cho mọi người điểm danh tiếng để có câu trả lời hay.) – zoul

5

Nếu ASP.NET được hương vị của bạn, Sitemaps công việc tuyệt vời

+0

Perl/Catalyst ở đây, nhưng cảm ơn bạn, điều này rất hữu ích. – zoul

+1

Có. Chúng dựa vào tệp XML chứa sơ đồ trang web. Nếu bạn không sử dụng ASP.Net, bạn vẫn có thể sử dụng giải pháp dựa trên XML. – DOK

-2

Google Webmaster Tools cung cấp một số ý tưởng và hỗ trợ hữu ích cho việc tạo và quản lý bản đồ website:

+0

Sơ đồ trang web (trong ngữ cảnh đó) là thực phẩm cho các công cụ tìm kiếm chứ không phải điều hướng. – Quentin

+0

Cái xấu của tôi, tôi hiểu sai câu hỏi ... – Upgradingdave

1

SQL Server 2008 có một kiểu dữ liệu mới tiện lợi gọi là "HierarchyId", mà lấy đi một số của các cơn đau đầu khi làm việc với dữ liệu phân cấp.

4

Bạn có thể thấy một trong những module của tôi hữu ích: CatalystX::Menu::Suckerfish

Các cấu trúc menu được tạo ra từ các thuộc tính phương pháp. Nó thiếu một cách để thay đổi trạng thái của mục nhập của trang hiện tại, nhưng điều đó không khó để thêm vào.

Thuộc tính phương thức là chuỗi tùy ý MenuPath và MenuTitle chỉ định đường dẫn được gạch chéo cho tùy chọn menu trong cây và chuỗi được sử dụng làm nhãn tùy chọn menu và thuộc tính tiêu đề html, nếu có.

3

Chúng tôi sử dụng cách tiếp cận tương tự như phương pháp của bạn với thứ bậc menu được lưu trữ trong cơ sở dữ liệu. Nó sẽ là tốt đẹp để tự động tạo ra các cấu trúc trình đơn dựa trên phương pháp công văn thay vào đó, nhưng có những lợi thế khác để tiếp cận DB. Ví dụ, chúng ta có thể thay đổi/hạn chế truy cập mà không cần xây dựng lại ứng dụng và chúng ta có thể tạo các mục menu không ánh xạ tới cây điều phối, chẳng hạn như các liên kết bên ngoài. Chúng tôi cũng có thể cung cấp các nhãn tiết tùy ý mà không nhất thiết phải ánh xạ tới đường dẫn công văn, để giúp mọi người dễ dàng hơn.

Những bất lợi chính (ngoài việc phải nhân đôi cây điều phối) là việc quản lý dữ liệu phân cấp thực sự trong MySQL hơi khó xử. Xem cballou's answer để có tài nguyên tốt về chủ đề đó.

2

Khi nói đến việc hiển thị và ẩn các phần của cây, CSS là bạn của bạn.

Ví dụ, trái cây menu con của bạn có thể

id="fruitmenu"

bạn đặt tất cả các menu con để

display:none;

ở phía trên cùng của tấm phong cách của bạn.

Sau đó, bạn sử dụng ID trong thẻ body của mỗi trang để hiển thị chúng theo quy tắc cụ thể hơn.

Vì vậy, ví dụ trên trang trái cây của bạn, trong đó có

<body id="fruitpage">

các menu con quả là nhìn thấy được bởi vì nó bị chi phối bởi một quy tắc như

#fruitpage #fruitmenu {display:block;}

+0

Đây là những gì tôi làm trên các trang web tĩnh, nhưng tôi (1) không thích khối lượng của các quy tắc tôi phải gõ và (2) cảm thấy một chút tội lỗi mỗi lần tôi thay đổi thuộc tính 'con trỏ' để giả vờ mục menu hiện tại là không thể nhấp được :) – zoul

+0

Tôi không hiểu tại sao bạn phải thay đổi con trỏ - chắc chắn là từ đầu ở đầu danh sách ẩn có thể nhấp được không? Và bạn có thể kết hợp các quy tắc trong CSS! Một quy tắc dài với dấu phẩy. – AmbroseChapel

+0

Xin lỗi, đã bỏ lỡ nhận xét của bạn. Đôi khi toàn bộ menu hiển thị, chỉ mục hiện tại được đánh dấu và không thể nhấp được. Đây là khi tôi phải 'lừa' bằng thuộc tính 'con trỏ'. Và không có cách nào để kết hợp các quy tắc 'body.foo # foo', đúng không? Nếu có 10 trang với một menu phụ, tôi sẽ phải viết các quy tắc 10 'body.foo # foo'. (Với mệnh đề 'display' được chia sẻ, chắc chắn.) Điều này nhanh chóng cũ, tôi muốn viết một lớp có thể tái sử dụng để tạo ra các menu từ một tệp. – zoul

Các vấn đề liên quan