|
|
|
|
Dynamisches Menü für PHP Seite gesucht |
Rudolf
BlackBoarder
Dabei seit: 16.09.2003
Beiträge: 958
|
|
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?
|
|
01.03.2009 19:17 |
|
|
Zirias
BlackBoarder
Dabei seit: 11.09.2002
Beiträge: 1.217
Herkunft: /dev/urandom
|
|
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)
__________________ palmen-it.de
GCS/MU d+(++) s+: a C++ UL++++ P+++$ L+++ !E W+++ N+ o? K? w++$ !O M-- V?
PS+ PE++ Y+ PGP++ t !5 X- R- tv b+ DI++ D+ G e++ h r y+
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Zirias: 01.03.2009 20:59.
|
|
01.03.2009 20:56 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
Ich pack jetzt mal das Visitor Pattern aus
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
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
01.03.2009 22:30 |
|
|
LX
El Comandante en Jefe
Dabei seit: 25.11.2001
Beiträge: 5.372
Herkunft: Berliner Bronx
|
|
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.
__________________ JS-Games.de - Misled Scripting Skills Gone Mad | Meine Filmkritiken | Urban Photography
Kommt mal in den IRC-Channel: irc.eu.freenode.net | Port 6667 | #blackboard
"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett
|
|
01.03.2009 23:57 |
|
|
Zirias
BlackBoarder
Dabei seit: 11.09.2002
Beiträge: 1.217
Herkunft: /dev/urandom
|
|
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
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.
__________________ palmen-it.de
GCS/MU d+(++) s+: a C++ UL++++ P+++$ L+++ !E W+++ N+ o? K? w++$ !O M-- V?
PS+ PE++ Y+ PGP++ t !5 X- R- tv b+ DI++ D+ G e++ h r y+
|
|
02.03.2009 09:09 |
|
|
Rudolf
BlackBoarder
Dabei seit: 16.09.2003
Beiträge: 958
Themenstarter
|
|
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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Rudolf: 03.03.2009 01:42.
|
|
03.03.2009 01:41 |
|
|
LX
El Comandante en Jefe
Dabei seit: 25.11.2001
Beiträge: 5.372
Herkunft: Berliner Bronx
|
|
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.
__________________ JS-Games.de - Misled Scripting Skills Gone Mad | Meine Filmkritiken | Urban Photography
Kommt mal in den IRC-Channel: irc.eu.freenode.net | Port 6667 | #blackboard
"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett
|
|
03.03.2009 02:08 |
|
|
Zirias
BlackBoarder
Dabei seit: 11.09.2002
Beiträge: 1.217
Herkunft: /dev/urandom
|
|
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.
__________________ palmen-it.de
GCS/MU d+(++) s+: a C++ UL++++ P+++$ L+++ !E W+++ N+ o? K? w++$ !O M-- V?
PS+ PE++ Y+ PGP++ t !5 X- R- tv b+ DI++ D+ G e++ h r y+
|
|
03.03.2009 09:06 |
|
|
Rudolf
BlackBoarder
Dabei seit: 16.09.2003
Beiträge: 958
Themenstarter
|
|
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?
Dieser Beitrag wurde 5 mal editiert, zum letzten Mal von Rudolf: 06.03.2009 07:50.
|
|
06.03.2009 05:30 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
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.
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
06.03.2009 10:01 |
|
|
|
|
|
|