Treeview: Auf- und Zuklappen

print147

Grünschnabel
Hallo liebe PHP-Programmierer,
Ich habe auf rekursivem Wege ein Menü mit unbestimmter Tiefe erstellt.

Problem: Durch Anklicken des Icons oder Links einer Hauptkategorie M sollen alle untergeordneten Kategorien S derselben Hierarchieebene ein- und ausgeblendet werden können. Bei der übergeordnetem Kategorie muß das Icon gewechselt werden. (von closedFolder in openFolder und umgekehrt).

Ich habe verschiedene Javascript-Lösungsansätze durchprobiert, komme jedoch nicht weiter. Ich hoffe, dass mir jemand von Euch mit einem gezielten Lösungsvorschlag weiterhelfen kann. Kategorien ohne Kinder sind Unterkategorien und werden mit S wie („Sub“) gekennzeichnet.

Legend: mgr = Menügruppe, pid=parentid, child=Anzahl der Kinder, M=Hauptkategorie, S=Unterkategorie, lev=level, id=Kategorien-Id.

Die Icon_Urls Die Icons werden per Formular in die Datenbank eingetragen.
Kategorien(Anzahl Kinder)

Kategorien mgr haupt hier lev id pid child
+cms(3) 1 M 1 1 1 0 3
-cms_1 1 S 2 1 2 1 0
-cms_2 1 S 2 2 3 1 0
-cms_3 1 S 2 3 4 1 0
+webshops(3) 2 M 1 2 5 0 3
+websho_1(1) 2 M 2 1 6 5 1
-websh_1_1 2 S 3 1 8 6 0
-websh_2 2 S 2 2 7 5 0

HTML:
<!doctype html public "-//W3C//DTD HTML 4.0 //EN">
<html>
<head>
<title>Control-Panel: Customize multilevel categories and subcategories!</title>
<style type="text/css">
table {width: 400px;}
</style>
<script language="javascript">
function toggle(obj)
{
if (obj.nextSibling)
{
obj.firstChild.src = (obj.nextSibling.style.display == 'none') ? 'images/collapse.gif' : 'images/expand.gif';
obj.firstChild.alt = (obj.nextSibling.style.display == 'none') ? 'Minimieren' : 'Maximieren';
obj.nextSibling.style.display = (obj.nextSibling.style.display == 'none') ? 'block' : 'none';
}
}
</script>
</head>
<body>
<?php
include("./connect.php");
function drawMenu($id=0, $space="", $level=1)
{
$query = "SELECT * FROM menu WHERE parent=$id ORDER BY ID ASC";
$result = mysql_query($query);
if($id <1)
{
$menu = ("<table class='controlpanel' border='1'>");
$menu .= ("<tr><td class='titel'><a href='pfad_1.php?action=Kategorien'>Kategorien</a></td>");
$menu .= ("<td class='titel'>mgr</td>");
$menu .= ("<td class='titel'>haupt</td>");
$menu .= ("<td class='titel'>hier</td>");
$menu .= ("<td class='titel'>lev</td>");
$menu .= ("<td class='titel'>id</td>");
$menu .= ("<td class='titel'>pid</td>");
$menu .= ("<td class='titel'>child</td></tr>");
}
while($row = @mysql_fetch_array($result))
{
/*
Liste in Kammern hinter allen Kategorien die bereinigte Anzahl der Kinder auf,
die Unterkategorien haben oder die ParentID null besitzen und freigegeben sind.
*/
if($row['children']>0 or $row['parent']<=0)
{
$menu .= ("<tr><td class='rubrik' width='220px'>");
$menu .= ($space." <img id='1' src='$row[icon_name]' onClick=\"toggle($row[ID])\" border='0' ");
$menu .= ("hspace='1' vspace='0' align='middle'>");
$menu .= ("<a href='pfad_1.php'> $row[name] ($row[children])</a></td>");
}
elseif($row['haupt']='S')
{
$menu .= ("<tr id=$row[ID]><td class='rubrik' width='220px'>");
//Name und Pfad des Icons
$menu .= ($space." <img id='2' src='$row[icon_name]' border='0' ");
$menu .= ("hspace='1' vspace='0' align='middle'> ");
$menu .= ("$row[name]</td>"); //Name der (Unter-)Kategorie
}
else
{}
$menu .= ("<td class='parameter'>$row[mgr]</td>"); //Menügruppe
$menu .= ("<td class='parameter'>$row[haupt]</td>"); //Haupt- oder Unterkategorie
$menu .= ("<td class='parameter'>$row[hier]</td>"); //Hierarchiestufe
$menu .= ("<td class='parameter'>".$level++."</td>"); //Level
$menu .= ("<td class='parameter'>$row[ID]</td>"); //Kategorien_ID
$menu .= ("<td class='parameter'>$row[parent]</td>"); //Parentid
$menu .= ("<td class='parameter'>$row[children]</td>"); //Anzahl der Kinder der (Unter-)Kategorie
$menu .= drawMenu($row['ID'], ($space)."&nbsp;&nbsp;&nbsp;");
}
return $menu;
}
echo drawMenu();
$menu .= ("</table>");
 
?>
</body>
</html>
 
Hallo,
hab mal schnell ein Script geschrieben, welches diese TreeMenu mit Daten aus einer MySQL Datenbank füllt.

Hoffe das ist das was du suchst.

mfg
forsterm
 

Anhänge

forsterm, danke für das tolle Menu. Dein Beispiel funktioniert auch prima.
Frage: Funktioniert das Ganze auch bei einer rekursiven Baumstruktur (vgl. Code in meinem Posting)? Ich habe das div als HTML-Code eingebaut und den JS-Aufruf gesetzt. Aber die Baumstruktur wird nicht ausgegeben.Was muß ich codemäßig ändern?
 
Zurück