PDA

View Full Version : [php] Creare un menu a livelli


montegentile
27-11-2009, 14:03
Salve,
ho un problema che non riesco a risolvere:
devo creare un menu con diversi sottolivelli di cui non conosco a priori il numero e non conosco nemmeno l'ordine con il quale verranno creati.

Ho creato una tabella nel database mySql che contiene questo:

ID_Livello (Chiave primaria atuo-incrementata)
N_Livello (indica la profondità del livello)
ID_Liv_Precedente (L'id del livello precedente)
Nome_Livello

In pratica:
voglio un menu così composto

A
----> C
-----> E
----> D
B
----> F

Questo menu ha 2 elementi principali A e B.
C e D sono sottomenu di A ed E è sottomenu di C

Nella mia tabella avrei una cosa del genere:

ID NOME LIVELLO ID_LIV_PREC
1 A 0 0
2 B 0 0
3 C 1 1
4 D 1 1
5 E 2 3
6 F 1 2

Devo (e non ci riesco) provvedere a creare un menu cliccabile nel quale clicco e si espande un livello che eventualmente posso ancora cliccare e mi mostrerà i suoi livelli sottostanti....
Potete aiutarmi... non riesco a cavare un ragno dal database....

Grazie

kurts
27-11-2009, 14:35
ma non sarebbe più efficiente una struttura del seguente tipo?
id, nome, padre

id come nel tuo esempio rimane un int autoincrement >0
nome è un semplice varchar
padre è il riferimento all'id superiore

in questo modo gestisci il tutto come fosse un albero e con una piccola funzione ricorsiva

se padre==0 allora è il primo livello, la radice, altrimenti lo devi attaccare al padre e così via

montegentile
27-11-2009, 14:37
Si, mi pare meglio... allora correggo la tabella che diventa

ID
Nome
ID_Padre

e poi ???

kurts
27-11-2009, 15:39
e poi...
e poi crei una funzione che ti genera il menu partendo da un certo punto, all'inizio sarà 0, la radice dell'albero.
puoi usare una funzione così:

function menu($level){
$menu=mysql_query("SELECT * FROM tabella_menu WHERE padre=".$level." ORDER BY id ASC;");
echo'<ul>';
while ($element=mysql_fetch_array($menu)){
echo '<li';
if ($level!=0){echo' id="submenu"';}
echo' ><a href="link_preso_dal_db'">';
echo $element['nome'].'</a>';
$id=$element['id'];
$subelement=mysql_query("SELECT * FROM tabella_menu WHERE parent=".$id." ORDER BY id ASC;");
if (mysql_num_rows($subelement)>0){ //eventuali sottovoci
menu($id);
}
echo'</li>';
}
echo '</ul>';
}


poi nella pagina, dove deve comparire il menu fai una chiamata alla funzione sopra:
menu('0');

ho dovuto sfoltire una funzione che mi ero creato per un mio progetto quindi può darsi che così com'è on funzioni e dia qualche errore, prova a controllare, al massimo fai sapere