PHP vertikale Navigation mit Untermenü

andymation

Cadet 1st Year
Registriert
Sep. 2011
Beiträge
14
[PHP] vertikale Navigation mit Untermenü

Hallo,

beschäftige mich jetzt seit ein paar Tagen mit PHP, bin also blutiger Anfänger und verzweifle gerade an folgendem Problem:

Ich programmiere eine Webseite, auf der es ein horizontales Menü gibt, und ein vertikales Menü an der Seite, bei dem einige Navigationspunkte jeweils nochmal ein Untermenü haben sollen.

Das horizontale Menü habe ich per CSS realisiert. Dh. für jeden Menüpunkt gibt es auch eine eigene Seite.

Das vertikale Menü wird durch den Wechsel des Menüpunkts im horizontalen Menü komplett ausgetauscht.

In der Mitte der Seite werden nun per PHP include die Inhalte geladen.

Ich bin jetzt dabei, die Seitennavigation per PHP zu programmieren.
Nochmal zum Verständnis: Gemeint ist ein vertikales Menü, ähnlich einer Liste, bei dem einige Menüpunkte auch untergeordnete Menüpunkte haben sollen. Alle Menüpunkte sollen darüber hinaus per Link einen Include-Befehl auf der Seite ansprechen.

Jedenfalls habe ich jetzt schon diverse Forenbeiträge durchsucht, PHP-Tutorials und -Einstiegslektüre gelesen, habe auch themenähnliche Beiträge gefunden, konnte mir damit allerdings noch nicht so recht weiterhelfen...

(...) Inhalte entfernt, weil nicht mehr aktuell.

Ergänzung ()

Habe mich weiter mit meinem Problem beschäftigt (sitze mittlerweile schon seit gut 10 Stunden dran :freak:), nen anderen Code gefunden von dem ich erst dachte er sei einfacher, und eingebaut aber ich schaffs einfach nicht, die Links meinen include-Befehl ansprechen zu lassen...
...außerdem sind die Menüpunkte mit Untermenü keine Links, sondern haben lediglich die Funktion das Untermenü zu öffnen, es sollen jedoch ALLE Menüpunkte auch Links sein, die per include-Befehl Inhalte in den Content-Bereich der Seite laden.

Das ist mein "neuer" PHP-Code:

PHP:
<?php
//Menue 1
$menu_1 = array(
 "Eins"    => "eins.php",
 );

//Menue 2
$menu_2 = array(
 "Zwei"    => "zwei.php",
 "Drei"  => "drei.php",
 "Vier"    => "vier.php",
 );




function show_submenu($menu_data,$this_id) {
$navi="";
if (isset($_GET[$this_id])){
        $navi = "<ul>\n";
         foreach ($menu_data as $title => $url) {
          if (is_array($url))
          {
             $navi .= " <li><a href='?".$this_id."&".$title."'>(".$title.")\n";
             $navi .= show_submenu($url,$title);
             $navi .= "</li>\n";
          }else{
          $navi .= " <li><a href='?".$url."?".$this_id."'>".$title."</li>\n";}

         }
        $navi .= "</ul>";
}
        
        return $navi;
}

?>

HTML:
PHP:
<ul>
<li><a href="?submenu1">Untermenü 1</a>
<?php 	echo  show_submenu($menu_1,"submenu1") ; ?>

</li>
<li><a href="#">test</a></li>
<li><a href="?submenu2">Untermenü 2</a>
<?php echo  show_submenu($menu_2,"submenu2") ; ?>
</li>

</ul>

Include-Befehl (ich habe keine Ahnung wie der noch verändert werden muss, damit er mit der neuen Navigation funktioniert):
PHP:
<?php
if (isset($_GET['section'], $section[$_GET['section']])) {
    include $section[$_GET['section']];
} else {
    include $section['start'];
}
?>

Meine Frage ist jetzt also, wie kann ich mit diesem Script Links ausgeben, die mein include ansprechen? Bisher habe ich mit einem Array die Variable $section genutzt. Ich komme hier einfach nicht weiter! :confused_alt:

Hoffe es kann mir noch jemand helfen, tausend Dank schon mal im Voraus!!

Grüße
Andy
 
Zuletzt bearbeitet: (Aktualisierung)
was steht denn in $this_id und was in $title drinne?

wei cih das sehe fehlen da die = zeichen.

