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:
Ich habe auch einen Test eintrag duchgeführt!
So jetzt habe ich die MySQL abfrage gestartet womit alle Childs und Levels ausgegeben werden.
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:
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:
________________________________________________-
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.
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.
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
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);
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;
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 " ";
$level = $level - 1;
}
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']);
}
}
}
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>";
}
}
}
}
}
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
Kommentar