[PHP] Menü mit Untermenü dynamisch erzeugen

M

Mr. Snoot

Gast
edit: okay, ich denke ich habs. Einfach mit ner if-Abfrage prüfen, welches Hauptmenü gewählt wurde, und die Variable in der foreach()-Anweisung auf $topics1, $topics2 usw. setzen...


Hio,

ich will gerade meine Menüstruktur etwas aufpeppen, und das ganze etwas dynamisch machen. Leider verbiegen sich mir langsam die Gehirnwindungen und ich blick nicht mehr durch :D

Kurze Erklärung:

Ich habe ein Menü, wird einer der Hauptmenüpunkte ausgewählt, wird er hervorgehoben und zugleich soll das zugehörige Untermenü angezeigt werden (zwischen dem zugehörigen Hauptmenüpunkt und den nächsten Hauptmenüpunkten). Wird wiederrum einer der Untermenüpunkte ausgewählt, soll auch dieser hervorgehoben werden.

Im Grunde habe ich alle Bestandteile für das Hauptmenü und das Untermenü, es geht jetzt nur noch um das Verflechten der beiden Scripte.

Hauptmenü ohne Untermenü:

PHP:
<?php

// das Array mit den Haupt-Menüpunkten

$chapter =
array(
  "menu1" => "Menu1",
  "menu2" => "Menu2",
  "menu3" => "Menu3"
);

// wenn der URL-Parameter "kapitel" nicht gesetzt ist, setze ihn auf 'index' ansonsten übernehme den Parameter
if (!isset($_GET['kapitel']))
{
  $kapitel = "index";
}
else
{
  $kapitel = strtolower($_GET['kapitel']);
}

// Speichere den eigenen Seitennamen in der Variable $myself
$myself = $_SERVER['PHP_SELF'];

?>

<ul id="navigation">

  <?php

  foreach ($chapter as $key => $value) {
  $id = "";

    if ($key == $kapitel) {
    $id = "id=\"active\"";
    }

    echo "\t\t\t\t<li><a $id href=\"$myself?kapitel=$key\">$value</a></li>\n";
    }

    ?>

</ul>

<?php
        
  @require_once("$kapitel.php");
        
?>
Das Untermenü sieht im Grunde genau so aus und muss jetzt eben da eingearbeitet werden, aber irgendwo hakt es.

Theoretisch sähe das ganze irgendwie so aus:
PHP:
<?php

// das Array mit den Haupt-Menüpunkten

$chapter =
array(
  "menu1" => "Menu1",
  "menu2" => "Menu2",
  "menu3" => "Menu3"
);

// Arrays mit Untermenüpunkten

$topics1 =
array(
  "untermenu11" => "Untermenu11",
  "untermenu12" => "Untermenu12"
)

$topics2 =
array(
  "untermenu21" => "Untermenu21",
  "untermenu22" => "Untermenu22"
)

// wenn der URL-Parameter "kapitel" nicht gesetzt ist, setze ihn auf 'index' ansonsten übernehme den Parameter

if (!isset($_GET['kapitel']))
{
  $kapitel = "index";
}
else
{
  $kapitel = strtolower($_GET['kapitel']);
}

// wenn der URL-Parameter "thema" nicht gesetzt ist, setze ihn auf 'inhalt' ansonsten übernehme den Parameter

if (!isset($_GET['thema']))
{
  $thema = "inhalt";
}
else
{
  $thema = strtolower($_GET['thema']);
}

// Speichere den eigenen Seitennamen in der Variable $myself
$myself = $_SERVER['PHP_SELF'];

?>

<ul id="navigation">

  <?php

  foreach ($chapter as $key => $value) {
  $id = "";

    if ($key == $kapitel) {
    $id = "id=\"active\"";
    }

    echo "\t\t\t\t<li><a $id href=\"$myself?kapitel=$key\">$value</a></li>\n";

    if ($key == $kapitel) {

    echo "<ul id=\"subnavlist\">";

      foreach ($topics1 as $subkey => $subvalue) {
      $id = "";

        if ($subkey == $thema) {
        $id = "id=\"subactive\"";
        }

      echo "\t\t\t\t<li><a $id href=\"$myself?kapitel=$key&thema=$subkey\">$subvalue</a></li>\n";
      }
      echo "</ul></li>";
      }
      }

    ?>

</ul>

...
..
.
Mein eigentliches Problem ist jetzt nur, in der zweiten foreach()-Anweisung automatisch das richtige Untermenü aufzurufen (dort wo es jetzt im Moment heißt: foreach ($topics1 as ...).

Im Grunde klappt alles so wie es sein soll, nur eben an dieser Stelle steh ich auf dem Schlauch. Kann ja nicht mehr sehr schwer sein :freak: :D
 
Zuletzt bearbeitet:
weiß zwar nicht wie aktuell das ganze ist, aber deine Lösung da finde ich relativ statisch.

schonmal an nen Multidimensionales Array gedacht?


$navigation = array (
"Menu Punkt 1" => array (
"Punkt 1.1" => "",
"Punkt 1.2" => "",
),
"Menu Punkt 2" => array (
"Punkt 2.1" => "",
"Punkt 2.2" => "",
),
);

das ganze über ne Funktion die sich rekursiv aufrufen kann und du hast beliebig viele Menu Layer

[wobei der leere Feldinhalt also = "" das Ende des jeweiligen Strangs wäre ansonsten bei if(is_Array(..)) wieder die funktion aufgerufen werden würde
 
Also den wirklichen Vorteil seh ich da jetzt nicht - weswegen ich mal bei meiner Lösung bleibe (die überblicke ich im Moment auch noch selbst :D). Du verschachtelst die Haupt- und Untermenü-Arrays ja nur, oder?

Aber danke für den Vorschlag.
 
PW-toXic schrieb:
der code wird kürzer
der code verständlicher
der code stellt selbsterklärend die realität wieder

und mit dem mehrdimenisonalen array kann man programmiertechnisch mehr anfangen
(foreach ...)


+du brauchst nur deinen "Datenbestand" (=Die Arrays) anpassen und das Script schraubt die die Navigation dann vollautomatisch zusammen
 
In meiner Variante hab ich ja auch nur die Arrays, die ich pflegen muss.

Hatte es jetzt aber trotzdem mal mit den Multiarrays probiert, was allerdings nicht geklappt hat (hab grad auch nicht viel Zeit dazu). Deswegen bin ich wie gesagt im Moment mit meiner Lösung zufrieden und werd mich dann bei Zeiten mal mit dem anderen auseinandersetzen - bin ja immer froh, wenn ich sinnvolle Tipps bekomme :)
 
Kann mir mal jemand nen Tipp geben, wie ich das Multi Array dann ausgebe? Bring da gar nichts zustande :)
 
Zurück
Oben