PFalk: Dynamisches Menü um Untermenü erweitern

Hallo,

ich hab hier ein Menü, dass aus einem Array die einzelnen Menüpunkte ausliest.

Nun bräuchte ich aber bei jedem Menüpunkt noch ein Untermenü, dass nur angezeigt wird, wenn der jeweilige Oberpunkt gewählt wurde.

Das Hauptmenü sieht so aus:

$chapter =  
array(  
  'kapitel1' => 'Kapitel1',  
  'kapitel2' => 'Kapitel2',  
  'kapitel3' => 'Kapitel3'  
);  
  
if (!isset($_GET['kapitel']))  
{  
  $kapitel = 'inhalt';  
}  
else  
{  
  $kapitel = strtolower($_GET['kapitel']);  
}  
  
$myself = $_SERVER['PHP_SELF'];  
  
?>  
  
<div id="navcontainer">  
 <ul id="navlist">  
 <?php  
  foreach ($chapter as $key => $value)  
  {  
  $id = '';  
  if ($key == $kapitel)  
  {  
   $id = "active";  
  }  
  print "<li><a id='$id' href='$myself?kapitel=$key'>$value</a></li>\n";  
 }  
 ?>  
 </ul>  
</div>

Dadurch ergibt sich ja folgendes Menü:

<li><a id='xx' href='xx'>Kapitel 1</a></li>  
<li><a id='xx' href='xx'>Kapitel 2</a></li>  
<li><a id='xx' href='xx'>Kapitel 3</a></li>

Jetzt gibt's wie gesagt Untermenüs; die sehen ansich identisch aus (sind halt über die ID mittels CSS anders formatiert), insgesamt also so in der Art:

  
foreach ($chapter as $sub_key => $sub_value)  
  {  
  $sub_id = '';  
  if ($key == $artikel)  
    {  
    $sub_id = "sub_active";  
    }  
    print "<li><a id='$sub_id' href='$myself?artikel=$sub_key'>$sub_value</a></li>\n";  
  }

Also bräuchte ich wohl für jedes Untermenü wieder ein Array

$artikel_1 =  
array(  
  'artikel1_1' => 'Artikel1_1',  
  'artikel1_2' => 'Artikel1_2',  
  'artikel1_3' => 'Artikel1_3'  
);  
  
$artikel_2 =  
array(  
  'artikel2_1' => 'Artikel2_1',  
  'artikel2_2' => 'Artikel2_2',  
  'artikel2_3' => 'Artikel2_3'  
);  
  
$artikel_3 =  
array(  
  'artikel3_1' => 'Artikel3_1',  
  'artikel3_2' => 'Artikel3_2',  
  'artikel3_3' => 'Artikel3_3'  
);

Und müsste dem ganzen dann beibringen, dass wenn Kapitel1 aktiv ist, das Untermenü aus Array $artikel_1 angezeigt wird. Letztendlich so:

<li><a id='active' href='xx'>Kapitel 1</a>  
   <ul id="subnavlist">  
   <li><a id='' href=''>Artikel1_1</a></li>  
   <li><a id='' href=''>Artikel1_2</a></li>  
   <li><a id='' href=''>Artikel1_3</a></li>  
   </ul></li>  
<li><a id='' href='xx'>Kapitel 2</a></li>  
<li><a id='' href='xx'>Kapitel 3</a></li>

Nur wie bring ich dem ganzen bei, dass bei aktivem Kapitel X das zugehörige Untermenü angezeigt wird (und zwar direkt unter dem jeweiligen Hauptmenüpunkt).

