Hallo,
ich versuche ein Menü zu basteln, dass aus einer MySQL-Datenbank ausgelesen wird.
Das Menü soll so aussehen:
:: Home
>> Hallo
>> Ich
>> Tag
:: Portal
>>
>>
>>
>>
:: Hilfe
Das ist der Grundaufbau des Menüs. Die Ausgabe soweit bekomme ich auch hin, allerdings hapert es dabei, dass ich immer nur von dem Punkt eine Reihe Untermenüs angezeigt haben will, der auch gerade angezeigt ist. Bei jedem Wechsel der Seite wird also das Menü neuerstellt. Wenn also z.B. die Seite Hallo angezeigt wird, dann soll das Menü so aussehen:
:: Home
>> Hallo
>> Ich
:: Portal
:: Hilfe
Die jeweiligen Menüpunkte stehen in einer DB und es wird jeweils in der Reihe "submenu" eingetragen, wovon ein Menü Untermenü ist bzw. wenn es einer der Hauptpunkte ist, dann ist dieser Wert "nil".
Dies ganze steht in einer Funktion, die rekursiv durchlaufen wird. Hier ist der bisher von mir entworfene Code. Dabei hapert es aber dann, wenn ich zum Beispiel "Hallo" auswähle, dass dieser Menüpunkt auch angezeigt wird.
In der Funktion Menu wird die ganze ausgabe des Menüs durch den Aufruf gestartet
PHP-Code:
<? menu($link,nil,nil,$_SESSION['intern'],0); ?>
Danach geht es in die Funktion Menu und diese durchläuft sich selbst rekursiv...
PHP-Code:
<?
function menu($menu_link,$menu_page,$menu_submenu,$menu_intern,$menu_level) {
require ("prefix.inc.php");
if ($menu_level == 0) {
$sql = "SELECT * FROM ".$prefix."navi WHERE `intern` <= '".$menu_intern."' AND `show` = 'true' AND `submenu` = '".addslashes($menu_submenu)."' ORDER BY link_id ASC";
$res = mysql_query($sql) or error(__LINE__,__FILE__,"Zugriff auf die Datenbank fehlgeschlagen!",mysql_error());
if (@mysql_num_rows($res)) {
while($data = mysql_fetch_assoc($res)) {
echo '[url="index.php?link='.$data['page'].'"]<div width="100%">::'.$data['title'].'</div>[/url]';
menu($menu_link,$data['page'],$data['submenu'],$menu_intern,1);
}
}
} elseif (istsubmenu($menu_page,$menu_link,$menu_submenu,$menu_intern) || $menu_link == $menu_page) {
$sql = "SELECT * FROM ".$prefix."navi WHERE `intern` <= '".$menu_intern."' AND `show` = 'true' AND `submenu` = '".$menu_page."' ORDER BY link_id ASC";
$res = mysql_query($sql) or error(__LINE__,__FILE__,"Zugriff auf die Datenbank fehlgeschlagen!",mysql_error());
if (@mysql_num_rows($res)) {
while($data = mysql_fetch_assoc($res)) {
echo '[url="index.php?link='.$data['page'].'"]<div width="100%">'.sub(($menu_level+1)*2,'','').'»'.$data['title'].'</div>[/url]';
menu($menu_link,$data['page'],$data['submenu'],$menu_intern,$menu_level+1);
}
}
}
}
?>
In der Funktion istsubmenu soll dann überprüft werden, ob der aktuell geöffnete Link in einem ein Submenü des als nächstes anzuzeigenden Menü-Punktes ist und sollte dies so sein, soll ein "true" zurückgegeben werden und der anzuzeigende Menü-Punkt angezeigt werden.
PHP-Code:
<?
function istsubmenu($sub_page,$sub_link,$sub_menu,$sub_intern){
require ("prefix.inc.php");
if ($submenu == nil) {
$sub_sql = "SELECT * FROM ".$prefix."navi WHERE `intern` <= '".$sub_intern."' AND `show` = 'true' AND `page` = '".$sub_link."' ORDER BY link_id ASC";
$sub_res = mysql_query($sub_sql) or error(__LINE__,__FILE__,"Zugriff auf die Datenbank fehlgeschlagen!",mysql_error());
if (@mysql_num_rows($sub_res)) {
$sub_data = mysql_fetch_assoc($sub_res);
if ($sub_link = $sub_page) {
return true;
} else {
return istsubmenu($sub_data['submenu'],$sub_link,$sub_data['page'],$sub_intern);
}
} else {
return true;
}
} else {
return false;
}
}
?>
Auch noch wichtig ist diese Funktion, die für den Abstand des Menüpunktes von dem linken Rand und dessen Einrückung zuständig ist.
PHP-Code:
<?
function sub($sub_level,$sub_sign,$sub_signfinal) {
if ($sub_level > 0) {
return $sub_signfinal = sub($sub_level-1,$sub_sign,sub_signfinal).$sub_sign;
}
}
?>
Ich hoffe hier kann mir jemand helfen. Ich hab schon nen ziemlichen Knoten im Kopf und komme bei dem Problem nicht weiter.
Vielen Dank.
cu
Karlja