$title enthält dann ja soetwas wie "eins" "zwei"und url sowas wie "eins.php" "zwei.php"

dein script erzeugt einen link mit so einer url:
?submenu1&zwei.php

richgtig wäre aber etwas wie

?id=submenu1&url=zwei.php


daten die per get übergeben wollen brauchen immer einen bezeichner und ein wert.

? am ende einer URL teielt dem server mit, jetzt kommen key/value paare.
mehrere paar verkettest du mit &
Prüfe doch mal mit z.b. print_r($_GET) was denn überhauot bei deiner seite ankommt.
 
Zuletzt bearbeitet:
Also so wie die URLs aufgebaut werden, wird dein include auch nicht funktionieren.

Kannst du uns mal den Output deiner 2. Datei geben? Also was schmeisst der am ende wirklich raus (Vielleicht kommt er auch garnicht an $menu1 und $menu2 ran)
 
Super, also dass man Key/Value Paare mit & verketten kann wusste ich übrigenz noch gar nicht, aber genau das habe ich gesucht, bzw. mich gefragt ob das geht! ;) Danke schonmal bis hierhin!

So, ich habe das Ganze jetzt zum Verständnis, vor allem aber auch ums mal selbst zu lernen in nem Beispiel neugeschrieben. Wenn's später funktioniert bau ich den Code einfach in meine Seite ein.

Ich habe 8 Dateien nach folgender Struktur angelegt:
index.php (Div-Container mit Navigation + Div-Container, in den per include folgende Dateien geladen werden:
1.php
1punkt1.php
1punkt2.php
2.php
2punkt1.php
2punkt2.php
3.php)

Meine index.php sieht so aus:
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Index</title>
</head>

<body>

<?php
error_reporting(E_ALL & ~E_NOTICE);
//your code here  

$section = array();
$section['1'] = '1.php';
$section['1punkt1'] = '1punkt1.php';
$section['1punkt2'] = '1punkt2.php';
$section['2'] = '2.php';
$section['2punkt1'] = '2punkt1.php';
$section['2punkt2'] = '2punkt2.php';
$section['3'] = '3.php';
?>

<?php
//Menue 1
$menu_1 = array(
 "1.1"  => "1punkt1",
 "1.2"    => "1punkt2",
);

//Menue 2
$menu_2 = array(
 "2.1"  => "2punkt1",
 "2.2"    => "2punkt2",
 );

?>

<!-- SUBMENU CODE -->
<?php

function show_submenu($menu_data,$this_id) {
$navi="";
if (isset($_GET[$this_id])){
        $navi = "<ul>\n";
         foreach ($menu_data as $title => $id) {
          if (is_array($id))
          {
             $navi .= " <li><a href='index.php?section=".$id."&".$title."'>(".$title.")\n";
             $navi .= show_submenu($id,$title);
             $navi .= "</li>\n";
          }else{
          $navi .= " <li><a href='index.php?section=".$id."'>".$title."</li>\n";}

         }
        $navi .= "</ul>";
}
        
        return $navi;
}
?>

<!-- DIV NAV -->
<div style="width:200px; height:300px; background-color:#0F0; float:left;">

<ul>
<li><a href="?submenu1&section=1">1</a><?php echo  show_submenu($menu_1,"submenu1") ; ?></li>
<li><a href="?submenu2&section=2">2</a><?php echo  show_submenu($menu_2,"submenu2") ; ?></li>
<li><a href="index.php?section=3">3</a></li>
</li>

</ul>
</div>
<!-- /DIV NAV -->

<!-- /DIV CONTENT -->
<div style="width:400px; height:300px; background-color:#F00; float:left; color:#FFF;">
<p>
<?php
if (isset($_GET['section'], $section[$_GET['section']])) {
    include $section[$_GET['section']];
} else {
    include $section['1'];
}
?>
</p>
</div>
<!-- /DIV CONTENT -->

</body>
</html>

Wie ihr seht, habe ich das PHP-Script fürs Menü nochmal nach meinem Kenntnisstand leicht modifiziert. Und siehe da es funktioniert!
Fast... wenn ich jetzt auf einen Untermenüpunkt klicke, schließt sich das Untermenü. Genau das will ich aber auf alle Fälle vermeiden!
Da ich den Menü-Code aus einem anderen Forum habe, kann es auch sein, dass da noch irgendwelche Variablen drin sind, die ich gar nicht mehr brauche, was $this_id macht, weiß ich z.B. garnicht...
$title schätze ich mal, ist der linke Wert in den "Menü-Arrays" und wird durch den foreach Befehl definiert?

