Einzelnen Beitrag anzeigen
  #4  
Alt 06.09.2007, 22:47:52
Eskayp Eskayp ist offline
Anfänger
 
Registriert seit: Sep 2007
Beiträge: 18
AW: Navigation mit PHP

Hiho,

zu 1.

Im Prinzip hast Du zwar eine variable Lösung programmiert, diese durch den Sonderfall des Untermenüs aber doch wieder starr und unflexibel gestaltet. In diesem Fall hätte man sich das Prinzip der Arrays letztendlich doch wieder sparen können.

Um Dein ursprüngliches Konzept, das Menü aus einem Array zu erzeugen, beizubehalten, dürfte es nur ein Array geben das alle Menüpunkte umfasst.

Z.B. so:
PHP-Code:
<?php
  $menu 
= array(
    
'eins' => array('title' => 'Eins''parent' => ''),
    
'zwei' => array('title' => 'Zwei''parent' => ''),
      
'aaa' => array('title' => 'AAA''parent' => 'zwei'),
      
'bbb' => array('title' => 'BBB''parent' => 'zwei'),
    
'drei' => array('title' => 'Drei''parent' => '')
  );
?>
Wie Du siehst, wird das Untermenü über das Feld 'parent' zugeteilt.


Mit diesem Prinzip schlägst Du zwei Fliegen mit einer Klappe. Zum einen kann man aus diesem Array das komplette Menü erzeugen, zum anderen kannst Du Dich leicht aus Deinem Problem zu Frage 3 retten (dazu später).

Das Hauptmenü ist schnell erzeugt. Du musst nur das Array der Reihe nach durchgehen und alle die Elemente ausgeben, deren parent = '' ist.

PHP-Code:
<ul><?php
  
foreach ($menu as $id => $item) {
    if (
$item['parent'] == '') {
      echo 
'<li><a href="index.php?s='.$id.'">'.htmlentities($item['title']).'</a></li>';
    }
  }
?></ul>
Jetzt muss noch das Untermenü eingebaut werden. Dazu bestimmst Du erst, ob Dein Untermenü denn einen Parent (also ein Elternelement) hat. Wenn ja, wird einfach bei diesem Elternelement das Untermenü ausgegeben. Wir hätten also zwei foreach-Schleifen in einander verschachtelt, und beide würden das $menu-Array durchlaufen. Das geht nicht, also erzeugen wir das Untermenü einfach vorher:

PHP-Code:
<?php
  
// erstmal dieses s belegen
  
if (isset($_GET['s']))
    
$s $_GET['s'];
  else
    
$s 'eins';

  
// Dann das Elternelement für das Untermenü bestimmen
  // Es gibt dafür zwei Fälle: Entweder ein Unterelement wurde angeklickt, oder
  // das Hauptelement selbst. Wenn das Menüelement also kein Parent hat,
  // probieren wir einfach mal das Hauptmenüelement. Und wenn das kein
  // Untermenü hat, dann hat's eben keins :)
  
$parent $menu[$s]['parent'];
  if (
$parent == ''$parent $s;

  
// So, jetzt wird das Untermenü erzeugt (wenn es denn eins gibt)
  
$submenu '';
  foreach (
$menu as $id => $item) {
    if (
$item['parent'] == $parent) {
      
$submenu .= '<li><a href="index.php?s='.$id.'">'.htmlentities($item['title']).'</a></li>';
    }
  }
  if (
$submenu != ''$submenu '<ul>'.$submenu.'</ul>';

  
// So, jetzt einfach nur in das Hauptmenü (siehe oben) einbauen...
  
echo '<ul>';
  foreach (
$menu as $id => $item) {
    if (
$item['parent'] == '') {
      echo 
'<li><a href="index.php?s='.$id.'">'.htmlentities($item['title']).'</a>';
      if (
$id == $parent) {
        echo 
$submenu;
      }
      echo 
'</li>';
    }
  }
  echo 
'</ul>';
?>
Naja, habe es einfach nur runtergetippt, also müsstest Du mal testen. Aber so ähnlich sollte es laufen...

Diese Routine gibt jetzt leider noch keine Untermenüs zu Untermenüs her. Das zu erweitern habe ich Dir überlassen :)

2. Zu Deinem Problem mit der Position der Untermenüs hat ja Fabian schon etwas geschrieben. Ansonsten ist das wohl eher ein CSS-Problem, und kein PHP-Problem.

3. Wie Du schon richtig erkannt hast, ist der Aufruf einer über $_GET erhaltenten Variable in einem include nicht sehr schön bzw. bedeutet sogar eine Sicherheitslücke. Davor kannst Du Dich aber ganz einfach schützen, indem Du die Variable auf Gültigkeit prüfst. Wenn diese keinen von Dir definierten Wert enthält, dann setzt Du sie neu.

Diese Werte hast Du im Prinzip schon definiert. Und zwar in Deinem Array $menu. Die Schlüssel (Keys) des Arrays sind alle erlaubten Werte für $s.

Diese Schlüssel erhälst Du mit dem Befehl array_keys und ob $s enthalten ist kann man mit in_array prüfen.

PHP-Code:
<?php
  
if (isset($_GET['s'])) {
    
$s $_GET['s'];
    
// Wenn Wert s nicht in den Schlüsseln des Menüs vorkommt, wird s = "eins" gesetzt.
    
if (!in_array($sarray_keys($menu))) $s 'eins';
  }
  else
    
$s 'eins';
?>
Dieser Block ersetzt den ersten Block im Script oben drüber.



So, und jetzt viel Spaß beim Umsetzen :)

Grüße
Kai

Geändert von Eskayp (06.09.2007 um 22:48:34 Uhr)
Mit Zitat antworten