PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Navigation mit PHP


-=Sirius=-
03.09.2007, 12:52:06
Hi,
mein erster Post in diesem Forum... und mit Sicherheit nicht der letzte ;)


Ich hab jetzt mit Hilfe des Buches PHP5/MySQL5 von Matthias Kannengieser eine Navigation hinbekommen.
Hier mal der Code in der ID Navi:

<div id="navi">
<?php
$kategorien = array(
'Startseite' => 'index.php',
'Bewerbung' => 'index.php?s=bewerbung',

'Impressum' => 'index.php?s=impressum'
);

$bewerbung = array(
'Lebenslauf' => 'index.php?s=lebenslauf',
'Zeugnis' => 'index.php?s=zeugnis',
'Urkunden' => 'index.php?s=urkunden',
'Praktikas' => 'index.php?s=praktika'
);


foreach ($kategorien as $key => $wert) {
echo "<a href='$wert'>$key</a><br>";

if(isset($_GET['s']))
{

if (($key == "Bewerbung") && ($_GET['s'] == "bewerbung")){
foreach ( $bewerbung as $key => $wert ) {
echo "<ul><a href='$wert'>$key</a></ul>";
}
}
}
}
?>
</div>


Hier mal der Code im ID Content:

<div id="content">
<?php
if(isset($_GET['s']) && file_exists('./'.$_GET['s'].'.php'))
{
include('./'.$_GET['s'].'.php');
}

else
{
include('./home.php');
}
?>
</div>


Jetzt hab ich ein paar Fragen dazu:

1. Wie und was muss ich ändern oder hinzufügen damit in der Navi, wenn ich auf eine Kategorie klicke (z.b. Bewerbung) und dann auf eine Unterkategorie das dann die Kategorie trotzdem offen bleibt.
Bis jetzt hat sie sich immer geschlossen.

2. Wie kann ich die Unterkategorien weiter links stehen lassen ?
Im Moment sind die nämlich bei manchen Seiten zuweit rechts ^^

3. Ich hab jetzt schon von einigen gehört, das das includen durch ?s= "unsicher" sein soll.
Wie kann ich des also machen das oben in der adressleiste diese Variante steht
domain.de/bilder/galerie1
ohne das in den ganzen Dokumenten die Div's definiert werden müssen ?



Ich hoffe ihr könnt mir helfen und lest das hier immernoch, nicht das ihr abgeschreckt wurdet von meinem langen Text ^^

Danke

mfg
Sirius

-=Sirius=-
04.09.2007, 14:00:23
weiß den keiner was dazu ?
das hier ist doch ein großes Forum mit vielen "könnern" ^^

FabianWesner
06.09.2007, 13:29:44
Hallo,

1. Du könntest eine zweite Variable anlegen mit der du durch die Unternavigation gehst. Du musst dann nur noch die zweite foreach-Schleife anpassen.
index.php?s=Bewerbung&sub=Lebenslauf

2. Bei der Unternavigation erzeugt Du sowas hier (vereinfacht):
<ul>Lebenslauf</ul>
<ul>Zeugnis</ul>
<ul>Urkunden</ul>
Das ist nicht korrekt. Schau am besten nochmal nach wie man eine Liste darstellt.

3. Ein include('./'.$_GET['s'].'.php'); ist wirklich sehr unsicher, da JEDER die Variable in der URL einfach ändern kann und so beliebige Dateien auslesen und damit auch PHP-Code ausführen kann. Da musst du mindestens noch eine Whiteliste mit zulässigen Werten für $_GET['s'] anlegen und abfragen.

Eskayp
06.09.2007, 23:47:52
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
$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.

<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
// 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 (http://de.php.net/manual/en/function.array-keys.php) und ob $s enthalten ist kann man mit in_array (http://de.php.net/manual/en/function.in-array.php) prüfen.

<?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($s, array_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

-=Sirius=-
07.09.2007, 01:34:21
Danke Eskayp,

klappt 1a ;)

Vielen Dank.
Nur mit dem CSS komm ich nicht wirklich weiter. :(
<li> lässt sich nicht formatieren. das <ul> geht ...

vllt. wisst ihr da noch was ?

.menuliste {
display: inline;
list-style-type: none;
text-indent: 5px;
}

.untermenuliste {
list-style-type: none;
}


.menuliste sind die Oberpunkte - also <ul>
und
.untermenuliste sind die Unterpunkte -a also <il>

Eskayp
07.09.2007, 09:25:50
Naja, dafür ist das das falsche Forum hier.

Ich verweise mal auf die Listenformatierung bei SelfHTML (http://de.selfhtml.org/css/eigenschaften/listen.htm) und natürlich allgemein auf die Möglichkeiten von CSS.

Für ein paar Anstöße ist vielleicht www.css-menü.de (http://www.css-menü.de/) ganz hilfreich. Übrigens auch eine interessante Alternative für Hover-Effekte ist dieses CSS-Menü (http://www.artikel-online.de/Examples/css-menue/css-menue.html), das nur ein Bild für beide Zustände (MouseOut und MouseOver) verwendet.

Ansonsten müsste man schon ganz genau wissen, wo das Problem liegt und wie es bei Dir aussehen soll, um weiter zu helfen.

Grüße
Kai

-=Sirius=-
08.09.2007, 00:30:10
Danke ;)

Werde auf den Seiten mal schauen.
Aber das Design ist eh noch nicht ganz fertig,
werde wenn ich mit dem php teil endlich mal fertig bin danach schauen ^^

übrigens ist schon wieder ein neuer thread in diesem Board von mir veröffentlicht worden :P
bin halt noch ein nicht soguter Anfänger :(

mfg
Sirius

Tumasch
15.12.2007, 02:55:08
Danke ;)
bin halt noch ein nicht soguter Anfänger :(


Nun ja, das haben Anfänger nun mal so an sich ;)

Ändert sich aber schnell ...