PHP: Bitte um Denkanstoss für Tree Menu
Bogus 17.12.2009 - 10:35 1466 10
Bogus
C64 Generation
|
hi ich bin sooo rostig  mache gerade eine tree/ ordner struktur. diese kann beliebig tief sein. es wird einfach zu jedem ordner (kategorie) ein feld 'parent_id' gesetzt. soweit alles klar. hab ich schon unzählige male gemacht. neu ist nun: ich möchte das ganze als tree-view ausgeben. so wie zb. das ordner-fenster in windows. ich stehe da aber gerade voll auf der leitung (vielleicht hilft ja das schreiben hier  wie soll ich das auswerten das ein tree-view entsteht....... vielleicht hat ja jemand nen denkanstoß für mich. TIA
|
Neo-=IuE=-
Here to stay
|
gibts auch links in die rückrichtung, also weiß ein ordner auch wer seine childs sind?
|
Bogus
C64 Generation
|
nein. aber das schreiben hier hat geholfen. ich hab jetzt einfach ne funktion die erstmal nur die root-categories (also ohne parent_id) ausliest und abarbeitet. die zweite funktion sucht die childs jeder einzelnen kategorie und referenziert auf sich selbst. fall's jemand mal sowas braucht: function build_rt_tree () {
global $db_name, $dbn_rt;
unset($html);
$sql = "SELECT rt_id, rt_titel
FROM $dbn_rt
WHERE rt_parent_rt_id='0'
ORDER BY rt_titel";
rem($sql);
$query = mysql_db_query($db_name, $sql) or print_error(mysql_error());
while ($row = mysql_fetch_array($query)) {
$html .= "$row[rt_titel]<br>";
$subcat_prefix = "";
$html .= get_rt_subcategories($row[rt_id], $subcat_prefix);
}
return $html;
}
function get_rt_subcategories ($rt_id, $subcat_prefix) {
global $db_name, $dbn_rt;
$sql = "SELECT rt_id, rt_titel
FROM $dbn_rt
WHERE rt_parent_rt_id='$rt_id'";
rem($sql);
$subcat_query = mysql_db_query($db_name, $sql) or print_error(mysql_error());
if (mysql_num_rows($subcat_query) > 0) {
$subcat_prefix .= "-";
while ($subcat_row = mysql_fetch_array($subcat_query)) {
$html .= "$subcat_prefix $subcat_row[rt_titel]<br>";
$html .= get_rt_subcategories($subcat_row[rt_id], $subcat_prefix);
}
}
return $html;
}
|
Spikx
My Little Pwny
|
Mein Denkanstoß: <?php
class Foo
{
...
function draw()
{
echo /* title */;
echo '<div style="margin-left:20px;">';
foreach($this->getChildren() as $c)
$c->draw();
echo '</div>';
}
...
}
?>
|
Bogus
C64 Generation
|
owned
|
Spikx
My Little Pwny
|
Jo, hab zu lange gebraucht  . Aber kann dir ja trotzdem noch dienlich sein, wenn du das in Klassen verpacken willst.
|
mat
AdministratorLegends never die
|
Würde bei Tree-Views (besonders in deinem Fall  ) auf AJAX setzen. JQuery hat eine nette Implementation dafür. Btw, je nach tiefe deiner Datenstruktur würde ich neben einer Parent-Child-Beziehung auch auf "Nested Sets" setzen. Beschleunigt das Auffinden des Node-Pfades oder der Kinder eines gesamten Asts ungemein.
|
Bogus
C64 Generation
|
in normalfall sind's maximal 3 ebenen. vorläufig für ca 5 hauptebenen. diese sind auch maximal in 3-4 weitere unterteilt. also mehr aufwand als nutzen eigentlich. aber es soll ja benutzerfreundlich sein  (bin nicht der typ der in diesem fall die tiefe fix vorgeben will) aber da du jquery jetzt schon 2x genannt hast, muss ich mir 'das' wohl mal ansehen ... wenn ich deine 'nested sets' richtig interpretiere, dann hab ich das eh bereits vorgehesen. meinst du: jeder datensatz soll auch seinen gesamten pfad wissen?
|
semteX
hasst die KI
|
trees mit jquery sind extrem einfach, solang du ned "fancy stuff" wie lazy loading willst
|
mat
AdministratorLegends never die
|
wenn ich deine 'nested sets' richtig interpretiere, dann hab ich das eh bereits vorgehesen. meinst du: jeder datensatz soll auch seinen gesamten pfad wissen? http://dev.mysql.com/tech-resources/articles/hierarchical-data.html Aber wenn du nur maximal drei Ebenen hast, dann würde ich mit LEFT JOIN arbeiten und den Table einfach öfters verketten. Spart einiges an Programmieraufwand.
|
Bogus
C64 Generation
|
hab den oben geposteten code inzwischen überarbeitet und auf eine einzelne funktion optimiert. geht eh ganz einfach  danke für deine tipps!
|