Das wird doch ein total verschachtelter unübersichtlicher Code!?

  1. echo $begrüßung;

    Das wird doch ein total verschachtelter unübersichtlicher Code!?

    Das kommt auf deine Fähigkeiten beim Erstellen von Code an, auf die Codeformatierung und auf die subjektive Meinung von Unübersichtlichkeit. Ansonsten gibt es zum Entschachteln Code-Umlagerungsmöglichkeiten - auch unter dem Begriff Funktion bekannt.

    echo "$verabschiedung $name";

  2. Du hast nicht ganz Unrecht was die verschachtelung und die unübersichtlichkeit betrifft. Ich finde es immer ganz sinnvoll zu googeln und dann zu sehen wie andere das gelöst haben. Zum Thema Menüerstellung mittels PHP wird es sicherlich reichlich Stoff geben.

    Bei Deinem Ansatz sollte es doch eigentlich funktionieren wenn Du Deine "Ausgabeschleife" ein wenig umbaust.

    foreach ($chapter as $key => $value)
      {
      $id = '';
      if ($key == $kapitel) //an der Stelle weisst Du doch das die Seite die angezeigt werden soll genau diesem ausgegebenem Kapitel entspricht. Also muss hier dann auch die Ausgabe des Submenüs erfolgen. Oder hab ich Deinen Code nicht richtig gelesen?Ansonsten hier rein:

    print deinCodefürDasSubemnü

    {
       $id = "active";
      }
      print "<li><a id='$id' href='$myself?kapitel=$key'>$value</a></li>\n";

    1. Hi,

      danke erstmal. Das Problem ist aber, dass das Untermenü dann nicht am richtigen Platz steht. In deinem Fall stünde es ja ganz oben, noch vor dem ersten Hauptmenüpunkt.

      Und ich müsste es halt irgendwie dazwischen - uva an die richtige Stelle - bekommen :(

      Hab bei Google leider nichts ähnliches gefunden.

      1. Tach auch PFalk,

        Und ich müsste es halt irgendwie dazwischen - uva an die richtige Stelle - bekommen :(

        Hab bei Google leider nichts ähnliches gefunden.

        Alexander Brock hat doch eine Klasse geschrieben, die genau das tut...
        Das Zauberwort heißt Rekursion, aber bedenke Cheatahs Hinweis

        http://www.gruss-aus-essen.de

        Maik

        --
        Diese Dauerleihgabe wird Ihnen präsentiert von ROMY!
        Maik. W. aus E. sagt Dankeschön ;-)
        1. Hi,

          Alexander Brock hat doch eine Klasse geschrieben, die genau das tut...

          mit zwei Hindernissen für wohl die meisten Windows-Nutzer: tar und bz2.
          Mit letzterem wüßte auch nichts anzufangen.

          freundliche Grüße
          Ingo

          1. Hallo Ingo,

            Alexander Brock hat doch eine Klasse geschrieben, die genau das tut...
            mit zwei Hindernissen für wohl die meisten Windows-Nutzer: tar und bz2.
            Mit letzterem wüßte auch nichts anzufangen.

            einerseits ist es durchaus richtig, dass die einzige Downloadmöglichkeit ein solche Archiv ist, barriereärmer ist es sicherlich verschiedene Packformen anzubieten. Seit einiger Zeit verwende ich auf allen Windows-Rechnern, mit denen ich (beruflich wie privat) zu tun habe, 7-Zip. 7-Zip hat weder mit bz2 noch mit tar Probleme und beherrscht auch das rar-Format, das Du neulich als Barriere empfunden hast. Ich kann 7-Zip nur empfehlen.

            Ja, ich meine: Installiere Dir endlich ein besseres Packprogramm!

            Freundliche Grüße

            Vinzenz

            1. Tach auch Vinzenz,

              Ja, ich meine: Installiere Dir endlich ein besseres Packprogramm!

              Muß das echt sein? Mein Winzip 7.0 Standard hat das damals ohne zu murren aufgemacht (auch in der Windows-Umgebung).

              Mein Tip an Ingo: Einfach mal beherzt Doppelklicken.

              http://www.gruss-aus-essen.de

              Maik

              --
              Diese Dauerleihgabe wird Ihnen präsentiert von ROMY!
              Maik. W. aus E. sagt Dankeschön ;-)
            2. Hallo Forum,

              einerseits ist es durchaus richtig, dass die einzige Downloadmöglichkeit ein solche Archiv ist, barriereärmer ist es sicherlich verschiedene Packformen anzubieten.

              Das ist wahr, ich biete jetzt (bei der aktuellen Version) Bzip2, GNU zip, ZIP und 7-Zip an, da sollte für alle etwas dabei sein :-)

              Die BOM hab ich entfernt (ich hoffe, dass ich alle erwicht habe), aber den Bug kann ich irgendwie nicht schließen... wohl aber verstecken *g*

              Gruß
              Alexander Brock

              1. Hi,

                Das ist wahr, ich biete jetzt (bei der aktuellen Version) Bzip2, GNU zip, ZIP und 7-Zip an, da sollte für alle etwas dabei sein :-)

                Jetzt = seit gerade eben? ;-)

                @Maik "Mein Tip an Ingo: Einfach mal beherzt Doppelklicken."
                Wenn ich schon nicht mal 7zip installiert habe, werde ich doch wohl kaum nervige Shareware auf meinem Rechner haben. Auf einem Bürorechner hatte ich kürzlich ein ZIP-Programm, vermutlich Winzip, deinstalliert, dass da gar mit einer Zwangspause aufwartete.

                Aber ich glaube, dass ich mir 7zip wohl doch installieren werde. Ich gehe davon aus, dass das Programm nicht ungefragt Verknüpfungen anlegt, oder?

                freundliche Grüße
                Ingo

                1. Hallo Forum,

                  Das ist wahr, ich biete jetzt (bei der aktuellen Version) Bzip2, GNU zip, ZIP und 7-Zip an, da sollte für alle etwas dabei sein :-)
                  Jetzt = seit gerade eben? ;-)

                  true

                  Aber ich glaube, dass ich mir 7zip wohl doch installieren werde. Ich gehe davon aus, dass das Programm nicht ungefragt Verknüpfungen anlegt, oder?

                  7-zip nistet sich selbstständig im Kontextmenü von Dateien und Verzeichnissen ein, sonst nichts.

                  Gruß
                  Alexander Brock

                  1. Hallo Alexander,

                    Aber ich glaube, dass ich mir 7zip wohl doch installieren werde. Ich gehe davon aus, dass das Programm nicht ungefragt Verknüpfungen anlegt, oder?

                    7-zip nistet sich selbstständig im Kontextmenü von Dateien und Verzeichnissen ein, sonst nichts.

                    und so gut wie immer rufe ich mein Packprogramm aus dem Kontextmenü heraus auf. Alles andere ist mir im Normalfall zu umständlich.

                    Freundliche Grüße

                    Vinzenz

                  2. Hi,

                    7-zip nistet sich selbstständig im Kontextmenü von Dateien und Verzeichnissen ein, sonst nichts.

                    danke für den Hinweis - damit könnte ich leben, auch wenn mein Kontextmenü schon etwas umfangreich ist. Die normalen Menüpunkte 'alle extrahieren' oder 'senden an->ZIP-komprimierten Ordner' bleiben aber erhalten, oder?

                    freundliche Grüße
                    Ingo

                    1. Hallo Forum,

                      7-zip nistet sich selbstständig im Kontextmenü von Dateien und Verzeichnissen ein, sonst nichts.
                      danke für den Hinweis - damit könnte ich leben, auch wenn mein Kontextmenü schon etwas umfangreich ist. Die normalen Menüpunkte 'alle extrahieren' oder 'senden an->ZIP-komprimierten Ordner' bleiben aber erhalten, oder?

                      Ja, ich habe noch nicht beobachten können, dass 7-Zip Konkurrenten entfernen würde.

                      Gruß
                      Alexander Brock

                    2. Hallo Ingo,

                      danke für den Hinweis - damit könnte ich leben, auch wenn mein Kontextmenü schon etwas umfangreich ist. Die normalen Menüpunkte 'alle extrahieren' oder 'senden an->ZIP-komprimierten Ordner' bleiben aber erhalten, oder?

                      wenn Du diese entfernen möchtest, dann kannst Du dies mit

                      regsvr32 /u zipfldr.dll

                      tun. Damit deaktivierst Du die in XP eingebaute Zip-Unterstützung.

                      Freundliche Grüße

                      Vinzenz

                      1. Hi,

                        wenn Du diese entfernen möchtest, dann kannst Du dies mit

                        regsvr32 /u zipfldr.dll

                        tun. Damit deaktivierst Du die in XP eingebaute Zip-Unterstützung.

                        gut zu wissen, aber ich denke nicht. Es sei denn, dieses 7zip überzeugt mich so sehr, dass ich die Windows-Funktion nicht mehr nutzen möchte.

                        freundliche Grüße
                        Ingo

  3. Hi,

    wenn Du keine zu Deinem Problem passende Lösung im Netz gefunden hast, dann vermutlich, weil Deine Datenspeicherung unpraktisch ist.

    Also bräuchte ich wohl für jedes Untermenü wieder ein Array

    [code lang=php]$artikel_1 =
    array(
      'artikel1_1' => 'Artikel1_1',
      'artikel1_2' => 'Artikel1_2',
      'artikel1_3' => 'Artikel1_3'
    );

    nein. Besser wäre es, die Menüstruktur in einem Array abzubilden, dass dann zwei- oder mehrdimensional wird, also:  
    ~~~php
    $menu = array(  
      'kapitel1' => 'Kapitel 1', array(  
        'artikel1_1' => 'Artikel 1_1',  
        'artikel1_2' => 'Artikel 1_2',  
        'artikel1_3' => 'Artikel 1_3'  
      ),  
      'kapitel2' => 'Kapitel 2'  
    );
    

    Nur wie bring ich dem ganzen bei, dass bei aktivem Kapitel X das zugehörige Untermenü angezeigt wird (und zwar direkt unter dem jeweiligen Hauptmenüpunkt).

    Das wird doch ein total verschachtelter unübersichtlicher Code!?

    Nö. Eine Hauptschleife für die Hauptmenüpunkte und nach der Ausgabe des </a> eine innere Schleife für die Untermenüpunkte, wenn der Hauptmenüpunkt der aktuelle ist bzw. sich der aktuelle Menüpunkt innerhalb der zweiten Ebene dieses Arrayelements befindet.
    Abfragen würde ich das vorher, um im ersten Fall auf den Link verzichten zu können.

    P.S.: wozu die ganzen IDs? Du brauchst doch nur eine oder maximal zwei.

    freundliche Grüße
    Ingo