Gruß
Andy
 
Zuletzt bearbeitet:
Ok gehen wir mal durch:

$title ist der Schlüssel des Array $menu_1 oder $menu_2. Jenachdem wie die Funktion aufgerufen wurde, dazu folgendes:

show_submenu ist eine Funktion (function), der übergabewerte übergeben werden.

Du rufst das ganze so auf:
PHP:
<a href="?submenu1&section=1">1</a><?php echo  show_submenu($menu_1,"submenu1") ; ?>
(Aus deiner Navigation)

Damit rufst du
PHP:
function show_submenu($menu_data,$this_id)
auf.
Dabei nimmt $menu_data den Wert von $menu_1 an und $this_id wird zu "submenu1".
Dadurch zeigt sich das $title der Schlüssel (links) von $menu_1 und $id der Wert (rechts) ist.

Ziemlich am Anfang deiner Funktion steht das:
PHP:
if (isset($_GET[$this_id])){
Aus der Schlussfolgerung weiter oben, hat $this_id beim ersten aufruf "submenu1" ist. Jetzt guckt er sich die Get-Parameter an (Diese siehst du ja auch in der URL). Nur wenn "submenu1" in der aufgerufenen Url vorhanden ist, wird das submenu angezeigt. Wenn du dir den ersten PHP Block anguckst, dann siehst du das der erste Get-Paramater "submenu1" ist.
Um zu verhindern das das Submenu geschlossen wird kannst du deine Links entsprechend anpassen, das $this_id immer als Get-Paramater ausgegeben wird. Würde dann so aussehen:
PHP:
$navi .= " <li><a href='index.php?".$this_id."&section=".$id."&".$title."'>(".$title.")\n";
 
Zuletzt bearbeitet:
Vielen Dank, funktioniert soweit! :)

Das einzige was mir jetzt noch fehlt ist die Markierung der Links, wenn sie aktiv sind, also wenn gerade die Seite angezeigt wird, auf die sie verlinken.

Für die Links der übergeordneten Menüpunkte habe ich das in meiner index.php wie folgt gelöst:
Ich habe eine Klasse in CSS angelegt und folgenden PHP-Code in die Links eingefügt:
PHP:
<?php if ($_GET['section']=="3"){echo'class="linkactive"';} ?>

Ein Link sieht dann bspw. so aus:
Code:
<li><a href="index.php?section=3" <?php if ($_GET['section']=="3"){echo'class="linkactive"';} ?>>3</a></li>

Jetzt habe ich überlegt, an welcher Stelle ich den Code nun in mein Menü-Script einsetzen muss, sodass der Code korrekt in jedem erzeugten (Untermenü-)Link angezeigt wird.
Ich dachte, das ginge einfach so:

PHP:
<?php

function show_submenu($menu_data,$this_id) {
$navi="";
if (isset($_GET[$this_id])){
        $navi = "<ul>\n";
         foreach ($menu_data as $title => $id) {
          if (is_array($id))
          {
             $navi .= " <li><a href='index.php?".$this_id."&section=".$id."&".$title."' 
// Einfügen des Codes für Klasse "linkactive"
<?php if ($_GET['section']=="$id"){echo'class="linkactive"';} ?>
>(".$title.")\n";
             $navi .= show_submenu($id,$title);
             $navi .= "</a></li>\n";
          }else{
          $navi .= " <li><a href='index.php?".$this_id."&section=".$id."'>".$title."</a></li>\n";}

         }
        $navi .= "</ul>";
}
        
        return $navi;
}
?>

So einfach scheints dann aber doch nicht zu sein... erhalte folgenden Fehler:
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in C:\...\index.php on line 49

... muss ich vll irgendwie definieren was erst als Text ausgegeben und was sofort "verarbeitet" werden soll, z.B. die Variable $id? Kann mein Ansatz überhaupt funktionieren oder muss ich doch anders an die Sache rangehen?
 
Der Ansatz ist auf jeden Fall richtig.

Aber du bist bereits im PHP.

Probiere es mal hiermit:


PHP:
<?php

