"We are back" « oc.at

PHP: Bitte um Denkanstoss für Tree Menu

Bogus 17.12.2009 - 10:35 1466 10
Posts

Bogus

C64 Generation
Avatar
Registered: Mar 2006
Location: Graz
Posts: 3171
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
Registered: Jun 2002
Location: Berndorf, NÖ
Posts: 3236
gibts auch links in die rückrichtung, also weiß ein ordner auch wer seine childs sind?

Bogus

C64 Generation
Avatar
Registered: Mar 2006
Location: Graz
Posts: 3171
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:

Code: PHP
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
Avatar
Registered: Jan 2002
Location: Scotland
Posts: 13496
Mein Denkanstoß:
Code: PHP
<?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
Avatar
Registered: Mar 2006
Location: Graz
Posts: 3171
owned ;)

Spikx

My Little Pwny
Avatar
Registered: Jan 2002
Location: Scotland
Posts: 13496
Jo, hab zu lange gebraucht :D. Aber kann dir ja trotzdem noch dienlich sein, wenn du das in Klassen verpacken willst.

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25691
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
Avatar
Registered: Mar 2006
Location: Graz
Posts: 3171
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
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14863
trees mit jquery sind extrem einfach, solang du ned "fancy stuff" wie lazy loading willst

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25691
Zitat von Bogus
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
Avatar
Registered: Mar 2006
Location: Graz
Posts: 3171
hab den oben geposteten code inzwischen überarbeitet und auf eine einzelne funktion optimiert. geht eh ganz einfach ;)

danke für deine tipps!
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz