PHP: Bitte um Denkanstoss für Tree Menu

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/php_bitte_um_denkanstoss_fuer_tree_menu_212754/page_1 - zur Vollversion wechseln!


Bogus schrieb am 17.12.2009 um 10:35

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=- schrieb am 17.12.2009 um 12:48

gibts auch links in die rückrichtung, also weiß ein ordner auch wer seine childs sind?


Bogus schrieb am 17.12.2009 um 12:53

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 schrieb am 17.12.2009 um 12:55

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 schrieb am 17.12.2009 um 13:08

owned ;)


Spikx schrieb am 17.12.2009 um 13:29

Jo, hab zu lange gebraucht :D. Aber kann dir ja trotzdem noch dienlich sein, wenn du das in Klassen verpacken willst.


mat schrieb am 19.12.2009 um 13:14

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 schrieb am 21.12.2009 um 00:35

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 schrieb am 21.12.2009 um 01:20

trees mit jquery sind extrem einfach, solang du ned "fancy stuff" wie lazy loading willst


mat schrieb am 21.12.2009 um 09:53

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 schrieb am 21.12.2009 um 10:04

hab den oben geposteten code inzwischen überarbeitet und auf eine einzelne funktion optimiert. geht eh ganz einfach ;)

danke für deine tipps!




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025