designer-ag
andre göntgen

duisburgerstr.16
53909 zülpich (nrw)

fon: 02252 833 229
fax: 02252 833 227

Artikel

... it-intelligence

Menüstruktur mit unendlich vielen Ebenen

Wie programmiert und verwaltet man ein Menü mit mehreren Ebenen?
Entweder braucht man eine sehr komplexe Datenbank und eine
äusserst komplizierte Menüverwaltung im Administrationsbereich oder
ein Menüscript das den Menüaufbau perfekt beherrscht.

Wir haben uns diesem Problem gewidmet und ein Script zur Menügenerierung
programmiert, das leicht zu integrieren ist und eine einfache Datenbank benötigt. Das Script kann ganz simple in jede Seite eingebunden werden, z.B. mit include "menu.php";.

Es benötigt nur wenige Informationen:
$menu=0 #Diese Variable wird benötigt wenn mehrere Menüs vorhanden sind.
$id=0 #Der aktive Menüpunkt

Die Tabellenstruktur in der Datenbank sieht wie folgt aus:
idmenuparent_idorder_idnamesichtbar

Beispieldaten: (nur benötigte Zellen, Tabellenname="navigation")
idmenuparent_idorder_idnamesichtbar
1000Home1
2001Test1
3020Tester1
4002Hidden0
5030Profil0
6003Kontakt1
idmenuparent_idorder_idnamesichtbar

Erläuterung der Zellen:
id = laufende Nummer (Autoincrement-Zelle) ($id=0)
menu = erlaubt mehrere Menüs in einer Tabelle zu verwalten, ($menu=0)
parent_id = (0 » "Hauptmenüpunkt") (>0 » "Untermenüpunkt")
order_id = legt die Sortierung der Menüpunkte fest, auch innerhalb Unterpunkte!
name = der Text des Menüpunktes der angezeigt wird.
sichtbar = Menüpunkt sichtbar (1) oder nicht sichtbar (0), deaktiviert nicht Unterpunkte!
Demnach gäbe es folgende Menüstruktur:
>Home
>Test
  >Tester
    >Profil
>Kontakt

Hier ist eine Demo mit 2 Menüs.

Das Script:

001 if (!isset($id)) {
002  $result=mysql_query("select id from navigation where `menu`='$menu' order by id limit 0,1");
003  mysql_data_seek ($result, 0); $row = mysql_fetch_row($result);
004  $id=$row[0];
005 }
006 
007 ### parent_id der gewählten Seite holen
008 $result=mysql_query("select parent_id from navigation where `id`='$id'");
009 mysql_data_seek ($result, 0); $row = mysql_fetch_row($result);
010 $parent_id=$row[0];
011 
012 ### menü in ein Array rein
013 $array=array();
014 $array[0]=getlevel(0);
015 
016 ### menü bauen
017 $level=0;
018 $childs=explode(",",parents($id,""));
019 $childs[]=$id;
020 drawmenu($array[0],$level);
021 
022 ### Functionen
023 if (function_exists('drawmenu')) {
024  return;
025 }
026 function drawmenu($array,$level) {
027   for ($i=0; $i<=sizeof($array); $i++) {
028   if (is_array($array[$i])) {
029    drawmenu($array[$i],$level+1);
030   } else if ($array[$i]>"") {
031    zeigemenupunkt($array[$i],$level-($i==0 ? 1:0));
032   }
033  }
034 }
035 
036 function zeigemenupunkt($mid,$level) {
037  global $parent_id,$childs,$id,$pfad;
038  $result=mysql_query("select name,parent_id,id,sichtbar,nav_path from navigation where `id`='$mid'");
039  mysql_data_seek ($result, 0); $row = mysql_fetch_row($result);
040  if ($row[3]==0) {return;}
041  $childstemp=explode(",",parents($id,""));
042  if (in_array($mid,$childs) or $row[1]==0 or $id==$row[1] or $parent_id==$row[1] or in_array($row[1],$childstemp)) {
043 ################################################################################
044   echo str_repeat("»",$level).($mid==$id ? '<b>':'').'<a href="'.$pfad.$row[4].'">'.$row[0].($mid==$id ? '</b>':'').'</a><br>';
045 ################################################################################
046  }
047 }
048 
049 function ischild($aid) {
050  global $id;
051  $result=mysql_query("select parent_id from navigation where `id`='$aid'");
052  mysql_data_seek ($result, 0); $row = mysql_fetch_row($result);
053  if ($row[0]==0 or $row[0]==$id) {
054   return 1;
055  } else {
056   return 0;
057  }
058 }
059 
060 function parents($id,$parents) {
061  $result=mysql_query("select parent_id from navigation where `id`='$id'");
062  mysql_data_seek ($result, 0); $row = mysql_fetch_row($result);
063  if ($row[0]>0) {
064   $parents.=",".$row[0];
065   $parents.=",".parents($row[0],"");
066  }
067  return str_replace(",,",",",$parents);
068 }
069 
070 function getlevel($parent) {
071  global $id,$menu;
072  $ret=array();
073 $result=mysql_query("select id from navigation where `menu`='$menu' and `parent_id`='$parent' order by order_id");
074  for ($i=0; $i<mysql_num_rows($result); $i++) {
075   mysql_data_seek ($result, $i); $row = mysql_fetch_row($result);
076  if (mysql_num_rows(mysql_query("select id from navigation where `parent_id`='$row[0]' order by order_id"))) {
077     $ret[$i+1]=getlevel($row[0]);
078     array_unshift($ret[$i+1],$row[0]);
079   } else {
080    $ret[$i+1]=$row[0];
081   }
082  }
083  return $ret;
084 }

