Verschachteltes PHP Menü (Liste)

Wenn ich eine Webseite erstelle, entwickle ich diese nicht gleich mit einem CMS sondern erstelle in den meisten Fällen zunächst einen Prototyp, bei welchem dann schon einige Seiten anklickbar sind. Würde ich das jedoch mit statischen html-Seiten machen, müsste ich die Navigation für jede Seite einzeln wiederholen, was besonders im Entwicklungsstadium äußerst lästig ist, da sich noch vieles ändern kann.

Daher benutze ich ein kleines Skript, welches mir die Links bzw. die Navigation dynamisch generiert. Man kann dieses Skript natürlich auch benutzen, wenn man Webseiten ohne Content-Management-System erstellt.

Ich stelle dieses PHP-Menü kostenlos zur Verfügung. Es darf für private und für kommerzielle Webseiten verwendet werden. Es darf jedoch nicht kopiert und auf anderen Seiten als dieser zum Download oder zum Verkauf angeboten werden.

Here you can get a dynamic php-menue-script for free. You are allowed to use it for private and commercial websites. You are not allowed to copy and advertise it for download on your own website. You are nor allowed to copy and to redistribute it.

Code

<?php
if(defined('E_STRICT') && function_exists('date_default_timezone_set')) {
  error_reporting(E_ALL | E_STRICT);
  date_default_timezone_set("Europe/Berlin");
}
else error_reporting(E_ALL);

if(!function_exists('strripos')) {
  function strripos($text, $search) {
    $text = strtolower($text); $search = strtolower($search);
    if(strlen($search)==1) return strrpos($text,$search);
    $x = strpos($text, $search);

    do {
      $y = strpos($text, $search, $x+1); $x = ($y) ? $y : $x;
    }
    while ($y);
  return $x;
  }
}

$s = basename($_SERVER['SCRIPT_NAME']);
echo OMList($s);
echo '<p>Sie sind hier: ',$breadcrumb,'</p>';



function OMList($site) {
  $site = str_replace('.php','',$site);
  global $breadcrumb; $breadcrumb = '';
  $menu = 'menudata.csv';
  $cr = chr(13).chr(10);
  $nav = '<ul id="listmenu">'.$cr;
  $li = 0; $dat = file($menu);

  for($i=0; $i<count($dat); $i++) {
    $x = explode('|',trim($dat[$i]));
    if($x[0]) {
      $link = $x[0]; $s = $x[1];
      $level = 0;
      while (strpos($link,'-') === 0) {
        $level++; $link = substr($link,1);
      }
      if($level < $li+2) {
        if($level <= $li && $i>0) {
          $nav .= '</li>'.$cr;
        }
        if($level > $li) {
          $li++; $nav .= '<ul>'.$cr;
        }
        while ($level < $li) {
          $li--; $nav .= str_repeat('  ', $li+1).'</ul></li>'.$cr;
        }
        $nav .= str_repeat('  ', $li+1);
        if($s == $site) {
          $ul = $li;
          $breadcrumb = $link;
          while(($p = strripos($nav, '<ul>')) && $ul) {
            $ul--;
            $plink = strripos(substr($nav,0,$p),'<a href=');
            $breadcrumb = substr($nav,$plink,$p-$plink).' » '.$breadcrumb;
            $nav = substr($nav, 0, $p+3).' class="b-active"'.substr($nav, $p+3);
          }
          $nav .= '<li id="active"><span>'.$link.'</span>';
        }
        else {
          $nav .= '<li><a href="';
          $nav .= ''. $s .'.php">'.$link.'</a>';
        }
      }
    }
  }
  $nav .= '</li>'.$cr;
  while ($li) {
    $li--; $nav .= str_repeat('  ', $li+1).'</ul></li>'.$cr;
  }
  $nav .= '</ul>'.$cr;
  return $nav;
}
?>

Anwendung

Und so wird es gemacht:

  1. Lade das Skript herunter und entpacke es auf deinem Rechner
    [Download hier]
  2. Öffne die Datei menudata.csv
  3. Hier kannst du sehen: Jede Menüebene ist mit einem Spiegelstrich gekennzeichnet
    Ebene 0 ist die Wurzel und hat keinen Spiegelstrich
    - Ebene 1 hat einen (1) Speigelstrich und ist die 1. Unterbene
    -- Ebene 2 hat zwei (2) Spiegelstriche und ist die 2. Unterebene usw.
  4. Ergänze deine eigene Navigationsstruktur und füge das skript in deine Webseiten ein, lade es dann auf deinen Webspace.
  5. Im Downloadpaket ist auch die Datei listmenu.php enthalten. Sie enthält das eigentliche Skript. Wenn du ein paar andere Klassen oder IDs benötigst, kannst du das markup hier entsprechend anpassen.

    Für Anfänger: Die Datei listmenu.php muss via "include" in jede Webseite eingefpügt werden, die das Menü enthalten soll. Jede Datei muss mit .php enden, in einer statischen html-Seite funktioniert das Menü NICHT! Dein Webeerver muss außerdem php-Unterstützung haben.
  6. Das Downloadpaket enthält keine CSS-styles, das Menü lässt sich jedoch sehr gut gestalten.
  7. Demo

    Um zu sehen, wie es funktioniert habe ich hier eine kleine Beispielseite, in welcher ich ein CSS von Stu Nicholls eingebaut habe. Um das Copyright nicht zu verletzen, kann ich es jedoch dem Download nicht hinzufügen. Unter Berücksichtigung der Auflagen kannst du jedoch das CSS von css-play herunterladen. Ein paar Anpassungen genügen um z.B. ein horizontales Drwopdwon Menü entstehen zu lassen.
  8. Merke: Funktioniert nicht im IE6. Dazu muss man in das Skript erst noch die Tabellentags von StuNOcholls integriern.

How to use

  1. Download the script and unzip it on your local machine.
    [Download here]
  2. Open the file "menudata.csv"
  3. Here you can see: Every menuelevel has a bullet.
    Level 0 is the root and has no bullet.
    - Level 1 has one (1) bullet, it's the first sublevel.
    -- Level 2 has two (2) bullets, it's the second sublevel.
  4. Inside the download package a menuorder is included as an example. You can modify it to what you need.
  5. The download also includes a file "listmenu.php". You must include this script in every website.If you need some other classes or id's, you can also modify the markup in this file.
    For Beginners: Every website needs to have the extension ".php" and your webserver must have the php-module installed. This menu does'nt work without it !
  6. There are no css-stylesheets included in the Downloadpackage, you must style it on your own.
  7. Here you can see a Demo
    In this example I've made some small modifications so that it fits to a css-stylesheet from Stu Nicholls You can visit css.play and (with respecting the copyright) you can download the missing css-file from there.
  8. Notice: This Demo works not in IE6. If you want it to work, you must integrate the table tags from StuNicholls Markup.

Zurück