Rekursions Problem

BasicAvid

Member
Hallo zusammen,

ich habe ein Menü welches durch Rekursion aufgebaut wird, die Daten werden aus einer MySQL Datenbank geholt. Mein Problem ist jetzt, dass wenn ich auf einen der Hauptmenüpunkte klicken sich alle anderen Menüs auch aufmachen. Was nicht sein sollte. Ich habe es zwar schon geschafft das sich nur das jeweilige Menü aufmacht, nur dann werden nicht mehr alle Subkategorien ausgelesen.
Kann ich eine Rekursion irgendwie Steuern? Sprich, dass ich sage nur bis dahin und nicht weiter und dann wenn ich auf den anderen Menüpunkt klicke sich dieses aufmacht!??

Hier mal der Code:
PHP:
function getSubnav($sub_id, $pos=0, $selected_id="",$katid="",$subkat="")
{
	$alle_kategorien=mysql_query("SELECT * FROM produktcms_kat WHERE subkat='$sub_id' ORDER BY rang");
    while($kat=mysql_fetch_array($alle_kategorien))
    {
    	  	
      	if($sub_id == 0)
      	{
       		print '<table width="212" border="0" cellspacing="0" cellpadding="2">'; 
		    print '<tr><td width="16" bgcolor="#C7D6F1"';
			if($katid!=$kat[katid] || $subkat==$kat[subkat]) print ' class="linesubnav"';
			print '><img src="img_allg/icon_subnav.gif" width="16" height="8" border="0"></td>';
		    print '<td align="left" bgcolor="#C7D6F1"';
			if($katid!=$kat[katid] || $subkat==$kat[subkat]) print  ' class="linesubnav"';
		    print '><a href="produkte_uebersicht.php?katid='.$kat[katid].'&show=1&subkat='.$kat[subkat].'" class="subnav">';
		    print  $kat[bezeichnung].'</a></td><tr></table>';
		    		    
      	}
       	else
       	{      			
       		if($_GET['show']==1 || $katid==$kat[subkat] && $subkat==$katid)
       		{
       			print '<table width="212" cellpadding="1" border="0" cellspacing="0" bgcolor="#C7D6F1">';
           		print '<tr valign="top">';
           		echo linie($pos,"<td width='10'></td>");
            	print '<td width="17" align="right" valign="top">';
            	print '<img src="img_allg/icon_subnavkl.gif" width="12" height="10" border="0"></td>';
            	print '<td width="189" align="left"><a href="produkte_uebersicht.php?katid='.$kat[katid].'&show=1&subkat='.$kat[subkat].'" class="subnavkl">'.$kat[bezeichnung].'</a></td>';
            	print '</tr>';
            	print "</table>\n";
            	
       		}
       		
       		
       	}
       	getSubnav($kat[katid],$pos+1,"",$kat[katid],$kat[subkat]);
    }
    
}

So hab ich es jetzt gelöst! Es würde auch schon fast funktionieren. Das einzige was jetzt noch nicht funzt ist dass wenn ich eine der Hauptkategorien anklicke, sollte sich danach alles unter diesem Menü öffnen also die gesamten Submenüs - der gesamten Baum.

Beispiel:

HAUPT1 <-- Hier wird drauf gelickt
HAUPT2
HAUPT3

HAUPT1 <-- Und so soll danach aussehen
Sub1
SubSub1
Sub2
SubSub1
SubSub2
HAUPT2
HAUPT3

