Menüsteuerung mit PHP
Günther
- php
Hallo zusammen,
Ich stehe vor folgendem Problem:
Ich möchte gern ein Menü mit zwei Ebenen realisieren. Das Schema etwa wie:
1. Kapitel
2. Kapitel
2.1 Abschnitt
2.2 Abschnitt
2.3 Abschnitt ...
3. Kapitel
Vorgaben sind:
1. Der Menüpunkt der aktuell angezeigten Seite ist nicht verlinkt.
2. Die Ausgabe des Menüs soll als Liste <ul><li></li></ul> erfolgen.
3. Jetzt kommt das Problem: der jeweilige obere Kapitel-Menüpunkt soll nicht verlinkt sein, wenn einer der zugehörigen unteren Abschnitt-Menüpunkte aktuell angezeigt wird.
Frage: Wie kann ich in einem Array das erste Key-Value-Paar separieren und dann mit beliebigen Formatangaben versehen, wenn es gerade nicht die aktuell angezeigte Seite ist?
Ich füge Teile des bisherigen Codes an:
1. mehrere Arrays:
$arr1['1. Kapitel'] = array("root" => $siteRoot."index.php");
$arr2['2. Kapitel'] = array("root" => $siteRoot."kap20.php", "3.1 Abschnitt" => $siteRoot."kap21.php", "3.2 Abschnitt" => $siteRoot."kap22.php", "3.3 Abschnitt" => $siteRoot."kap23.php", "3.4 Abschnitt" => $siteRoot."kap24.php", "3.5 Abschnitt" => $siteRoot."kap25.php");
$arr3['3. Kapitel'] = array("root" => $siteRoot."kap30.php");
2. Jetzt der Code für das verschachtelte 2. Kapitel:
if($PHP_SELF != $arr2['root']){
foreach($arr2 as $key=>$value){
if($PHP_SELF == $value['root']){
echo "<li id='navon'>$key<li>\n";
}
else {
echo "<li class='navoff'><a href="".$value['root']."">$key</a><li>\n";
}
foreach($value as $key2=>$value2) {
if(array_search($PHP_SELF,$value)) {
if($key2 != "root") {
if($PHP_SELF == $value2) {
echo "<li id='subnavon'><a href="".$value2."">$key2</a><li>\n";
}
else {
echo "<li class='subnavoff'><a href="".$value2."">$key2</a><li>\n";
}
}
}
}
}
}
Es kann sein, dass ich mit dem Code komplett auf dem Holzpfad bin und bin dankbar für Kommentare.
Gruß Günther
Hallo Günther,
Frage: Wie kann ich in einem Array das erste Key-Value-Paar separieren und dann mit beliebigen Formatangaben versehen, wenn es gerade nicht die aktuell angezeigte Seite ist?
$arr2['2. Kapitel'] = array("root" => $siteRoot."kap20.php", "3.1 Abschnitt" => $siteRoot."kap21.php", "3.2 Abschnitt" => $siteRoot."kap22.php", "3.3 Abschnitt" => $siteRoot."kap23.php", "3.4 Abschnitt" => $siteRoot."kap24.php", "3.5 Abschnitt" => $siteRoot."kap25.php");
Müsste es hier nicht anstelle von "3.1 Abschnitt" "2.1 Abschnitt" usw. heißen?
$arr3['3. Kapitel'] = array("root" => $siteRoot."kap30.php");
Als Primitivlösung für das 1. Key-Value-Paar könntest Du z.B. einen Zähler mitlaufen lassen.
$i = 0;
if($PHP_SELF != $arr2['root']){
foreach($arr2 as $key=>$value){
$i++;
if ($i == 1) {
// 1. Key-Value-Paar
} else {
if($PHP_SELF == $value['root']){
echo "<li id='navon'>$key<li>\n";
}
else {
echo "<li class='navoff'><a href="".$value['root']."">$key</a><li>\n";
}
foreach($value as $key2=>$value2) {
if(array_search($PHP_SELF,$value)) {
if($key2 != "root") {
if($PHP_SELF == $value2) {
echo "<li id='subnavon'><a href="".$value2."">$key2</a><li>\n";
}
else {
echo "<li class='subnavoff'><a href="".$value2."">$key2</a><li>\n";
}
}
}
}
}
}
}
Grüsse
Frankie
Hallo Frankie;
erstmal danke für deinen Lösungsvorschlag und den Hinweis auf die unlogischen Bezeichnungen der Abschnitte in meinem Beispiel.
Ich habe einmal versucht die Zählervariabel einzusetzen. Wenn ich ihren Wert per echo $i; ausgebe, ist dieser immer 1.
Es kann sein, dass ich etwas falsch gemacht habe, darum füge ich den Code mit dem Zähler hier ein:
$i = 0;
if($PHP_SELF != $arr3['root']){
foreach($arr3 as $key => $value){
$i++;
if ($i == 1) {
echo $i;
echo "<li class='navoff'><a href="".$value['root']."">$key</a><li>\n";
}
else {
if($PHP_SELF == $value['root']){
echo $i;
echo "<li id='navon'>$key<li>\n";
}
else {
echo $i;
echo "<li class='navoff'><a href="".$value['root']."">$key</a><li>\n";
}
foreach($value as $key2 => $value2) {
if(array_search($PHP_SELF,$value)) {
if($key2 != "root") {
if($PHP_SELF == $value2) {
echo "<li id='subnavon'><a href="".$value2."">$key2</a><li>\n";
}
else {
echo "<li class='subnavoff'><a href="".$value2."">$key2</a><li>\n";
}
}
}
}
}
}
}
Hast du vielleicht eine Idee, was daran nicht stimmT?
Viele Grüße
Günther
Hallo Günther,
Ich habe einmal versucht die Zählervariabel einzusetzen. Wenn ich ihren Wert per echo $i; ausgebe, ist dieser immer 1.
Ist ja auch logisch, da in deinem $arr3 nur ein Wert steht ;-) (sofern die Belegung des Arrays mit der aus deinem OP übereinstimmt). Probier mal mit $arr2.
Es kann sein, dass ich etwas falsch gemacht habe, darum füge ich den Code mit dem Zähler hier ein:
Schaut zumindest was den Zähler angeht richtig aus.
> $i = 0;
> if($PHP_SELF != $arr3['root']){
> foreach($arr3 as $key => $value){
> $i++;
> if ($i == 1) {
> echo $i;
> echo "<li class='navoff'><a href=\"".$value['root']."\">$key</a><li>\n";
> }
> else {
> ...
Hast du vielleicht eine Idee, was daran nicht stimmT?
s.o.
Grüsse
Frankie
Hallo Frankie,
irgendwie will es nicht funktionieren,
wenn ich das verschachtelte Array, das mehrere Key-Value-Paare beinhaltet nehme und in der foreach-Schleife den Zähler hoch addieren lasse mit $i++, dann wird der entsprechende Button zweimal eingeblendet: einmal in der nicht verlinkten Variante mit den dazugehörigen Untermenüpunkten und zugleich in der verlinkten Variante. Die übrigen Buttons verhalten sich richtig.
Wenn ich auf einen unteren Menüpunkt klicke, wird zwar die neue Seite angezeigt, aber dann nur der verlinkte Button und die sich richtig verhaltenden Untermenüpunkte.
Jedesmal, wenn ich die Seite des oberen Kapitels verlasse, z.B. wenn ich auf ein Unterkapitel klicke, ist der Wert von $i wieder 1 und der Button wird wider in der verlinkten Variante angezeigt.
Offensichtlich funktioniert es nicht, wenn ich festlege, dass der Button der aktuell auf dem Monitor angezeigten Seite nicht verlinkt sein soll, aber andererseits möchte, das der Button einer Seite, die weitere Unterseiten hat, auch nicht verlinkt erscheint, wenn eine dieser Unterseiten angezeigt wird. Das ist wohl der Widerspruch.
Ich fürchte, dass mein kleiner Navigationsmechanismus an seine Grenzen gestoßen ist oder fällt Dir vielleicht noch etwas ein, wie ich ihn retten kann?
Viele Grüße
Günther
Hallo Günther,
Wenn ich auf einen unteren Menüpunkt klicke, wird zwar die neue Seite angezeigt, aber dann nur der verlinkte Button und die sich richtig verhaltenden Untermenüpunkte.
Jedesmal, wenn ich die Seite des oberen Kapitels verlasse, z.B. wenn ich auf ein Unterkapitel klicke, ist der Wert von $i wieder 1 und der Button wird wider in der verlinkten Variante angezeigt.
Du brauchst für jede Menüebene einen eigenen Zähler. Daß $i z.B. bei einem Unterkapitel (das keine weiteren Unterkapitel enthält) zu 1 wird, ist ja auch irgendwie logisch. Dieses $i bezieht sich natürlich nicht auf den Menüpunkt der übergeordneten Ebene => etxra Zähler pro Eebne.
Grundsätzlich würde ich dir aber empfehlen, dem Lösungsvorschlag von Alexander Brock zu folgen.
Grüsse
Frankie
Hallo Günther,
Ich möchte gern ein Menü mit zwei Ebenen realisieren. Das Schema etwa wie:
- Kapitel
- Kapitel
2.1 Abschnitt
2.2 Abschnitt
2.3 Abschnitt ...- Kapitel
Vorgaben sind:
- Der Menüpunkt der aktuell angezeigten Seite ist nicht verlinkt.
- Die Ausgabe des Menüs soll als Liste <ul><li></li></ul> erfolgen.
- Jetzt kommt das Problem: der jeweilige obere Kapitel-Menüpunkt soll nicht verlinkt sein, wenn einer der zugehörigen unteren Abschnitt-Menüpunkte aktuell angezeigt wird.
Dazu muss man das Script, das ich in [http://jeenaparadies.net/weblog/2004/may/php-menue@title=Jeenas Weblog] gepostet habe
nur geringfügig verändern:
function menu($eintrage) {
$selber = str_replace('index.php','',$_SERVER['PHP_SELF']);
$output = "<ul>\n";
foreach ($eintrage as $eintrag) {
$output .= "\n<li>";
$length = strpos(substr($eintrag['href'], 1),'/');
if (isset($eintrag[0]) and
strpos($selber,$eintrag['href']) !== false and
substr($selber,0,$length) == substr($eintrag['href'],0,$length)
) {
$output .= '<em title="'.$eintrag['title'].'">'.$eintrag['text'].'</em>';
$output .= menu($eintrag[0]);
}
else {
if ($selber == $eintrag['href']) {
$output .= '<em title="'.$eintrag['title'].'">'.$eintrag['text'].'</em>';
}
else {
if (empty($eintrag['title'])) {
$output .= '<a href="'.$eintrag['href'].'">'.$eintrag['text'].'</a>';
}
else {
$output .= '<a href="'.$eintrag['href'].'" title="'.$eintrag['title'].'">'.$eintrag['text'].'</a>';
}
}
}
$output .= '</li>';
}
return $output.'</ul>';
}
Funktioniert dann auch problemlos mit x-beliebig tief verschachtelten Menüs.
Gruß
Alexander Brock