Navigation mit PHP

guenter024

Erfahrenes Mitglied
Hallo PHP-Freunde,

habe mich schon ausgiebig im Forum umgesehen, werd aber nicht so richtig schlau mit meinem Probelem ... :confused:

ich bin gerade beim Umbau unserer Website und habe mich nun langsam etwas in PHP eingearbeitet. Nun möchte ich eine Explorerähnlich Navigation mit php aufbauen.
Habe nun begonnen, die einzelnen Untermenues wie folgt einzufügen.

Jetzt wird es aber sehr umständlich, da ich ja bei jedem Untermenue-Link die komplette Menuesektion neu schreiben muss (die aktiven Links sollen ja auch noch berücksichtigt werden).

Gibt es dazu eine Möglichkeit, das ganze in Arrays zu fassen und diese via $_GET ... zu übergeben?

Würd mich sehr freuen, wenn mir jemand helfen könnte...
Danke schon mal im Voraus

Günter

Edit: hab vergessen meine momentane ist-Situation zu posten. Das ganze sieht momentan in etwa folgendermaßen aus:

if ($_GET['path']=='section1'){
echo "<div><a href="seite?path=inhalt1">Inhalt1</a></div>";
if ($_GET['path']=='untersection1'){
echo "<div><a href="seite?path=inhalt11">Inhalt11</a></div>";
echo "<div><a href="seite?path=inhalt12">Inhalt12</a></div>";
}
echo "<div><a href="seite?path=inhalt2">Inhalt2</a></div>";
if ($_GET['path']=='untersection2'){
echo "<div><a href="seite?path=inhalt21">Inhalt21</a></div>";
echo "<div><a href="seite?path=inhalt22">Inhalt22</a></div>";
}
}

Die Menüs machen zwar auf, bleiben aber logischeweise nach dem Öffnen nicht stehen.
Vielleicht gibts dazu eine Lösung?
 
Zuletzt bearbeitet:
Hallo PHP-Freunde,

habe mich schon ausgiebig im Forum umgesehen, werd aber nicht so richtig schlau mit meinem Probelem ... :confused:

ich bin gerade beim Umbau unserer Website und habe mich nun langsam etwas in PHP eingearbeitet. Nun möchte ich eine Explorerähnlich Navigation mit php aufbauen.
Habe nun begonnen, die einzelnen Untermenues wie folgt einzufügen.

Jetzt wird es aber sehr umständlich, da ich ja bei jedem Untermenue-Link die komplette Menuesektion neu schreiben muss (die aktiven Links sollen ja auch noch berücksichtigt werden).

Gibt es dazu eine Möglichkeit, das ganze in Arrays zu fassen und diese via $_GET ... zu übergeben?

Würd mich sehr freuen, wenn mir jemand helfen könnte...
Danke schon mal im Voraus

Günter

Edit: hab vergessen meine momentane ist-Situation zu posten. Das ganze sieht momentan in etwa folgendermaßen aus:

if ($_GET['path']=='section1'){
echo "<div><a href="seite?path=inhalt1">Inhalt1</a></div>";
if ($_GET['path']=='untersection1'){
echo "<div><a href="seite?path=inhalt11">Inhalt11</a></div>";
echo "<div><a href="seite?path=inhalt12">Inhalt12</a></div>";
}
echo "<div><a href="seite?path=inhalt2">Inhalt2</a></div>";
if ($_GET['path']=='untersection2'){
echo "<div><a href="seite?path=inhalt21">Inhalt21</a></div>";
echo "<div><a href="seite?path=inhalt22">Inhalt22</a></div>";
}
}

Die Menüs machen zwar auf, bleiben aber logischeweise nach dem Öffnen nicht stehen.
Vielleicht gibts dazu eine Lösung?
Das einfachste wäre, du würdest zwei MySQL-Tabellen anlegen. Navi und Subnavi anschliessend kannst du über $_GET[] lediglich die ID der Navigation übergeben und das ganze wieder über MySQL auslesen...
 
Hallo ...,

vielen Dank für deine schnelle Antwort.
Habe leider mit MySQL noch gar keine Erfahrung -,-
Gibt es auch eine (einfache) Möglichkeit ohne MySQL?

Wenn man in einer if (GET..) Kontrollstruktur zusätzlich durch den Array-Key abfragen könnte, ob die Untermenues zum Array gehören wäre es doch recht einfach zu lösen, oder irre ich mich?

Danke nochmal für die Hilfe ...
 
