BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Webdesign (http://www.black-board.net/board.php?boardid=19)
--- (X)HTML Dynamisches Menü für PHP Seite gesucht (http://www.black-board.net/thread.php?threadid=23654)


Geschrieben von Rudolf am 01.03.2009 um 19:17:

  Dynamisches Menü für PHP Seite gesucht

Hi Leute,

ich brauche mal eure Hilfe. Ich möchte eine Webseite in XHTML programmieren. Da ich zu faul bin mich mit Webdesignprogrammen zu beschäftigen, möchte ich die Seite mit einem normalen Texteditor programmieren. Aus diesem Grund sollte die Programmierung der Seite so einfach wie möglich gestaltet werden. Aus diesem Grund möchte ich die Seite folgendermaßen aufbauen.

Ich möchte ein PHP Script erstellen, das zuerst einen oberen Bereich der Seite lädt. Anschließend wird ein Menü geladen, dann der Lesebereich der Seite und am Ende das Ende der Seite.

Folgende Überlegung habe ich angestellt. So könnte das Script ausschauen

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:

include "anfang.php";  

$ext = ".php";  
$page[] = "seite1"; 
$page[] = "seite2";  

switch($_GET['inc']) 
{ 	
case $page[1]: include $page[1].$ext; break; 	
default: include $page[0].$ext; break; 
}  

include "ende.php";



Der Link lautet damit index.php?inc=seite2. Damit wird seite2.php gelanden. Alles andere lädt seite1.php

Das Script reicht aus, wenn du mit einem statischen Menü leben möchtest. Ich möchte aber eine Seite haben, worauf sich das Menü verändert und beim Klick auf eine Hauptkategorie Menüunterpunkte angezeigt werden wie z.B. auf http://www.solon.com/cw/de/kunden/

Kann mir jmd n Stichwort sagen womit man ein Script für mein Vorhaben finden kann oder mir direkt n Code zuwerfen?



Geschrieben von Zirias am 01.03.2009 um 20:56:

 

Würd ich in ein paar Klassen kapseln, hab gerade heute sowas gemacht:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
  ,----------.     ,----------.
  | mainMenu |     | menuItem |
  `----------'     `----------'
         1 |        /\     /\
           |        --     --
           |        /       \
         * |       /         \
        ,--------------.  ,-------------.
        | mainMenuItem |  | subMenuItem |
        `--------------'  `-------------'
              | 1              * |
              |                  |
              | 0,1              |
        ,---------.              |
        | subMenu |--------------'
        `---------' 1


Jede Klasse hat eine "render()" Methode, aufgerufen wird die von mainMenu (gibt es nur ein Objekt), und jede render()-Methode ruft die render() Methoden ihrer Kinder auf.

Dem Konstruktor von "mainMenu" wird die aktuelle Seite und Unterseite übergeben, er kann entsprechend das Menü passend aufbauen (mit auf- oder zugeklappten subMenus und passenden active-Flags für die "menuItem" Objekte)



Geschrieben von phlox81 am 01.03.2009 um 22:30:

 

Ich pack jetzt mal das Visitor Pattern aus Augenzwinkern

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
class Menu
{
  var $ entry="";
  var $submenu = array();
  menu($entry){$this->entry = entry;}
  function accept($visitor)
 {
  $visitor->visit(*this);
  }
  function insertSubmenu($menu){...}
}

class Visitor
{
   abstract function visit($guest);
}

class MenuPrinter extends Visitor
{
  var $level =0;
  function visit($guest)
  {
    $this->level++;
    printMenu($guest,$this->level);//da wird das Menu ausgegeben. Wahlweise kann level 0 auch root sein, und somit unsichtbar. (if(level > 0))
    foreach($guest->submenu as $m)
      $m->accept($visitor);
    $this->level--;
   }


Dann ganz einfach das Menü aufbauen:

code:
1:
2:
3:
4:
5:
$main = new Menu("Main");
for(int i =0; i <10; i++)
$main->insertSubmenu(new Menu("sub"+$i);
$printer = new MenuPrinter();
$main->accept($printer); 


Somit braucht man die Klasse nicht mit Funktionalität überladen, und lässt sich durch weitere Besucher einfach erweitern.

phlox



Geschrieben von LX am 01.03.2009 um 23:57:

Achtung

Warum nicht ein schnödes geschachteltes Array, in dem man den Menübaum abbildet und dann abhängig vom aktuell aktiven Menüpunkt die Unterpunkte anzeigt oder eben auch nicht?

Wenn man es richtig™ machen will, dann müsste man für eine beliebig tief geschachtelte Baumstruktur ein Nested Set bemühen, aber so wie das hier klingt wären das Kanonen auf Spatzen.



Geschrieben von Zirias am 02.03.2009 um 09:09:

 

LX, in MEINEM Fall hätte das nicht gereicht, weil auch der aktuall aktive Unterpunkt hervorgehoben sein sollte. Ob man natürlich die Render-Logik dann wirklich in die Klassen reinnimmt, oder die Klassen nichts weiter sind als Datenstrukturen in einem Array, das ist irgendwo Geschmackssache. Ich fand es ganz schön, wenn sich jedes Element selbst ausgeben kann smile

Dieb genauen Anforderungen von Exelmes kenne ich ja nicht, mir schien aber auch eher etwas einfaches gefordert zu sein, also hab ich halt mal gepostet, was ich mir sowies gerade aus den Fingern gesaugt hatte.



Geschrieben von Rudolf am 03.03.2009 um 01:41:

 

Zitat:
Original von LX
Warum nicht ein schnödes geschachteltes Array, in dem man den Menübaum abbildet und dann abhängig vom aktuell aktiven Menüpunkt die Unterpunkte anzeigt oder eben auch nicht?

Wenn man es richtig™ machen will, dann müsste man für eine beliebig tief geschachtelte Baumstruktur ein Nested Set bemühen, aber so wie das hier klingt wären das Kanonen auf Spatzen.


Also daran habe ich auch schon gedacht. Da stellt sich mir folgende Fragen.

1.Wie weißt das Script welche Menüstruktur es anzeigen soll

2.Weil die Antwort auf Frage 1. höchstwahrscheinlich irgendetwas mit ?a=link lauten wird, frage ich mich wie man das Script so schreibt, dass die Links wie www.example.de/cat1/cat2 aussehen. Ich weiß, dass es da ein modul für gibt, das Joomla auch beherrscht. Und da ich nicht weiß, ob mein Webspace sowas kann, frage ich mich, ob man es so hinbekommt, ohne den Server zu konfigurieren.



Geschrieben von LX am 03.03.2009 um 02:08:

Achtung

1. Wenn das Skript weiß, welche Seite es anzeigen soll, wird es ja nicht so schwer sein auch daraus zu lesen, an welcher Stelle im Menü man sich befindet.

2. mod_rewrite ist das Zauberwort, das sollte selbst auf normalem Webspace funktionieren.



Geschrieben von Zirias am 03.03.2009 um 09:06:

 

Zitat:
Original von LX
2. mod_rewrite ist das Zauberwort, das sollte selbst auf normalem Webspace funktionieren.


Das geht zwar, ist aber IMHO eher eine Notlösung, da es dann plötzlich "interne" URLs gibt, die immer noch die von der Semantik her falschen Query-Parameter haben.

Besser ist es, direkt den cgi REQUEST_URI auszuwerten (in PHP z.B. über $_SERVER). Wenn der Webserver beim Abstieg durch die virtuellen Pfade einen Script-Handler findet, bricht er dort ab und führt ihn aus, der Rest des Pfads bleibt erhalten. Daraus ergeben sich dann URLs wie
http://example.com/foo.php/page1/
Das sollte eigentlich auf jedem normal konfigurierten Server mit PHP gehen.

Wenn einen das ".php" dabei noch stört, kann man auch den PHP-Handler gezielt mit "AddHandler" anderen Files geben, das wird dann aber wahrscheinlich nicht bei vom Provider konfigurierten Apache in .htaccess gehen.



Geschrieben von Rudolf am 06.03.2009 um 05:30:

 

Der Addhandler sorgt nur dafür, dass eine index.php gelanden wird, falls der Apache nicht sowieso nach einer solchen Datei im / sucht. Wie hilft mir das die Datei index.php bei der Übergabe von Veriable auszublenden?

Und ich verstehe noch nicht ganz, was du mit $_SERVER['REQUEST_URI'] möchtest. Das gibt doch nur das aktuelle Verzeichnis aus, wo sich die aufgerufene Datei befindet.

Bitte um Aufklärung.

Oder bin ich in der Annahme richtig, dass die Variablen wie page1 als echte Verzeichnisse im Webserver liegen und das Script nach solchen Daten sucht?

EDIT

So Leute, ich habe nun folgendes entwickelt

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:

<?php
if (!empty($_GET['inc'])) 
{ 
  $inc$_GET['inc']; 
  $array explode("/",$inc);
  $page$array[0];
  $child $array[1];
  $ext ".php";
}
else $inc"null";
?>
<li><a href="/">Home</a></li>
<li><a href="/?inc=haupt1/">Haupt1</a></li>
<?php if($page=="haupt1") { ?>
<ul>
  <li><a href="/?inc=haupt1/unter11">unter11</a></li>
  <li><a href="/?inc=haupt1/unter22">unter22</a></li>
 </ul>
<?php ?>
<li><a href="/?inc=haupt2/">Haupt2</a></li>    
<?php if($page=="haupt2") { ?>
<ul>
  <li><a href="/?inc=haupt2/unter21">unter21</a></li>
  <li><a href="/?inc=haupt2/unter22">unter22</a></li>
</ul>
<?php ?>


Die Idee dahinter ist halt, dass, wenn ich schon ?inc= verwende, dass die Zuordnung nach / erfolgt. Also haupt1/unter1 z.B.

Und beim Klick auf ein Untermenü soll natürlich eine Datei includiert werden, die im Lesebereich angezeigt wird. Den Script dafür habe ich noch nicht entwickelt.

Vielleicht habt ihr eine gescheitere Codelösung für mich, da mir alles etwas suboptimal vorkommt.

Edit:

Ich habe das Problem anders gelöst. Ist schon ok, aber da stellt sich mir eine andere Frage.

Ich habe eine Arry in dieser Form definiert:

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
variable[]="seite1"variable[]="seite2"variable[]="seite3";  

und möchte sie in Form von     
switch($_GET['inc'])   
{     
case $variable[0]: include variable[0]; break;     
case $variable[1]: include variable[1]; break;     
case $variable[2]: include variable[2]; break;   
}

abrufen.

wenn die Array größer wird, ist es von Vorteil eine Schleife zu erstellen, die so lange ausgeführt wird bis alle case Fälle durchgegangen werden. Also in dem Beispiel von 0 bis 2x. Gibts da ne Lösung und wie lautet sie?



Geschrieben von phlox81 am 06.03.2009 um 10:01:

 

Zitat:
Original von Exelmes
Die Idee dahinter ist halt, dass, wenn ich schon ?inc= verwende, dass die Zuordnung nach / erfolgt. Also haupt1/unter1 z.B.

Und beim Klick auf ein Untermenü soll natürlich eine Datei includiert werden, die im Lesebereich angezeigt wird. Den Script dafür habe ich noch nicht entwickelt.


Hm, du solltest da evtl einfach nur die ID des Menüeintrages angeben, das lässt sich dann relativ leicht auswerten.


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH