php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2005

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 05.05.2005, 16:36  
Gast
 
Beiträge: n/a
Standard Problem mit meinem Menübaum

Hallo!
Habe schon die Suche verwendet und bin auf nested sets gestoßen. Nunja, hab das ganze nicht verstanden und finds auch viel zu aufwendig.

habe somit angefangen eine eigene funktion zu schreiben :

einmal die funktion "get_parent_ids", die eine id eines eintrags aus der tabelle nimmt und schaut welche eltern elemente sie hat.

erst einmal den tabellenaufbau :
id int auto_increment primary key
cat_name VARCHAR,
parent_id int

dies wird in ein array eingelesen, was dann durchgeschickt wird:
PHP-Code:
<?php
    $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'];
        
    }
?>
PHP-Code:
<?php
function get_parent_ids($data$id)
    {
      if (
$id == NULL//no parents, because 0 is root level
    
{    //return empty array
        
return array();
    }    
    
//return the parents id and the parent ids of the parent, merged to one array
    
return array_merge(
            array(
$data[$id]['parent_id']),
            
get_parent_ids($data$data[$id]['parent_id'])
            );
  }

?>
und dann habe ich eine funktion die mir das menü zurück gibt. ( jedoch komplett ausgeklappt ):
PHP-Code:
<?php
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.'[*]'."\n";
                echo 
$indentstring.'    [url="'.$_SERVER['PHP_SELF'].'?goto='.$id.'"]'.$value['cat_name'].'[/url]'."\n";
                echo 
$indentstring.'  '."\n";
                
cat_tree($daten,$id,$indent+2);
            }
        }
        if(
$empty == false)
        {
        
            echo 
$indentstring .'[/list]' "\n";
          
        }
    }  

?>

und so sieht der teil aus, der alle elternelemente des kindes +kinder anzeigt:
PHP-Code:
<?php
            
if(isset($_GET['goto']) && ($parents_set==0))
            {
                foreach(
$daten as $key => $value)
                {
                    if(
$value['parent_id'] !== NULL ) {  
                      
                        if(
in_array($key,$parents get_parent_ids($daten,$_GET['goto'])))
                        {
                            print 
'<ul>[*][url="'.$_SERVER['PHP_SELF'].'?goto='.$key.'"]'.$value['cat_name'].'[/url]';
                            
$count_ul $key;
                        }
                    }
                }
                foreach(
$daten as $key => $value)
                {
                    
                    if(
$empty == true)
                    {
                        
                        
$empty false;
                        
                        echo 
'<ul>' "\n";
                    
                    }
                    if(
$_GET['goto'] == $value['parent_id'])
                    {
                        print 
'[*][url="'.$_SERVER['PHP_SELF'].'?goto='.$key.'"]'.$value['cat_name'].'[/url]';
                    }
                }
                
                if(
$empty == false)
                {
                
                    
$empty == true;  
                    
                    echo 
'[/list]' "\n";
                        
                }
                if(isset(
$count_ul))
                {
                   
                    for(
$i 0$i $count_ul$i++)
                    {
                    
                        print 
'[/list]';
                        
                    }
                    
                }
            }
?>
und nun versuche ich gerade es möglich zu machen, dass menü auszuklappen. dafür hab ich auch die funktion get_parent_ids geschrieben, damit ich weiß ,welche elemente bereits ausgeklappt sein müssen.
naja und ich kann die elemente ausgeben lassen, die mit dem unterelement verbunden sind etc und auch die anderen. nur steht jez immer das ausgeklappte ganz oben und der rest KOMPLETT unten, d.h. auch noch mal die wiederholung von dem was bereits oben steht.
nun würde ich gerne wissen wie ich die funktion schreiben muss, damit ich das menü wie bei cat_tree() habe, nur halt eingeklappt, mit der möglichkeit die unterkategorien auszuklappen.
danke . mfg Runsky
 
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 05.05.2005, 16:51  
Gast
 
Beiträge: n/a
Standard Re: Problem mit meinem Menübaum

