Andreas-Lindig: erstellen eines mehrdimensionalen Navigationsmenues

Beitrag lesen

Kompliment, Du bist ganz schön geduldig.

immer schön Honig um den (nicht vorhandenen) Bart - so mach ich das auch immer, wenn ich mehr Antworten haben will ;-)

Wenn sich der User aber bspw. schon zehn Seiten "tief" weitergeklickt hat, hat er mit meiner "History" die Möglichkeit, z.B. direkt fünf Seiten zurückzugehen.

das kann sehr praktisch sein. Will ich an einer Stelle auch machen. Die Übergabe ist ja simpel, weil das Array eindimensional ist. Aber ich habe da so einen Gedanken: man sollte die angeklickten Seiten nicht einfach addieren - das macht die Brauserhistory besser. Wichtig ist, daß der Strang in die Tiefe stringent bleibt. Also z.B.:

Deine Struktur:

Seite1
|
+-Seite2
  |
  +-Seite3

Dein User klickt diese Reihenfolge:
Seite1, Seite2, Seite3, Seite2, Seite3

dann steht in der Brauserhistory: Seite1->Seite2->Seite3->Seite2->Seite3

in Deiner Navigation sollte aber stehen:
Seite1->Seite2->Seite3

Wenn ich eine "Navigation mit aufgeklappten Menüs" erstellen will, muß ich vielleicht nichts übergeben, aber ich muß die "Struktur" der Seiten doch vorher irgendwo abbilden (z.B. Datenbank), oder denke ich falsch?

nö, ist richtig.

Wie würdest Du das angehen?

z.B. so:

<?php
#Variablen
//Pfad zum obersten Verzeichnis des Projekts
$stammpfad = 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
//Pfad vom Stammverzeichnis zur aktuellen Seite, sie uebergibt dieses Array an dieses Menuescript
//jede Seite beinhaltet also eine Variable "$ich", in der steht der genaue Pfad dorthin
$restpfad = array('obst','kernobst','Birnen');

//Abbildung der Sitestruktur, am besten mit PHP erzeugen
$navi = array();

$navi['getraenke'] = array();
$navi['getraenke']['Milch'] = 'Milch.html';
$navi['getraenke']['Bier']  = 'Bier.html';
$navi['getraenke']['Saft']  = 'Saft.html';

$navi['obst'] = array();
$navi['obst']['kernobst'] = array();
$navi['obst']['kernobst']['Aepfel']  = 'Aepfel.htm';
$navi['obst']['kernobst']['Birnen']  = 'Birnen.php';

$navi['obst']['beeren'] = array();
$navi['obst']['beeren']['Erdbeeren'] = 'Erdb.html';

$navi['fleisch'] = array();
$navi['fleisch']['Rind']    = 'Rind.html';
$navi['fleisch']['Schwein'] = 'Schwein.html';

function navi_ausgeben($navi, $restpfad, $pfad)
{
   //fuer jede tiefere Verzeichnisebene mehr Einzug (kann man auch mit Listen machen)
   foreach($pfad as $irgendwas)
      $einzug .= '&nbsp;&nbsp;&nbsp;';

//gesamte Site auf oberster Ebene durchrattern
   foreach($navi as $kategorie=>$element)
   {
      //Array: das Element ist ein Verzeichnis
      if(is_array($element))
      {
          //Verzeichnis lieg auf dem Pfad zur aktuell markierten Seite
          if($restpfad[0]==$kategorie)
          {
             //Verzeichnis ohne Link ausgeben
             echo $einzug.'<b>'.$kategorie.'</b><br>';
             //Pfad _bis_ hierher merken und Pfad _von_ hier bis zur Seite um einen Schritt kuerzen
             $pfad[] = array_shift($restpfad);
             //Site auf aktuell tieferer Ebene erneut durchrattern
             navi_ausgeben($navi[$pfad[count($pfad)-1]], $restpfad, $pfad);
             //danach Pfade wieder rueckgaengig machen (Rekursion springt eine Verzeichnisebene hoeher)
             array_unshift($restpfad, array_pop($pfad));
          }
          //Verzeichnis liegt nicht auf dem Pfad zur aktuell markierten Seite: als Link ausgeben
          else
          {
             echo $einzug.'<b>'.'<a href="'.join('/', $pfad).'/'.$kategorie.'/">'.$kategorie.'</b></a><br>';
          }
      }
      //kein Array: das Element ist eine Seite
      else
      {
         if($restpfad[0] == $kategorie)
            //Element ist die aktuell markierte Seite
            echo $einzug.$kategorie.'<br>';
         else
            //Element ist eine andere Seite im gleichen Verzeichnis
            echo $einzug.'<a href="'.join('/', $pfad).'/'.$element.'">'.$kategorie.'</a><br>';
      }
   }
}

navi_ausgeben($navi, $restpfad, array($stammpfad))
?>

Wir spieln heute mal getPHP ;-)
Ich hab das jetzt mal fertiggebastelt, weil ich demnächst auch sowas brauche :-)

Gruß, Andreas

--
<img src="http://was-ist-das.andreas-lindig.de/was_ist_das_fetzen.jpg" border="0" alt="">
hier könnte auch ruhig mal'n neues Bild stehen.