Keiner eine Idee?? ;(

PHP:
function getTree($id,$lpos) 
{
	global $katid;
	global $subkat;
    global $wahl;  
    static $ebene = 0; 
    
    $erg[$ebene] = mysql_query("SELECT * FROM `produktcms_kat` WHERE `subkat` = '$id'");
    $menge = mysql_num_rows($erg[$ebene]);
    
    for ($lo=0;$lo<$menge;$lo++) 
    {
        $row = mysql_fetch_row($erg[$ebene]);    
                                                
        if($row[1]==0)
        {
        	print '<table width="212" border="0" cellspacing="0" cellpadding="2">'; 
		    print '<tr><td width="16" bgcolor="#C7D6F1"';
			if($katid!=$row[0]) print ' class="linesubnav"';
			print '><img src="img_allg/icon_subnav.gif" width="16" height="8" border="0"></td>';
		    print '<td align="left" bgcolor="#C7D6F1"';
			if($katid!=$row[0]) print  ' class="linesubnav"';
		    print '><a href="produkte_uebersicht.php?katid='.$row[0].'&pos='.$lpos.'|'.$row[0].'&subkat='.$row[1].'" class="subnav">';
		    print  $row[2].'</a></td><tr></table>';
        }
        else
        {
        	print '<table width="212" cellpadding="1" border="0" cellspacing="0" bgcolor="#C7D6F1">';
           	print '<tr valign="top">';
           	if($ebene >0){echo str_repeat("<td> </td>",$ebene);}
           	print '<td width="17" align="right" valign="top">';
            print '<img src="img_allg/icon_subnavkl.gif" width="12" height="10" border="0"></td>';
            print '<td width="189" align="left"><a href="produkte_uebersicht.php?katid='.$row[0].'&pos='.$lpos.'|'.$row[0].'&subkat='.$row[1].'" class="subnavkl">'.$row[2].'</a></td>';
            print '</tr>';
            print "</table>\n";
        }
        
        if($row[0] == $wahl[$ebene+1]) 
        { 
            $ebene++; # ein Level hoch
            getTree($row[0],$lpos."|$row[0]");
            $ebene--; # und wieder ein Level runter
        }
    }
}
 

Runsky

New member
hallo.
hatte damals auch viele probleme mit einem menübaum mit unendlich viele kategorien und unterkategorie...

also so hats damals funktioniert ( ist nen alter code von mir)

PHP:
<?php
session_start();
    error_reporting(E_ALL);   
    include './config.php';
    include './functions.php';
    
    connect();
    
$sql = "SELECT
                                  id,
                                  parent_id,
                                  cat_name
                         FROM
                                  cat";
    $result = mysql_query($sql) OR die(mysql_error());
    
    $daten = array();
    
    while ( $row = mysql_fetch_assoc( $result ) )
    {
        
        $daten[$row['id']]['cat_name'] = $row['cat_name'];
        $daten[$row['id']]['parent_id'] = $row['parent_id'];
        
    }

function cat_tree($daten,$parent_id = NULL, $indent=0)
{
        $empty = true;
        $indentstring = str_repeat('  ', $indent);
        foreach($daten as $id => $value )
        {
            if ($value['parent_id'] == $parent_id)
            {      
                if($empty == true)
                {
                
                 $empty = false;
               
                 echo $indentstring .'<ul>' . "\n";
                      
                }
                
                echo $indentstring.'  <li>'."\n";
                echo $indentstring.'    <a href="'.$_SERVER['PHP_SELF'].'?goto='.$id.'">'.$value['cat_name'].'</a>'."\n";
                echo $indentstring.'  </li>'."\n";
                
                if(isset($_SESSION['tree_cat'])){
                  $array = unserialize($_SESSION['tree_cat']);
                } else {
                  $array = array('');
                }

                if(in_array($id,$array)){
                cat_tree($daten,$id,$indent+2);
                }
            }
        }
        if($empty == false)
        {
        
            echo $indentstring .'</ul>' . "\n";
          
        }
}

// ................................................................
// .....jedesmal beim klicken einer kategorie folgendes machen.....
// ................................................................
if(isset($_GET['goto'])){
$id=$_GET['goto'];
if(isset($_SESSION['tree_cat'])){
  $array = unserialize($_SESSION['tree_cat']);
} else {
  $array = array('');
}
if(!in_array($id,$array)){
  $array[] = $id;
} else {
  $d_array = array_keys($array, $id);
  for($i=0;$i<count($d_array);$i++){
    unset($array[$d_array[$i]]);
  }
}

$_SESSION['tree_cat'] = serialize($array);

cat_tree($daten);
} else {
cat_tree($daten);
}
?>
 

BasicAvid

Member
Probier ich dann gleich mal aus! Danke schon mal!

Es funzt!!! :D :D

Hab nochmal komplett neu angefangen und jetzt gehts!
Hier ist mal der Code vielleicht kann Ihn ja jemand brauchen!
PHP:
function testrek($id,$pos,$do="no",$kat=0)
{
	global $clicked,$katid,$hkat;
	if(isset($hkat))
		$katid = $hkat;
	$query=mysql_query("SELECT * FROM `produktcms_kat` WHERE subkat='$id' ORDER by rang");
	while($kat=mysql_fetch_array($query))
	{
		if($do=='yes' && $kat[subkat]==0)
		{
			//echo "<a href='test_rek.php?clicked=1&katid=".$kat[katid]."'>".$kat[bezeichnung]."</a><br/>";
			print '<table width="212" border="0" cellspacing="0" cellpadding="2">'; 
		    print '<tr><td width="16" bgcolor="#C7D6F1"';
			if($katid!=$kat[katid]) print ' class="linesubnav"';
			print '><img src="img_allg/icon_subnav.gif" width="16" height="8" border="0"></td>';
		    print '<td align="left" bgcolor="#C7D6F1"';
			if($katid!=$kat[katid]) print  ' class="linesubnav"';
		    print '><a href="produkte_uebersicht.php?katid='.$kat[katid].'&clicked=1&subkat='.$kat[subkat].'" class="subnav">';
		    print  $kat[bezeichnung].'</a></td><tr></table>';
			if($clicked==1 && $kat == 1 || $katid==$kat[katid] || $hkat==$kat[katid])
			{
				testrek($katid,$pos+3,"no",1);
			}
		}
		else
		{
			if($kat!=1)
			{
				//echo linie($pos);
				//echo $kat[bezeichnung],"<br/>";
				print '<table width="212" cellpadding="1" border="0" cellspacing="0" bgcolor="#C7D6F1">';
		        print '<tr valign="top">';
		        echo linie($pos,"<td>&nbsp</td>");
		        print '<td width="17" align="right" valign="top">';
		        print '<img src="img_allg/icon_subnavkl.gif" width="12" height="10" border="0"></td>';
		        print '<td width="189" align="left"><a href="produkte_uebersicht.php?katid='.$kat[katid].'&hkat='.$katid.'&clicked=1&subkat='.$kat[subkat].'" class="subnavkl">'.$kat[bezeichnung].'</a></td>';
		        print '</tr>';
		        print "</table>\n";  
				testrek($kat[katid],$pos+3,"no",1);
			}
		}
		
	}
}
 

BasicAvid

Member
:D
Ja, hat er! Hab zwar von deinem Code nichts genommen aber als ich mir deinen Code angeschaut habe, hats bei Klick gemacht und es ging!!

DANKE!!!!
 
Oben