Informationen zum Script:

Zeile 001:prüft ob $id vorhanden ist, wenn nicht wird der kleinste Wert aus
der DB genommen (Homepage)
Zeile 008:setzt die Variable $parent_id
Zeile 014:Menü in ein Array ablegen
Zeile 020:Ausgabe des Menüs veranlassen
Funktionen:
drawmenu()geht durch das ganze Array und ruft sich selber
oder die Funktion zeigemenupunkt() auf.
zeigemenupunkt()Entscheided ob ein Menüpunkt angezeigt wird
und macht die Ausgabe.
Hier muß das Script an die eingenen Bedürfnisse angepasst werden.
Zeile 044:macht die Ausgabe des Menüpunkts. Dazu stehen folgende Variablen zur Verfügung:
$level:enthält die "Ebene 0 bis ...
$mid==$id:aktueller Menüpunkt
$pfad.$row[4]Link des Menüpunktes ($pfad wird nur benötigt wenn die Homepage in einem Ordner liegt.
News09.09.2010
C64-Emulator fürs iPhone fliegt wieder aus dem App Store
 
Apple hat den C64-Emulator für das iPhone wieder aus dem App Store genommen. Die Software war nur rund einen Tag verfügbar. Die Entwickler hoffen nun auf Nachsicht von Apple.
mehr...
News09.09.2010
Nüvi 1690: Navigationsgerät mit Internet in ganz Europa
 
Mit dem Nüvi 1690 zeigt Garmin das erste Navigationsgerät des Herstellers, das mit mobilem Internet ausgerüstet ist. Die Internetdienste vereint der Sammelbegriff Nülink. Im ersten Jahr kann das mobile Internet auf dem Nüvi 1690 i
mehr...
News09.09.2010
Nokia ohne eigenen Stand auf dem Mobile World Congress 2010
 
Am 15. Februar 2010 eröffnet die weltweit wichtigste Fachkonferenz rund um den Mobilfunk, der Mobile World Congress (MWC). Im kommenden Jahr wird Nokia als Marktführer für Mobiltelefone dort nicht mehr mit einem eigenen Stand vertreten sein
mehr...
mehr News
Weitere Infos
Bildershow
Bildershow,
Demo-Bildershow,
Javascript