I dati gerarchici sono alquanto fastidiosi in un database relazionale (escluso Oracle, che ha operatori in START WITH/CONNECT BY
per affrontare questo). Esistono fondamentalmente due modelli
:elenco di adiacenze e insiemi nidificati.
Hai scelto i set di adiacenza, che è quello che faccio di solito anche io. È molto più semplice da modificare rispetto al modello di set nidificato, sebbene il modello di set nidificato possa essere recuperato nell'ordine corretto in una singola query. Gli elenchi di adiacenza non possono essere. Dovrai creare una struttura dati intermedia (albero) e poi convertirla in un elenco.
Quello che farei (e in effetti ho fatto di recente) è:
- seleziona l'intero contenuto del menu in una query ordinata per ID genitore;
- Costruisci un albero della struttura del menu usando array associativi o classi/oggetti;
- Percorri quell'albero per creare liste nidificate non ordinate; e
- Utilizza un plug-in jQuery come Superfish per trasformare quell'elenco in un menu.
Costruisci qualcosa del genere:
$menu = array(
array(
'name' => 'Home',
'url' => '/home',
),
array(
'name' => 'Account',
'url' => '/account',
'children' => array(
'name' => 'Profile',
'url' => '/account/profile',
),
),
// etc
);
e convertilo in questo:
<ul class="menu">;
<li><a href="/">Home</a></li>
<li><a href="/account">Account Services</a>
<ul>
<li><a href="/account/profile">Profile</a></li>
...
Il PHP da cui generare l'array di menu è ragionevolmente semplice ma un po' complicato da risolvere. Utilizzi una funzione ricorsiva di tree-walking che costruisce il markup dell'elenco nidificato HTML ma lascerà la sua implementazione come esercizio per il lettore. :)