Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Dynamisches Menü (ich denke in die falsche Richtung) [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Dynamisches Menü (ich denke in die falsche Richtung)


 
iBumsti
18-02-2007, 20:00 
 
Hallo...

Ich arbeite grad an meiner Homepage weiter, und bin grad am überlegen, wie ich das Menü am besten aufzieh..

Begonnen habe ich mit einer datei menu.php

Darin sind lauter if-Abfragen wo ich mit der Adresse einen Wert weitergebe welches Menü grad geöffnet werden soll, da sich das Menü oft ändern soll wenn ein Link angeklickt wird.

(Beispeil)

if($gr==un){

echo"
<br><br>
<a href=index.php class=\"hauptsitemenu1link\">Startseite</a><br><br>
<a href=index.php?page=ft&gr=fts class=\"hauptsitemenu1link\">Fotos</a><br>
<a href=index.php?page=zper&gr=zp class=\"hauptsitemenu1link\">Zur Person</a><br><br>
<a href=index.php?page=anderer Link class=\"hauptsitemenu1link\">anderer Link</a><br><br>
<a href=index.php?page=anderer Link class=\"hauptsitemenu1link\">anderer Link</a><br><br>


";
}

wenn nun z.B.: Fotos geklickt wird dann passiert folgendes:
Es öffnet sich die neue Seite mit diesem Menü:


if($gr==fts){

echo"
<br><br>
<a href=index.php class=\"hauptsitemenu1link\">Startseite</a>
<br><br>
<b>
<a href=index.php?page=ft&gr=fts class=\"hauptsitemenu1link\">Fotos</a>
<br></b><i>
<a href=index.php?page=ft&action=achim&gr=fts class=\"hauptsitemenu1link\">Achim</a><br>
&nbsp;&nbsp;
<a href=index.php?page=ft&action=steffi&gr=fts class=\"hauptsitemenu1link\">Steffi</a><br>
&nbsp;&nbsp;
<a href=index.php?page=ft&action=freunde&gr=fts class=\"hauptsitemenu1link\">Freunde</a>
<br></i>
<a href=index.php?page=zper&gr=zp class=\"hauptsitemenu1link\">Zur Person</a><br><br>


";
}

Aber so werd ich alt...

Gibt es nicht eine einfachere Möglichkeit wie man das lösen kann?
Ich kann ja nicht 100.000 if-Abfragen machen, nur damit ich immer das richtige Menü zur richtigen Seite aufrufe...
Außerdem, man stelle sich einmal vor, dass z.B. der Link "zur Person" einmal sich änder sollte oder gelöscht wird...
Das ist ja ein extremer aufwand, in jeder if-Abfrage nachzuschauen, ob da der Link enthalten ist.

Kann mir jemand einen denkanstoß geben, ein Beispielscript verraten oder sonstiges...
Bin für alles dankbar...

LG euer,
Achim

 
wahsaga
18-02-2007, 20:07 
 
if($gr==un){
Strings sind immer noch keine Konstanten.

Und dein Problem sollte sich mit einer vernünftigen Datenstruktur lösen lassen - bspw. Ablage der Linktexte/-ziele in Arrays, Durchlaufen dieser in Schleifen.

 
penizillin
18-02-2007, 20:10 
 
stell mal das error_reporting hoch.
http://www.php-resource.de/forum/showthread.php?s=&threadid=50454

du solltest nicht mit der navigation sondern mit der datenstruktur beginnen. vielleicht sollte man sie in einer db lagern. in welcher relation stehen sie zueinander, welche dienste möchtest du anbieten, etc.

 
iBumsti
18-02-2007, 20:24 
 
Hi... Ich mir jetzt mal die Seite mit den Regeln welche du mir gepostet hast durchgelesen, und verstehe nicht, warum du sie mir postest....

Zum Anderem die Links in eine DB eintragen naja... Wäre möglich, ist aber nicht mein Wunsch, da ich dann wieder für jede Seite eine Abfrage machen muss.. Kann ich gleich bei mein Art bleiben...
(hast du das gemeint?)

und mit der array-Schleife ist mir zwar klar, wie ich das Menü aufrufe, aber nicht wie ich es für jede Seite anders aussehn lasse.
:(
LG Achim

 
wahsaga
18-02-2007, 21:51 
 
Original geschrieben von iBumsti
Hi... Ich mir jetzt mal die Seite mit den Regeln welche du mir gepostet hast durchgelesen, und verstehe nicht, warum du sie mir postest....
Damit du dein error_reporting beim Entwicklen vernünftig einstellst - dann müssen nicht wir dir erklären, dass du undefinierte Konstanten verwendest, dann kann PHP das selber übernehmen.
und mit der array-Schleife ist mir zwar klar, wie ich das Menü aufrufe, aber nicht wie ich es für jede Seite anders aussehn lasse.
Na dann definierst du vielleicht erst mal genauer, was das im Detail bedeuten soll.

Und auf den Gedanken, dass man in einem Array ja evtl. auch hinterlegen könnte, für welche Seiten ein Menüpunkt "gültig" sein soll, oder für welche Seiten welche Punkte existieren, kommst du ja vielleicht auch selber, wenn du erst mal wirklich ein paar Überlegungen zu einer vernünftigen Datenstruktur anstellst.

 
jahlives
19-02-2007, 09:38 
 
Ist $gr ein URL Parameter ? Mein Vorschlag wäre auch ein Array mit den Indecies nach dem Parameter

$temp = array();
$temp['un'] = array('<a href=index.php class=\"hauptsitemenu1link\">Startseite</a>',
'<a href=index.php?page=ft&gr=fts class=\"hauptsitemenu1link\">Fotos</a>');

Anhand des Parameters stellts du fest welche Index vom temp geladen werden muss und läufst du die Links mittels einer Schleife und gibst diese aus

if(isset($gr) && array_key_exists($gr,$temp)){
foreach($temp[$gr] as $wert){
echo $wert;
}
}

Gruss

tobi

 
iBumsti
21-02-2007, 21:17 
 
Tobi du bist S.U.P.E.R.
(Durch deinem Text hat sich in meinem Hirn der Knopf gelöst, und jetzt hab ich die Idee von penizillin nochmal überlegt, und denke, dass das wirklich besser ist.

Zum Punkt Datenstruktur bin ich jetzt auch ein ganzes Stück weiter gekommen.

Ich danke euch allen... :respekt:

LG Achim

 
zerni
21-02-2007, 21:21 
 
Also ist es besser einen riesigen Array zu haben als viele If oder Trinitäts abfragen??

 
jahlives
21-02-2007, 23:22 
 
Also ist es besser einen riesigen Array zu haben als viele If oder Trinitäts abfragen??

Im Falle eines Nav Menues einer Webseite ist riesig wohl eher relativ zu sehen ;) Da geht es wohl mehr darum sich keinen Tippkrampf zu holen...
Und ja die Prüfung von Bedingungen kostet auch ein bissel Rechenzeit pro if. Das merkst du schnell wenn du mal ein Primzahlensieb bastelst und sehr grosse Zahlen nimmst (Bedingungen in Schleifen die milionenfach durchlaufen werden). Da kommen Sekundenunterschiede zusammen.
Ich würde wagen zu behaupten, dass PHP so ein Array schneller aufgebaut hat, als es ein if/elseif Konstrukt mit x-fachen Verzweigungen durchläuft.

Gruss

tobi

p.s. die Sache sieht ev anders aus wenn du eine Navi aller www Seiten aufbauen willst. Aber in diesem Falle hättest du mit php noch ganz andere Probleme ;)

 
zerni
21-02-2007, 23:31 
 
ich dachte das so:

foreach($menu as $menu_topic){
$topic = ($menu_topic['id'] == $_GET['id']) ?
'<a href=link.php?id='.$menu_topic['id'].'>'.$menu_topic.'</a>' :
'<b><a href=link.php?id='.$menu_topic['id'].'>'.$menu_topic.'</a></b>';
echo $topic;
}

und jenachdem wieviel menupunkte das sind werden das schon recht große arrays!

bei 10 Menupunkten hat man immer hin 100 Einträge!

 
jahlives
21-02-2007, 23:38 
 
Dat ist ne nette Lösung. Habe gar ned daran gedacht das so dynamisch zu machen :grin:
Statisch oder dynamisch, das ist hier die Frage...

Gruss

tobi

 
zerni
22-02-2007, 00:47 
 
und um das zu untermauern:

http://www.zer-design.de/test.php?id=2

meinst ist schneller!!!

leider musste ich irgendwie noch doppel arrays einbauen, sonst wäre er noch viel schneller!

 
wahsaga
22-02-2007, 09:11 
 
Original geschrieben von zerni
http://www.zer-design.de/test.php?id=2

meinst ist schneller!!!
Ziemlicher Bullshit sind beide "Lösungen" noch - wenn man sich allein die Redundanz der Daten schaut.

 
Wyveres
22-02-2007, 11:42 
 
link Menüs löse ich normalerweise so.

ganz simples beispiel ^^


MYSQL SCHEMA

ID Name U_ID
1-Home-0
2-blafasel-0
3-Gästebuch-0
4-Gb_Eintrage-3

usw.


vorteil
ich frage nur ab wo U_ID null ist
um das haupt menü aufzubauen.

erst wenn ein link wirklich geklickt wurde. übertrage ich zu diesem die ID und prüfe auf diese ob es namen mir der U_ID gibt.
zudem lässt sich der content der eventuell geladen werden soll auch an der ID fest tackern.

meiner meinung nach eigentlich ein recht simples aber effektives system.

vorallem kann man dann die GET parameter
zb.
index?page=1
schön abfangen. und vor bösen menschlein schützen.

 
zerni
22-02-2007, 14:08 
 
Original geschrieben von wahsaga
Ziemlicher Bullshit sind beide "Lösungen" noch - wenn man sich allein die Redundanz der Daten schaut.

Was die Speicherung der Daten angeht hast du recht, aber das ist doch nur als Beispiel anzusehen.
Es wird dir vermutlich jeder zustimmen, dass man nicht tonnen an Strings in Arrays reinspeichert.

und was hast du noch daran auszusetzen wie man den Array durchläuft? bzw. wie markierst du auf welcher Seite man sich momentan befindet?

 
wahsaga
22-02-2007, 15:03 
 
Original geschrieben von zerni
Es wird dir vermutlich jeder zustimmen, dass man nicht tonnen an Strings in Arrays reinspeichert.
Sondern?

Link-Url und Link-Text.
und was hast du noch daran auszusetzen wie man den Array durchläuft?
An Version 2, wenn die Datenhaltung vernünftig umgesetzt wurde, nichts mehr.

 
zerni
22-02-2007, 16:10 
 
ok wunderbar, die Datenhaltung war ja wie gesagt nur für Testzwecke, aber hab sie in der Datei mal angepasst.

Damit es andere Leute direkt richtig machen und nicht das alte kopieren :)

 
iBumsti
24-02-2007, 01:23 
 
ok wieder was dazu gelernt, denke mit das ich den ablauf verstehe, was hier passiert, oder passieren soll (bei Variante 2)

Jetzt weis ich aber noch immer nicht, wie ich das Menü machen muss, so wie ich es haben will.

Ich kann zwar jetzt das Menü schneller anzeigen, und ohne großem Aufwand, aber noch immer nicht Teile des Menüs verschwinden lassen, wenn ein Klick betätigt wurde.

Bestes Beispiel liefert Ebay.

Wir haben hier auf der Startseite ein Menü mit Bücher, Autos u. Motorräder uvm..
Wenn ich nun im Suchen einem Begriff eingebe, z.B.: Homepage, dann kommt ein anderes Menü mit Unterkategorien, wo man die Hauptthemen nicht mehr sieht.

Sowas will.
Ich möchte, wenn man z.B.: Fotos anklickt, der Menü Punkt darüber nicht mehr angezeigt wird.

Beispiel vor Klick:

Startseite
Fotos
Gästebuch

Nun klicken wir Fotos an, dann möchte ich, dass das da steht:

Starteseite
Fotos
-->Achim
-->Steffi
-->Freunde

sonst nichts mehr.

Wenn nun einer ins GB will, dann muss er wieder Startseite klicken.

Liebe Grüße,
euer (anspruchsvoller :rolleyes: und :confused: ahnungsloser) Achim

 
zerni
24-02-2007, 02:29 
 
Javascript und CSS !

Beispiel:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<title>Js-Beispiel</title>
</head>

<body>

<style>
.personen {
display: none;
}
</style>

<script>
<!--

function decide(id) {
pers = document.getElementById(id);
dis = pers.style.display;
if(pers != null && dis == "block"){
hide();
}else{
show(pers);
}
}

function show(){
pers.style.display = "block";
clicked = pers;
}

function hide(){
pers.style.display = "none";
pers = null;
clicked = null;
}

//-->
</script>


<a href="#" onClick="decide(1)">Personengruppe 1:</a><br>

<div class="personen" id="1">
-Person 1<br>
-Person 2<br>
-Person 3<br>
</div>

<a href="#" onClick="decide(2)">Personengruppe 2:</a><br>

<div class="personen" id="2">
-Person 4<br>
-Person 5<br>
-Person 6<br>
</div>

</body>
</html>

 
Slava
24-02-2007, 04:05 
 
ich habe mir bei aufbau von verschahtelten menüs mehrere lösungen angeschaut von nested sets bis pfadmodel und habe am ende auf eigener methode geblieben.
ich benutze ganz normale model
id, name, id_parent
und benutze jede belibige möglichkeit um eine Menü zu bilden, dabei ist mir vollkomen egal wie langsam diese Methode arbeitet, da eine einfache Menü sich sehr selten ändert.
ich schreibe die function keineahnung($id) , die eine Menü bei übergebener ID aufbaut und als string ausgibt.
bei änderungen in der Menü-tabelle(dass sowieso von einem administrator gemacht wird) lasse ich diese function bei jeder ID ausführen, und speichere die ausgabe in eine datei (z.b.s "menu_".$id).
bei meiner Seite wird für ausgabe von menü überhaupt keine DB abfrage mehr benötigt, es wird einfach an Menü-platzhalter
file_get_contents("menu_".$_REQUEST['id']) reingesetzt.
Und keine Angst, bei 400 stellen Menü, bekommst du kein Timeout bei änderungen in deiner Tabelle und ausführung von deiner function auf jede ID.

 
iBumsti
24-02-2007, 18:35 
 
Nein das mit Java hab ich schon mal Probiert...

Ich will ja das dann wenn ich z.B.: Personengruppe 1 anklicke die Personengruppe 2 komplet verschwindet (nicht mehr sichtbar ist)

Zu Slava:

Meinst du also ich soll einfach schon, dass eine gute Datenstruktur habe, und meine Methode weiter verfolgen soll.

Zugegeben, sie funktioniert, ist aber langsam.

 
unset
24-02-2007, 18:54 
 
Original geschrieben von iBumsti
Nein das mit Java hab ich schon mal Probiert...
Du meinst Javascript.

Original geschrieben von iBumsti
Ich will ja das dann wenn ich z.B.: Personengruppe 1 anklicke die Personengruppe 2 komplet verschwindet (nicht mehr sichtbar ist)

Schließ die andern halt wieder (sprich: Setz dislpay auf none).

 
zerni
24-02-2007, 21:42 
 
Hier nochmal das JS:

<script>
<!--

function decide(id) {
pers = document.getElementById(id);
dis = pers.style.display;

if(pers != null && dis == "block"){
hide();
}else{
hideall();
show(pers);
}
}

function show(){
pers.style.display = "block";
}

function hide(){
pers.style.display = "none";
pers = null;
}

function hideall(){
var bool = true;
var i = 1;

while(bool){
document.getElementById(i).style.display = "none";
clicked = null;
i++;
if(document.getElementById(i) == null) bool = false;
}
}

//-->
</script>


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:16 Uhr.