function show_submenu($menu_data,$this_id) {
$navi="";
if (isset($_GET[$this_id])){
        $navi = "<ul>\n";
         foreach ($menu_data as $title => $id) {
          if (is_array($id))
          {
             $navi .= " <li><a href='index.php?".$this_id."&section=".$id."&".$title."'";
             if($_GET['section']==$id) {
                  $navi.=" class='linkactive'";
             }
             $navi .=">(".$title.")\n";
             $navi .= show_submenu($id,$title);
             $navi .= "</a></li>\n";
          }else{
          $navi .= " <li><a href='index.php?".$this_id."&section=".$id."'>".$title."</a></li>\n";}

         }
        $navi .= "</ul>";
}
        
        return $navi;
}
?>


Ein passender Editor hätte dir schon gezeigt das es Fehler gibt ;) Ich benutze zum Beispiel Eclipse.
 
Danke bis hierhin, aber habe den Code genau so ausprobiert und es klappt leider noch nicht...
PHP:
<?php

function show_submenu($menu_data,$this_id) {
$navi="";
if (isset($_GET[$this_id])){
        $navi = "<ul>\n";
         foreach ($menu_data as $title => $id) {
          if (is_array($id))
          {
             $navi .= " <li><a href='index.php?".$this_id."&section=".$id."&".$title."'";
             if($_GET['section']== $id) {
                  $navi .= " class='linkactive'";
             }
             $navi .= ">(".$title.")\n"; 
             $navi .= show_submenu($id,$title);
             $navi .= "</a></li>\n";
          }else{
          $navi .= " <li><a href='index.php?".$this_id."&section=".$id."'>".$title."</a></li>\n";}

         }
        $navi .= "</ul>";
}
        
        return $navi;
}
?>

Liegt das vielleicht an nem Denkfehler? ...frage mich grade ob die if-Abfrage nur beim Ausführen des Scripts funktioniert, oder ob die so in die Links eingebaut wird, dass die Bedingung wirklich erst beim Draufklicken geprüft wird?
 
Zuletzt bearbeitet:
An welcher Stelle in meinem Code muss ich denn
PHP:
print_r($menu_data)
einfügen?
 
So?
PHP:
<?php

function show_submenu($menu_data,$this_id) {
$navi="";
print_r($menu_data)
if (isset($_GET[$this_id])){
        $navi = "<ul>\n";
         foreach ($menu_data as $title => $id) { 
		  if (is_array($id))
          {
             $navi .= " <li><a href='index.php?".$this_id."&section=".$id."&".$title."'";
             if($_GET['section']== $id) {
                  $navi .= " class='linkactive'";
             }
             $navi .= ">(".$title.")\n"; 
             $navi .= show_submenu($id,$title);
             $navi .= "</a></li>\n";
          }else{
          $navi .= " <li><a href='index.php?".$this_id."&section=".$id."'>".$title."</a></li>\n";}

         }
        $navi .= "</ul>";
}
        
        return $navi;
}
?>
Naja fürchte das ist falsch...
bekomme jedenfalls
Parse error: syntax error, unexpected T_IF in ...\localhost\index.php on line 50
im Browser angezeigt. Line 50 ist:
PHP:
if (isset($_GET[$this_id])){

EDIT: Ok, das ";" hat gefehlt... .War die Stelle richtig an der ich print_r eingefügt habe?
 
Zuletzt bearbeitet:
Genau.
Ich will doch nur sehen was für Daten und in welcher Struktur (Verschachtelung) du sie in die Funktion jagst.
Gib mir die Ausgabe von print_r()!!

Code:
function show_submenu($menu_data,$this_id) { 
  print_r($menu_data);
}
reicht dafür allemal.
 
Ok, also im Menü steht dann:

1Array ( [1.1] => 1punkt1 [1.2] => 1punkt2 )
2Array ( [2.1] => 2punkt1 [2.2] => 2punkt2 )
3
 
Bin nicht dazu gekommen.
Werde es mir die nächsten Tage anschauen und dir höchstwahrscheinlich eine andere Lösung bieten (aber im Prinzip mit selben Aufbau).

Könntst du mit mit HTML eine Beispiel-Ergebnis schicken, damit ich sehe nach welcher Struktur das CSS arbeitet (ohne das auszuprobieren). Irgendwo wirst du das sicher haben?
 
Danke für deine Mühe!
Meinst du mit Beispielseite sowas hier?
So sieht's jedenfalls aus, wenn man bspw. auf "1" geklickt hat:
 

Anhänge

Ähnliche Themen

Zurück
Oben