meinst du soetwas?
PHP:
<?php
 $navigation = array('HOME','LINKS','KONTAKT');
 
 $subnavi1 = array('News','Über uns','Willkommen');
 $subnavi2 = array('Link1','Link2','Link3','Link4','Link5');
 $subnavi3 = array('E-Mail','Anfahrt','Test');

 echo '<table>';
  
 foreach($navigation as $navi)
 {
  echo '<tr><td><a href="test.php?show='.$navi.'">'.$navi.'</a></td></tr>';
 }
   
 echo '</table>';
 echo '<table>';
 switch($_GET['show'])
 {
  case 'HOME':
  
   $subnavi = $subnavi3;
  
   break;
  
  case 'LINKS':
  
   $subnavi = $subnavi2;
   
   break;
   
  case 'KONTAKT':
  
   $subnavi = $subnavi3;
  
   break;
 }
 
 foreach($subnavi as $subnavigation)
 {
  echo '<tr><td><a href="test.php?show='.$subnavigation.'">'.$subnavigation.'</a></td></tr>';
 }
 
 echo '</table>';
?>
 
Hmm So könntest du es zB in Arrays unterbringen:

PHP:
<?
$nav = array(
'Home'      => 'home',
'Links'     => 'links',
'Kontakt'   => 'kontakt'
);

$subnavs = array(
'home' => array(
    'News'          => 'news',
    'Über uns'      => 'about',
    'Willkommen'    => 'wilkommen'
    ),
'links' => array(
    'link1'         => 'link1'
    )
);
echo "<ul>";
foreach ($nav as $name => $link){
    echo "<li><a href='?s=$link'>$name</a>";
    if($subnavs[$link] && $_GET['s'] == $link){
        echo "<ul>";
        foreach ($subnavs[$link] as $subname => $sublink){
            echo "<li><a href='?s=$link&s2=$sublink'>$subname</a>";
        }
        echo "</ul>";
    }

    echo "</li>";
}
echo "</ul>";
?>

Aber da ginge nur eine unterebene. Ansonsten müsste man es ein wenig rekursiv umbauen. Und ich weis nich ob die Datenstruktur dann noch so ideal dafür ist. In den Arrays wird immer das Fordere angezeigt und das hintere als GET Parameter verwendet. man könnte auch nummern verwenden oder so.
 
:eek: Schepper :eek: ZONK :eek:

ja, so was in der Richtung muss es sein.

nur ohne die ul-listen, das hab ich ja momentan schon...
Die kann man dann ja weglassen.
Out of Topic: ist es eigentlich in diesem Forum üblich bzw. erlaubt, das man auf das aktuelle Objekt verweist, um zu zeigen wie es bislang läuft ? ich frage deshalb, weil es eine kommerzielle Seite ist (Solarbuisness) und ich will keine unerwünschte Werbung machen ...


Werd mich jetzt mal auf meinen Hintern setzten und fleissig pauken und üben.

Danke vorerst mal ...
 
Hallo,

ich habe auch ein navigationsproblem. Ich möchte gern meine Verzeichnisstruktur als Navigationsleiste übernehmen! Ich habe auch einen kleinen Teilerfolg erzielt:
Nur eben ist die Navigationsleiste momentan nicht zusammenhängend. Wenn ich Verzeichnis bzw. Link anklicke, dann wid die Seite gelöscht und mir werden nur die entsprechenden Unterverzeichnisse angezeigt. So zieht es sich durch bis in die x-te Unterverzeichnisebene. Hab da irgendwie ein Problem, den sprintf in der richtigen form für die 2., 3., .... eben zu verwenden. Mir würde es auch schon helfen, wenn wir die Anzahl der Ebenen auf 3 begrenzt ist.
Hier der bisherige Quellcode

<?PHP
function show_dir($dir, $pos=2)
{
$pat="'\*'";
$rep="&nbsp;";
$handle = @opendir($dir);
while ($file = @readdir ($handle))
{
if (eregi("^\.{1,2}$",$file))
{
continue;
}

if(is_dir($dir.$file))
{
$jahrordner= sprintf ("%'*".$pos."s<a href='dirnew.php?subdir=%2\$s'>%3\$s</a><br>"," ",$dir.$file,$file);
echo "<tr><td colsapn=2>".preg_replace($pat,$rep,$jahrordner)."</td></tr>";
}
else
{
if ($file != ".DS_Store" AND $file !="index.php" AND $file !="ordner.gif")
{
$datei = sprintf ("%'*".$pos."s %s", " ","<a href=".$dir.$file." target=_blank>".$file."</a>");
echo "<tr><td colsapn=2><td>".preg_replace($pat,$rep,$datei)."</td>";
}
}
}
}
@closedir($handle);

if($pos == 2)
{
echo "</pre>";
}
$subdir=$_GET['subdir']."/";
$rootdir="./";
if (empty($_GET['subdir']))
{
show_dir($rootdir);
}
else
{
show_dir($subdir."/");
}
?>

Wär echt super, wenn Ihr mir hier Tips geben könntet.

Vielen Dank im Voraus
 
ich bin gerade beim Umbau unserer Website und habe mich nun langsam etwas in PHP eingearbeitet. Nun möchte ich eine Explorerähnlich Navigation mit php aufbauen

Meinst du sowas wie auf meiner Seite http://www.hs-arbeitsschutz.com/
Eine Baumstruktur?

