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?
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?