Zitat:
Zitat von Runsky
Habe schon die Suche verwendet und bin auf nested sets gestoßen. Nunja, hab das ganze nicht verstanden und finds auch viel zu aufwendig.
Das sieht man Deinem Script auch an, daß Du nested sets nicht verstanden hast. Zumal man ja nich weiß, was Du so alles an Texten gelesen hast.

Guck Dir das mal an:
http://www.klempert.de/php/nested_sets/

Generell hast Du aber das Problem, wenn Du einen Ast bis zu einem Node ausklappen willst. Das geht nur sinnvoll über spezielle SQL Abfragen:
1. rootliste abfordern
2. wenn der Ast kommt, dann die Childs bis zum Node per SQL abfragen.

Willst Du aber nur ein Menü präsentieren, dann solltest Du Dir unbedingt das angucken:
http://www.ulf-wendel.de/projekte/menu/index.php
 
Alt 05.05.2005, 17:20  
Gast
 
Beiträge: n/a
Standard

naja, aber ich würd jez gerne bei meinem weiter machen. cat_tree() funzt ja. das menü wird einwandfrei angezeigt.
nur ausklappbar sollte es noch sein. falls jemand ne idee hat wie ich das machen soll, bitte her mit der idee
 
Alt 05.05.2005, 17:22  
Gast
 
Beiträge: n/a
Standard

Zitat:
falls jemand ne idee hat wie ich das machen soll, bitte her mit der idee
Du hattest also Du meinen Text nicht gelesen und bist den Links nicht gefolgt - gut zu wissen, für wen ich mir keine Arbeit mehr mache.
 
Alt 05.05.2005, 17:24  
Gast
 
Beiträge: n/a
Standard

ich habe mir die links angeschaut. den 1. würd ich eh nicht verstehen, habs also gleich sein gelassen. das 2. war komplett anders aufgebaut als meins.
ich sitze seit mehreren tagen an der funktion. ich fänds halt schade wenn die arbeit umsonst war.

wie bereits gesagt, funktioniert die ausgabe ja, es fehlt nur noch das ausklappen. dafür hät ich gern hilfe. ich will kein neues prinzip für meinen baum...
 
Alt 05.05.2005, 22:34  
Gast
 
Beiträge: n/a
Standard

FERTIG!
habe jemanden gefragtr und der kam auf diese äußerst simple lösung
PHP-Code:
<?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.'[*]'."\n";
                echo 
$indentstring.'    [url="'.$_SERVER['PHP_SELF'].'?goto='.$id.'"]'.$value['cat_name'].'[/url]'."\n";
                echo 
$indentstring.'  '."\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 .'[/list]' "\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);
}
?>
 
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Galerie Problem... coraplanet PHP Tipps 2008 4 06.06.2008 13:42
Sessions Problem StephenKing PHP Tipps 2008 3 16.10.2007 08:30
datensätze defekt oder problem mit dem einlesen? Ministry Datenbanken 4 06.07.2006 18:42
problem!!! PHP Tipps 2006 6 08.02.2006 11:06
[Erledigt] wieder ein Problem bei phpmailer und smtp PHP Tipps 2006 24 07.02.2006 01:07
[Erledigt] Problem bei Massenmails versenden mit der Funktion mail PHP-Fortgeschrittene 3 19.01.2005 13:36
[Erledigt] Problem mit Übergabe einer Klasse in PHP4 PHP-Fortgeschrittene 10 08.01.2005 21:00
Problem mit Weiterleitung PHP Tipps 2004-2 16 22.12.2004 17:49
Smarty und PHP-Skript Problem PHP Tipps 2004-2 2 03.12.2004 22:27
[Erledigt] PHP Upload (Master Value/Local Value Problem) PHP-Fortgeschrittene 5 23.11.2004 07:21
Problem mit alter JavaScript-Funktion woods PHP Tipps 2004 1 13.08.2004 13:34
[Erledigt] Problem mit Timestamp! PHP Tipps 2004 24 08.06.2004 19:51
Login Problem PHP Tipps 2004 4 04.06.2004 18:46
foreach problem mAy^daY PHP Tipps 2004 3 02.06.2004 20:29

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
if id = array, php menübaum parent nested set

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:15 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.