Fragen zu Nested Sets

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Fragen zu Nested Sets

    Hallo liebe Community freunde ich habe jetzt schon so viele Fragen zu Nested Sets gelesen das ich mich um dieses Thema bemüht habe.
    Ich habe das Modul Nested Sets gelesen. und habe dementsprechen die Datenbank aufgebaut:

    Code:
    CREATE TABLE `node` (
      `node_id` int(10) unsigned NOT NULL auto_increment,
      `root_id` int(10) unsigned NOT NULL default '0',
      `payload` varchar(64) default NULL,
      `lft` int(10) unsigned NOT NULL default '0',
      `rgt` int(10) unsigned NOT NULL default '0',
      PRIMARY KEY  (`node_id`),
      KEY `root_id` (`root_id`)
    ) TYPE=MyISAM AUTO_INCREMENT=5 ;
    
    #
    # Daten für Tabelle `node`
    #
    
    INSERT INTO `node` VALUES (1, 1, 'A', 1, 8);
    INSERT INTO `node` VALUES (2, 1, 'B', 2, 7);
    INSERT INTO `node` VALUES (3, 1, 'C', 3, 4);
    INSERT INTO `node` VALUES (4, 1, 'D', 5, 6);
    Ich habe auch einen Test eintrag duchgeführt!

    So jetzt habe ich die MySQL abfrage gestartet womit alle Childs und Levels ausgegeben werden.

    Code:
    SELECT node1.payload,
            IF ( node1.node_id = node1.root_id,
                round( (node1.rgt - 2) / 2, 0),
                round( ( (node1.rgt - node1.lft - 1) / 2), 0)
            ) AS children,
            COUNT(*) AS level
    
        FROM node AS node1,
             node AS node2
     
        WHERE node1.root_id = ".$id."
        AND node2.root_id = ".$id."
    
        AND node1.lft BETWEEN node2.lft AND node2.rgt 
    
        GROUP BY node1.LFT;
    dabei werden alle Datenfelder ausgegeben.

    Jezt stellt sich die eine Frage wie implementiere ich das Ganze in Php so das eine Menuestrucktur ausgegeben wird und die jeweiligen Childs eines Knotens jeweils nach einem klick angezeigt werden.

    Die Abstände, die nach jedem Knoten kommen der seine Chils anzeigt
    kann mann ganz leicht erstellen indem mann pro Level eine bestimmte anzahl an Leerzeichen oder andere Zeichen ausgibt:

    PHP-Code:

    while ($level <= 1)
    {
         echo 
    "&nbsp;";
         
    $level $level 1;

    somit fügt man für jedes Level einen Leezeichen ein bis die Levelanzahl 1 ist. Level 1 bedeutet des oberste node Level 2 die childs von dem Node in Level eins. (wir reden hier von einem Baum wie in der DB eingefügt)

    Demnach sehen die Levels und die Chils in den beschriebenen Inserts so aus:
    Code:
    payload  children  LEVEL  
    A              3        1 
    B              2        2 
    C              0        3 
    D              0        3
    ________________________________________________-

    Jetzt ist die Frage wie man das ganze in PHP Inplementiert.
    Ich habe einen ansatz geleistet und würde mich freuen wenn dieses Script in zusammen arbeit alle Nested Sets Fragen Löst damit alle ein Tutorial haben um eine Baumstrucktur zu erstellen.

    Mein ansatz war es erstmals die Ganzen Haupelemente aufzurufen. also die Nodes im Level 1.

    PHP-Code:

    // MENULEISTE   
        
    $query_hauptstrucktur     " SELECT * FROM node WHERE node_id = root_id ORDER BY `node_id` ASC  LIMIT 0 , 30";
        
    $result_hauptstrucktur    = @mysql_query($query_hauptstrucktur);
        
    $num_hauptstrucktur        = @mysql_num_rows($result_hauptstrucktur);
        
        if (
    $num_hauptstrucktur  1) {} else
        {
            for (
    $i =0$i $num_hauptstrucktur$i++)
            {
                
    $row_hauptstrucktur   =   @mysql_fetch_object($result_hauptstrucktur);
                echo 
    "<a href=menue.php?id=".$row_hauptstrucktur->node_id."&level=2>" $row_hauptstrucktur->payload."</a><br>";
                if ((
    $_REQUEST['level'] != 1) && ($_REQUEST['id']==$row_hauptstrucktur->node_id))
                {
                    
    submenues($_REQUEST['id'], $_REQUEST['level']);
                }
            }
        } 
    Hier übergebe ich in einem Link die Level Nummer und die ID die die Childs dieses Nodes Ausgeben sollen.

    Die Funktion Submenue soll die Jeweiligen Childs mit der ID 2 Anzeigen und diese als echo unter das Haupmenue mit der selben root_id anzeigen.

    PHP-Code:
    function submenues ($id$level) {
        
    $query_sub_menu     =
        
    "SELECT node1.payload,
            IF ( node1.node_id = node1.root_id,
                round( (node1.rgt - 2) / 2, 0),
                round( ( (node1.rgt - node1.lft - 1) / 2), 0)
            ) AS children,
            COUNT(*) AS level

        FROM node AS node1,
             node AS node2
     
        WHERE node1.root_id = "
    .$id."
        AND node2.root_id = "
    .$id."

        AND node1.lft BETWEEN node2.lft AND node2.rgt 

        GROUP BY node1.LFT;"
    ;

        
    $result_sub_menu    = @mysql_query($query_sub_menu);
        
    $num_sub_menu        = @mysql_num_rows($result_sub_menu);
        if (
    $num_sub_menu  1) {} else
        {
            for (
    $i =0$i $num_sub_menu$i++)
            {
                
    $row_sub_menu   =   @mysql_fetch_object($result_sub_menu);
                if (
    $level 2)
                {
                    
    $count 2;
                while (
    $level == $count)
                {
                    
                }
                }
                if (
    $level == $row_sub_menu->level)
                {
                        if (
    $row_sub_menu->children == 0)
                        {
                            echo 
    $row_sub_menu->payload $row_sub_menu->children $row_sub_menu->level ."<br>" ;
                        } else
                        {
                            
    $setlevel $level 1;
                            echo 
    "<a href=menue.php?id=".$id."&level=".$setlevel.">".$row_sub_menu->payload."</a><br>";
                        }
                }
            }
        }

    So bis hierhin bin ich ge kommen!
    ich habe aber leider das Problem wenn ich auf den link im 2. Level Drücke verschwinden die Elemente vom 2. Level und es kommen die Elemente vom 3. Level zum erscheinen. Dies soll aber nicht so sein wenn ich die elemente im 2. Level anklicke sollen die elemente im 2. Level und die Elemente im 3. Level zu sehen sein. Die elemente im 1. Level werden ja sowieso durch meine erste MySQL abrage angezeigt.


    Ich würde mich freuen wenn viele Leute an diesem Eintrag teinehmen könnten damit hier ein gutes Tutorium entsteht. Ich bitte nur einträge zu machen die diesem Thema weiterhelfen und keine unsinnigen angaben zu machen!


    Danke nochmals Gruß

    acarweb

  • #2
    Re: NESTED SETS Bitte um Teilnahme

    ist doch völliger unfug, hier schon eine umfrage zu starten, bevor nicht einmal dein problem gelöst ist. deshalb -> umfrage gelöscht


    wenn dein problem gelöst ist und du nested sets richtig gut verstanden hast, kannst du ja gerne mal ein richtiges tutorial dazu erstellen.

    aber die umfrage hier erscheint mir eher aus dem grunde entstanden zu sein, weil du dieses feature auch mal ausprobieren wolltest ...
    Zuletzt geändert von wahsaga; 12.10.2004, 17:15.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar

    Lädt...
    X