Roland Rottmair: Dynamisches Menü

Hi!

Ich überarbeite gerade meine Seite und will möglichst vieles dynamisch machen, um einen möglichst geringen Arbeitsaufwand zu haben. Mein Problem dieses mal ist ein dynamsiches Menü zu programmieren, das 1. nicht auf die Seite verlinkt, auf der sich der Besucher gerade befindet und 2. dessen Link-Adressen sich anpassen.

Den ersten Punkt habe ich geschafft:

-----------------------------------
menu.php
-----------------------------------
<?php
$menu_array = array("Seite 1" => "seite1.php", "Seite 2" => "seite2.php");

echo "<ul>\n";

foreach($menu_array as $key => $value)
        {
         if($key == $current)
            echo "\t<li id="current">".$key."</li>\n";
         else
            echo "\t<li><a href="".$value."">".$key."</a></li>\n";
        }

echo "</ul>\n";
?>

In Seite 1 wird es mit include eingebunden:
-----------------------------------
seite1.php
------------------------------------
$current = "Seite 1"
include "menu.php"

So weit so gut. Nun möchte ich aber auch, das die Pfadangaben zu den einzelnen Seiten passen. Liegt seite1.php im Ordner seite1 und seite2.php im Ordner seite2   und die beiden Ordner leigen im selben Verzeichnis, so muss der Link in Seite 2 auf Seite 1 ja so heißen: <a href="../seite1/seite1.php">Von Seite 2 zu Seite1</a>. Wie kann ich jetzt noch erreichen, dass nicht ich immer die Schrägstriche machen muss oder gibts da einen Trick?

  1. Hallo!

    so muss der Link in Seite 2 auf Seite 1 ja so heißen: <a href="../seite1/seite1.php">Von Seite 2 zu Seite1</a>. Wie kann ich jetzt noch erreichen, dass nicht ich immer die Schrägstriche machen muss oder gibts da einen Trick?

    Also bezüglich der Punkte und dem ersten Schrägstrich bietet sich http://de.selfhtml.org/html/kopfdaten/basis.htm#adresse an.
    Könnte das Verzeichnis nicht auch in $menu_array verwaltet werden?

    Beste Grüße
    Viennamade

    1. Hi!

      Also bezüglich der Punkte und dem ersten Schrägstrich bietet sich http://de.selfhtml.org/html/kopfdaten/basis.htm#adresse an.
      Könnte das Verzeichnis nicht auch in $menu_array verwaltet werden?

      Das erstere ist nicht ganz das was ich wollte... Es sollte nämlich auch mit PHP möglich sein.

      Theoretisch schon, doch dann müsste ich auf der betreffenden Seite z.B.
      $menu_array["Seite 1"] wieder ändern...

      Wie machen es denn so große Seite wie z.B. kde-look.org oder stern.de oder ...? Das muss doch auch dynamisch gehen?!

      Grüße,

      Roland

      1. Hallo!

        Also bezüglich der Punkte und dem ersten Schrägstrich bietet sich http://de.selfhtml.org/html/kopfdaten/basis.htm#adresse an.
        Könnte das Verzeichnis nicht auch in $menu_array verwaltet werden?

        Das erstere ist nicht ganz das was ich wollte... Es sollte nämlich auch mit PHP möglich sein.

        Theoretisch schon, doch dann müsste ich auf der betreffenden Seite z.B.
        $menu_array["Seite 1"] wieder ändern...

        Mh, also ganz verstehe ich es nicht. Aber: $current brauchst Du nicht wirklich ... $_SERVER['PHP_SELF'] mit einem entsprechenden Menu-Array ...

        Beste Grüße
        Viennamade

      2. Moin!

        Wie machen es denn so große Seite wie z.B. kde-look.org oder stern.de oder ...? Das muss doch auch dynamisch gehen?!

        die haben ihr seiteninhalte wohl in datenbanken gespeichert, und können über eine Kapitelstruktur festlegen, wie das menü assehen soll. das menü wird dann dynamisch aus der datenbank ausgelesen.
        tschüss ichen

        --
        Selfcode: sh:( fo:| br: n4:& ie:% mo:| mo:| de:] zu:) fl:| ss:| ls:[ js:|
  2. Hallo Roland!

    Wenn ich dich richtig verstanden habe, könnte das deine Lösung sein:

    <?php
       $menu_array = array("Seite 1" => "/seite1/seite1.php",
                           "Seite 2" => "/seite2/seite2.php");
       echo "<ul>\n";

    foreach($menu_array as $key => $value) {
          // Wenn die aktuelle URL mit dem Dateinamen $key endet
          if(preg_match(",".$value."$,i", $_SERVER['PHP_SELF']))
             echo "\t<li id="current">".$key."</li>\n";
          else
             echo "\t<li><a href="".$value."">".$key."</a></li>\n";
       }

    echo "</ul>\n";
    ?>

    $current = "Seite 1"

    Diese Zeile brauchst du wegen $_SERVER["PHP_SELF"] nicht, da in ihr die akuelle URL hinterlegt ist.

    In der if-Abfrage wird mittels einem regulären Ausdrucks geprüft, ob die aktuelle URL ($_SERVER["PHP_SELF"]) mit dem aktuellen Wert ($value) der foreach-Schleife aus dem Array ("$menu_array") endet.

    So weit so gut. Nun möchte ich aber auch, das die Pfadangaben zu
    den einzelnen Seiten passen. Liegt seite1.php im Ordner seite1
    und seite2.php im Ordner seite2   und die beiden Ordner leigen im
    selben Verzeichnis, so muss der Link in Seite 2 auf Seite 1 ja so
    heißen: <a href="../seite1/seite1.php">Von Seite 2 zu Seite1</a>.
    Wie kann ich jetzt noch erreichen, dass nicht ich immer die
    Schrägstriche machen muss oder gibts da einen Trick?

    Mit relativen Pfaden wirst du hier nicht weit kommen, denn das Menü liegt zentral in einer Datei, welches ja von mehreren unterschiedlichen Dateien aus unterschiedlichen Ordnern inkludiert und ausgeführt wird, so dass die Anzahl der Unterverzeichnisse variabel und somit nicht vorhersehbar ist.

    Deshalb musst du die Ordner im Array $menu_array, wie oben im Quelltext bereits vorhanden, mit angeben.

    1. Hi Xava!

      <?php
         $menu_array = array("Seite 1" => "/seite1/seite1.php",
                             "Seite 2" => "/seite2/seite2.php");
         echo "<ul>\n";

      foreach($menu_array as $key => $value) {
            // Wenn die aktuelle URL mit dem Dateinamen $key endet
            if(preg_match(",".$value."$,i", $_SERVER['PHP_SELF']))

      Könntest du obige Zeile noch genauer erklären, ich arbeite noch nicht so lange mit PHP und kenne diese Funktion nicht.

      Grüße,

      Roland

      1. Hallo Rolf!

        // Wenn die aktuelle URL mit dem Dateinamen $key endet
              if(preg_match(",".$value."$,i", $_SERVER['PHP_SELF']))

        Könntest du obige Zeile noch genauer erklären, ich arbeite noch
        nicht so lange mit PHP und kenne diese Funktion nicht.

        Die Funktion preg_match() verarbeitet reguläre Ausdrücke. Bei der Funktion preg_match() werden zwei Paramet, ein Suchmuster und ein String, übergeben. Die Funktion prüft, ob das Suchmuster auf den String zutrifft oder nicht. In diesem Fall trifft das Suchmuster nur zu, wenn der Inhalt von $_SERVER["PHP_SELF"] mit dem Inhalt von $value endet. Für die Bedingung "endet mit..." steht das "$". Die Zwei Kommata -- eins am Anfang und eins am Ende des Suchmusters -- markieren umschliessen das Suchmuster. Die Option "i" hier dem Suchmuster führt dazu, dass die Gross- und Kleinschreibung nicht beachtet wird.

        Die vordefinierte superglobale Variable $_SERVER["PHP_SELF"] gibt die URL relativ zum Wurzelverzeichnis aus.

        Weitere Informationen:

        - PHP-Handbuch: "Vordefinierte Variablen
        " ($_SERVER["PHP_SELF"])
           http://de.php.net/reserved.variables
         - PHP-Handbuch: PCRE -> preg_match()
           http://de.php.net/manual/de/function.preg-match.php
         - dlcp-FAQ: "8. Reguläre Ausdrücke"
           http://www.dclp-faq.de/ch/ch-regexp.html