Newsgroup: it.comp.www.php
Titolo: Menu e sub menu

Salve,
ho la necessità di realizzare un menu "dinamico" comprenivo di submenu. 
La struttura del database è così composta:
voce_id -> id
voce_nome -> nome della voce
voce_subid -> eventuale id alla quale voce appartiene
La caratteristica principale riguarda voce_subid. In fase di inserimento 
delle voce, un eventuale numero in voce_subid rappresenta l'id della 
voce alla quale la voce è stessa è subordinata.
cane (id 1, subid NULL o 0)
  |_cane bianco (id 3, subid 1)
  |_cane nero (4, subid 1)
  |_cane rosso (id 5, subid 1)
mucca (id 2, subid NULL o 0)
  |_mucca marrone (id 6, subid 2)
  |_mucca nera (id 7, subid 2)
  |_mucca bianca (id 8, subid 2)
Quella sopra riportata è la struttura di esempio. In poche parole dovrei 
realizzare uno script che generi un sistema di sottolivelli in una 
schema pari a quelllo riportato. La questione è che non sono al corrente 
di quanti sottolivveli possano esistere. Come posso realizzare un 
sistema adeguatamente flessibile?
Grazie && Saluti

 sistema adeguatamente flessibile?
Sei fortunato, ne ho realizzato uno da poco.
Potresti utilizzare una funzione ricorsiva:
------------------------------------------------------------
function sotto_menu($subid=0)
{
	$strSQL="SELECT * FROM .... WHERE sub_id=$subid";
	$query=mysql_query($strSQL);
	while ($rs=mysql_fetch_array($query))
	{
		echo $rs['nome'];
		sotto_menu($rs['id']);
	}
}
sotto_menu();
-----------------------------------------------------------
Praticamente quello che succede è che la prima volta che viene avviata 
sotto_menu, $subid vale 0, per cui $query contiene tutti i record con 
subid=0.
Alla scansione del primo record, dopo aver scritto il nome, avvia di 
nuovo sotto_menu, con parametro questa volta l'id del record.
Lo stack ora contiene per $subid il valore dell'id del record.
Se non ci sono record con quel $subid semplicemente termina tornando 
alla chiamata di sotto_menu del primo record con $subid=0.
E cosi' via per tutti i record.
-- 
Ciao,
	Fabrizio
===  
http://www.negusweb.it
  ===

 
Ti ringrazio per il prezioso script, funziona veramente bene. Mi sono 
permesso di modificarlo ma con scarso successo:
function sotto_menu($subid=0,$nsub=0){
		$q = "SELECT * FROM artworkcats WHERE artworkcat_catid = $subid ORDER 
BY artworkcat_n";
		$temp = mysql_query($q);
		while ($rs = mysql_fetch_array($temp)){
			for ($n = 0; $n == $nsub; $n++){
				echo "-";
			}		
			echo $rs['artworkcat_name']."<BR>";
			$nsub++;
			sotto_menu($rs['artworkcat_id'],$nsub);
		}
	}
sotto_menu();
E' tardi. Sě vede che non riesco a ragionare :D.
Credo si capisca abbastanza quello che voglio fare. In poche parole 
voglio che ad ogni "passaggio di livello" compaia un "-" in piů di 
fronte al nome della voce.
cane
- cane bianco
- cane nero
-- cane nero rabbioso
-- cane nero arrabbiato
cavallo
- cavallo bianco
- cavallo marrone
-- cavallo goloso
--- cavallo goloso curioso
Scusa per l'esempio stupido. Le modifiche da me effettuate non consento 
di realizzare una cosa simile. Mi sono vagamente avvicinato al risultato.
Grazie && Saluti.

 fronte al nome della voce.
Potresti anche usare un lista non ordinata, utilizzando il tag <li>.


Ciao,
ho provato come dici tu ad uitilizzare una lista non ordinata facendo 
uso del tag <li>. Il problema risulta essere il tag <ul>, ovvero il tag 
che consente di "ordinare" la subordinazione.
<ul>
	<li>prima</li>
	<li>seconda</li>
	<ul>
		<li>subordinato seconda</li>
		<li>subordinato seconda</li>
	</ul>
	<li>terza</li>
	<li>quarta</li>
</ul>
La gestione del <li> non rappresenta il problema. Il problema maggiore è 
inserire il tag <ul> a posto giusto ed al momento giusto. Il tag <ul> 
andrebbe prima del primo "oggetto" subordinato" e </ul> andrebbe dopo 
l'ultimo "oggetto" subordinato. Sinceramente non riesco a creare una 
funziona tale che mi consenta di eseguire questa analisi.
Grazie && Saluti.

 funziona tale che mi consenta di eseguire questa analisi.
Caro mio, non c'e' nessuna funzione da creare, è più semplice di quanto 
credi.
Infatti basta stampare il tag <ul> prima della prima chiamata alla 
funzione sotto_menu() ed il tag </ul> dopo, ovvero ...
echo "<ul>";
sotto_menu();
echo "</ul>";
Spero sia charo ...



Ciao,
il codice che mi proponi è corretto, ma non mi consente di gestire la 
subordinazione. Ossia mi consente di stampare un normale elenco puntato 
con rientro (creato da <ul>) come:
- voce uno
- voce due
- voce due uno
- voce due due
- voce tre
Io vorrei fare in modo che stampi:
- voce uno
- voce due
	- voce due uno
	- voce due due
- voce tre
Con il giusto rientro creato da un <ul> prim di voce due uno e un </ul> 
dopo voce due due.
Grazie && Saluti.

 con rientro (creato da <ul>) come:
Si, lo so.
Se ti sforzi un po' sono sicuro che trovi la soluzione.
Come spunto potresti pensare di appoggiarti ad un array riempito con i 
dati del db e ricostruire l'albero delle varie liste da questo array.