Das läst sich über eine Rukusive Funktion lösen also eine Funktion die sich selbst immer wieder aufruft.Ich hab das allerdings damals über eine Datenbank gemachst so kann man nähmlich später im Admin menü leicht dynamisch neue Menü hinzufügen.Dazu braucht man blos eine Tabelle mit 3 Spalten.

Beliebig viele Haupt und Unterkategorien sind da dann Möglich.

Mfg Splasch
 
Zuletzt bearbeitet:
Hallo Splash,

danke erstmal für deine Antwort,

deine genannte Beispielseite könnte das sein, was ich meine - wenn diese Navigationsstruktur auch genauso als Verzeichnisstruktur auf dem entsprechenden Server abgelegt ist und auch zur Erstellung der Navigation hergenommen wird.
Angefangen habe ich auch, das Problem über eine Datenbank zu lösen, aber ist zu fehlerbehaftet. Ich bracuhe das für folgenden Zweck:
Auf meiner Homepage soll es möglich sein, Bilder hochzuladen, d.h. die Nutzer legen selbständig neue Ordner auf dem Webserver an. Damit diese auch in der Navigation erscheinen, muß der selbe Eintrag auch in der MYSQL Datenbank gemacht werden. Nun wollte ich die Datenbank völlig über Bord werfen und die Navigation aus der bestehenden Verzeichnisstruktur auf dem Server heraus aufbauen. Im Prinzip habe ich das ja auch soweit geschafft. Bei mir ist ja lediglich noch ein Problem in der Formattierung. Wenn Ich auf der NaviLeiste einen Ordner anklicke, dann wird eine neue Seite aufgebaut auf der nur die Unterverzeichnisse des angeklickten Vrzeichnisses sichtbar sind. Alle übergeordneten Verzeichnisse sind nicht mehr sichtbar. Von der Optik her will ich das genau so, wie auf der Arbeitsschutzseite haben.

Viele Grüße
 
Ja das geht dann nur über die Rekusive funktion.Bei mir hab ich die Tabelle so aufgebaut
Spalten ID (Primäry) : Kategorie(Varchar): Parent (int)

Dabei gibt Parent an ob es sich um eine Haupt oder Unterkategorie handelt.
Die restlichen 2 Spalten(ksort,On_off) haben mit dem Grundschema selbst nix zu tun sind nur da um spezielle Funktionen im Admin menü zu bewerkstelligen.
Die Funktion selbst sieht so aus:

PHP:
function baum($vater,$lpos) #vater welches menu wird gezeigt ; in lpos wird meine liste aufgebaut für den nächsten klick 
{ 
    global $link;  # Der Link zur DB durch global auch in der Funktion bekannt. 
    global $wahl;  # hier sind als Array die ids drin die aufgeklappt sind (kommt aus der var pos) 
    static $ebene = 0; # mit static erstelle ich eine Variable, die beim erneuten 
                        # Aufruf der Funktion den Wert aus der Vorgängerfunktion behält. 
                        # Die ist wichtig für die Rekursion. Der Startwert ist 0 und der 
                        # wird hochgezählt beim Neuaufruf. Wenn ich also im Menu bei Apfel bin, 
                        # ist der Wert bei 1. 

    $erg[$ebene] = mysql_query("SELECT * FROM `kategorie` WHERE On_off='j' and `Parent` = '$vater'order by K_sort",$link); 
    $menge = mysql_num_rows($erg[$ebene]); 
    # Das ist auch noch klar. Lese das aktuelle Menu aus der Datenbank aus und starte eine Schleife ... 
    for ($lo=0;$lo<$menge;$lo++) { 
        $row = mysql_fetch_row($erg[$ebene]);    # Den Menu Eintrag auslesen, in $row[1] == Kname
                                               # ist ja der menueintrag als text .. 
        $menu = "<a href=\"index.php?pos=".$lpos."|".$row[0]."&amp;".strip_tags(SID)."\">".$row[1]."</a><br>"; 
        # Hier bastel ich den Link zusammen. Am schwersten zu verstehen ist wohl 
        # pos=$lpos|$row[0], ich werde noch näher darauf eingehen. 

        if ($ebene > 0) {    # Hier rücke ich einfach nur ein, je tiefer ich im Menu(Rekursion) 
                            # bin, umso mehr Leerzeichen vorne dran 
            echo str_repeat("&nbsp;&nbsp;",$ebene);  //$ebene ist anzahl der wiederholungen des Sring (&rArr;)
        		echo ("<img src=style/menu.GIF width=15 height=14 class=back >");
        } 
       
        echo $menu; 
        if ($row[0] == $wahl[$ebene+1]) { # Hier folgt der Aufruf der Funktion (ab in die Rekursion) 
            $ebene++; # ein Level hoch 
            baum($row[0],$lpos."|$row[0]"); 
            $ebene--; # und wieder ein Level runter 
        } 
    } 
}

Mfg Splasch
 
Zuletzt bearbeitet:
Zurück