2009-12-07 14 views
8

Sono interessato a come gli altri utenti gestiscono la navigazione del sito web. Non la parte di stile o usabilità, ma la parte di generazione. La maggior parte dei siti web ha una sorta di "albero di navigazione" che viene visualizzato sotto forma di uno o più livelli di menu: in quale forma salvate ed elaborate questo albero? La soluzione più semplice è un modello statico di menu, qualcosa di simile:Come si genera la navigazione del sito web?

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

Ma questo non è molto flessibile. Non puoi semplicemente contrassegnare la pagina corrente nel menu e non c'è un modo semplice per mostrare o nascondere una parte dell'albero del menu a seconda della pagina corrente. (O è?)

mi si avvicinò con un albero di navigazione, qualcosa di simile:

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

Questo albero viene caricato da una speciale Navigation classe che può servire parti della navigazione a seconda della richiesta corrente sentiero. Questo sembra funzionare un po 'meglio, ma sono comunque molto curioso delle soluzioni degli altri.

risposta

6

MySQL ha un articolo intitolato "Managing Hierarchical Data in MySQL" che ho precedentemente trovato ad essere molto prezioso. Discute due tecniche comuni per memorizzare la navigazione dinamica e i loro limiti.

+1

+1 per il collegamento – Yacoby

+0

Grande risorsa, in particolare per le risorse nidificate. –

+0

Sto segnalando questo accettato, anche se non esiste una soluzione "giusta". (Non volevo rendere questo un CW per dare alle persone i punti reputazione per le buone risposte.) – zoul

5

Se ASP.NET è il tuo gusto, Sitemaps lavoro grande

+0

Perl/Catalyst qui, ma grazie, questo è utile. – zoul

+1

Sì. Si basano su un file XML che contiene la mappa del sito. Se non si utilizza ASP.Net, è comunque possibile utilizzare una soluzione basata su XML. – DOK

1

SQL Server 2008 ha un nuovo tipo di dato nifty chiamato "hierarchyid", che toglie un lotto dei mal di testa di lavorare con i dati gerarchici.

4

Si potrebbe trovare uno dei miei moduli utili: CatalystX::Menu::Suckerfish

La struttura dei menu è generato dal metodo di attributi. Manca un modo per modificare lo stato della voce di menu della pagina corrente, ma non dovrebbe essere difficile da aggiungere.

Gli attributi del metodo sono stringhe arbitrarie MenuPath e MenuTitle che specificano un percorso delimitato da barre per l'opzione di menu nell'albero e una stringa utilizzata come etichetta dell'opzione di menu e un attributo del titolo html, ove applicabile.

3

Utilizziamo un approccio simile al tuo con la gerarchia di menu memorizzata nel database. Sarebbe bello generare automaticamente la struttura del menu basata sui metodi di invio, ma ci sono altri vantaggi all'approccio DB. Ad esempio, possiamo modificare/limitare l'accesso senza ricostruire l'applicazione, e possiamo creare voci di menu che non sono mappate all'albero di spedizione, come i link esterni. Possiamo anche fornire etichette verbose arbitrariamente che non necessariamente mappano al percorso di spedizione, per rendere le cose più facili per gli umani.

Lo svantaggio principale (oltre a dover duplicare l'albero di distribuzione) è che la gestione effettiva dei dati gerarchici in MySQL è leggermente problematica. Vedi cballou's answer per una buona risorsa su quell'argomento.

2

Quando si tratta di mostrare e nascondere parti di un albero, CSS è tuo amico.

Ad esempio, il sottomenu frutti possono essere

id="fruitmenu"

di impostare tutti i sottomenu per

display:none;

nella parte superiore del foglio di stile.

Quindi si utilizza un ID nel tag body di ciascuna pagina per renderle visibili secondo una regola più specifica.

Così, per esempio sulla tua pagina di frutta, che ha

<body id="fruitpage">

sottomenu frutto è visibile perché è governato da una regola come

#fruitpage #fruitmenu {display:block;}

+0

Questo è quello che faccio sui siti web statici, ma io (1) non mi piace il volume delle regole che devo digitare e (2) mi sento un po 'in colpa ogni volta che cambia la proprietà 'cursor' per far finta che la voce del menu corrente non sia cliccabile :) – zoul

+0

Non capisco perché dovresti cambiare il cursore - sicuramente il lemma in cima a una lista nascosta è cliccabile? E puoi combinare le regole in CSS! Una lunga regola con le virgole. – AmbroseChapel

+0

Siamo spiacenti, ho perso il tuo commento. A volte l'intero menu è visibile, solo la voce corrente è evidenziata e non cliccabile. Questo è quando devo "barare" con la proprietà 'cursor'. E non c'è modo di combinare le regole di 'body.foo # foo', vero? Se ci fossero 10 pagine con un sottomenu, dovrei scrivere 10 regole 'body.foo # foo'. (Con una clausola 'display' condivisa, certo.) Questo diventa vecchio rapidamente, preferirei scrivere una classe riutilizzabile che generi i menu da un file. – zoul

Problemi correlati