PDA

View Full Version : menu ad albero - qualcuno mi aiuta?


zUmBo!
11-08-2007, 18:50
Salve ragazzi,
ho appena finito di organizzare un database con struttura gerarchica.

in pratica per ogni voce è specificato l'insieme di appartenenza (tramite un numero di inizio ed un numero di fine insieme) ed anche il genitore diretto.

per capirci un elemento che non avrà figli avrà come numeri di inizio e fine 2 num successivi, mentre un'elemento che ne include altri avrà 2 cifre che li contengono.

mi spiego meglio

supponiamo di avere la macrocategoria

COMPUTER
CHE A SUA VOLTA HA MAC e PC
PC SI SUDDIVIDE IN LAPTOP E TOWER

il db è quindi organizzato così:

NOME INIZIO FINE GENITORE
COMPUTER 1 9 0
PC 2 7
MAC 8 9 COMPUTER
LAPTOP 3 4 PC
TOWER 5 6 PC

ora: quando clicco su una sottovoce, vorrei visualizzare tutti gli elenchi genitori aperti, non solo i figli della voce che ho cliccato.

ho creato un paio di funzioni...ma non funzionano :D o meglio mi aprono solo l'ultimo livello selezionato e la root principale.



<?php

function get_range(){
$result = mysql_query('SELECT lft,rgt FROM articoli WHERE id_articolo="'.$_GET[id_articolo].'"');
while($row = mysql_fetch_array($result)){
$range=array(
0=>$row['lft'],
1=>$row['rgt']
);
}//fine ciclo while
return $range;
}



function get_tree($range){

//SE E' IL PRIMO GIRO CALCOLO IL RANGE DELL'ARTICOLO SELEZIONATO
if((!$range)&&($_GET[id_articolo])){$range=get_range();}

#echo $range[0].$range[1];
$sql="SELECT id_articolo,titolo,lft,rgt FROM articoli WHERE id_parent=0 ORDER BY data_ins ASC";
$query=mysql_query($sql) or die(mysql_error());
$conto=mysql_num_rows($query);



//STAMPO IL MENU
for($i=0;$i<$conto;$i++){
while($dati=mysql_fetch_array($query)){
if(($dati['lft']<=$range[0])&&($dati['rgt']>=$range[1])){
$class=" style=\"color:#69b168;font-weight:bolder;\"";
}else{
unset($class);
}
$titolo_art=$GLOBALS[text]->converti_per_output($dati[titolo],0,0);
$voci.="<li><a href=\"index.php?id_articolo=".$dati[id_articolo]."\"".$class.">".$titolo_art."</a></li>";
#$voci.="<li>rangesix:".$range[0]." - vocesix: ".$dati['lft']."</li>";
#$voci.="<li>rangedex:".$range[1]." - vocedex: ".$dati['rgt']."</li>";
//FINE STAMPA MENU



//SE SONO NELLA VOCE DA APRIRE RICHIAMO LA FUNZIONE SUBMENU
if(($dati['lft']<=$range[0])&&($dati['rgt']>=$range[1])){
$voci.=implode(get_sub_tree($range,0,'',0));
}
//FINE RIPETIZIONE DELLA FUNZIONE


}//fine ciclo while
}//fine ciclo for

//FINE STAMPA MENU
return $voci;
}


function get_sub_tree($range,$count,$vocisub,$id_parente){

//SE E' IL PRIMO GIRO CREO L'ARRAY
if(!$vocisub){$vocisub=array();}

if(!$id_parente){$id_parente=$_GET[id_articolo];}

$sql="SELECT id_parent,id_articolo,titolo,lft,rgt FROM articoli WHERE id_parent=".$id_parente;
$id_parente;
$query=mysql_query($sql) or die(mysql_error());
$conto=mysql_num_rows($query);



//STAMPO IL SOTTOMENU
array_push($vocisub,"<ul id=\"sub-list\">");
for($i=0;$i<$conto;$i++){
while($dati=mysql_fetch_array($query)){
$titolo_art=$GLOBALS[text]->converti_per_output($dati[titolo],0,0);
array_push($vocisub,"<li><a href=\"index.php?id_articolo=".$dati[id_articolo]."\">".$titolo_art."</a></li>");
//FINE STAMPA SOTTOMENU



//SE SONO NELLA VOCE DA APRIRE RIPETO LA FUNZIONE
if(($dati['lft']<=$range[0])&&($dati['rgt']>=$range[1])){
$count++;
array_push($vocisub,get_sub_tree($range,$count,$vocisub,$dati[id_parent]));
}
//FINE RIPETIZIONE DELLA FUNZIONE


}//fine ciclo while
}//fine ciclo for
array_push($vocisub,"</ul>");
//FINE STAMPA MENU
#echo implode($vocisub);
return $vocisub;


}




$menusix="<ul id='macro-list'>";
if($ADMIN){
$menusix.="<li><a href=\"index.php\"><strong>+NUOVO ARTICOLO</strong></a>";
}

$menusix.=get_tree($range);




$menusix.="</ul>".$mess2;
?>


qualcuno di voi sa dirmi come mai?