php.de

Zurück   php.de > php.de Intern > Beitragsarchiv

Beitragsarchiv Nur gucken, nichts anfassen. Das Archiv der Beiträge vergangener Zeiten.

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 17.12.2004, 14:48  
Erfahrener Benutzer
 
Registriert seit: 01.12.2003
Beiträge: 4.113
supertramp
Standard Menü mit Unterpunkten

Diese Tutorial wurde von -->bigJay<-- geschrieben.

------------------------------------------------


In diesem Tutorial wird erklärt wie man ein Menü mit Unterpunkten darstellen kann. Als erstes werden die Hauptpunkte (HP) angezeigt, bei einem Klick auf einen HP werden die dazugehörigen Unterpunkte (UP) aufgeklappt, bei einem Klick auf einen UP werden seine Unterpunkte (UUP) aufgeklappt (also die
Unter-Unterpunkte eines Hauptpunktes). Das ganze könnte theoretisch bis ins unendliche gehen.

Die Datei nenne ich mal baum.php

Als erstes widmen wir uns dem Array besser gesagt dem Zweideminsionalem Array. In diesem Array speichern wir die ganzen HPs und UPs….
Aber was ist ein Zweideminsionales Array? Das ist ein Array, welches andere Arrays in sich beinhaltet, wird auch als Multiarray genannt.
Das Array wird folgendermaßen aufgebaut:
Code:
$felder = array ( 
0 => array ( "id" => 1, "eintrag" => "HP1", "vater" => 0, "status" => 0 ),
1 => array ( "id" => 2, "eintrag" => "HP2", "vater" => 0, "status" => 0 ),
2 => array ( "id" => 3, "eintrag" => "UP1", "vater" => 1, "status" => 0 ),
3 => array ( "id" => 4, "eintrag" => "UUP1", "vater" => 3, "status" => 0 ),
4 => array ( "id" => 5, "eintrag" => "UP2", "vater" => 1, "status" => 0 ),
5 => array ( "id" => 6, "eintrag" => "UUP1", "vater" => 8, "status" => 0 ),
6 => array ( "id" => 7, "eintrag" => "UP1", "vater" => 2, "status" => 0 ),
7 => array ( "id" => 8, "eintrag" => "UP3", "vater" => 1, "status" => 0 ),
8 => array ( "id" => 9, "eintrag" => "UUP1", "vater" => 5, "status" => 0 ),
9 => array ( "id" => 10, "eintrag" => "HP3", "vater" => 0, "status" => 0 ),
10 => array ( "id" => 11, "eintrag" => "UUP2", "vater" => 5, "status" => 0 )  
);
Jetzt haben wir das Array $felder mit weiteren Arrays drin. Die Arrays im Array bekommen einen Key in Form von Zahlen (0 – 10). In den jeweiligen Arrays werden werte gespeichert -> diese bekommen auch einen Key in Form von Wörtern/Bezeichnungen („id“, „eintrag“, „vater“, „status“). Damit das Script weiß welche UPs zu welchen HPs gehören, wird im „vater“ die id von dem Obergeordnetem HP gespeichert. Das soll heißen: wenn im UP1 der „vater“ 2 angetragen ist, wird der auf den HP mit der „id“ 2 bezogen.
Ausführliche Infos zu Array : http://www.php.net/manual/de/function.array.php

So, wie kann man es jetzt ausgeben lassen? Ich werde erklären, wie es mit einer Rekursiven Funktion (eine Funktion, die sich selber aufruft) funktioniert.
Ausführliche Infos zu Funktionen: http://www.php.net/manual/de/functions.php
Unsere Funktion wird struktur heißen. Warum Struktur? Keine Ahnung, mir ist nichts anderes eingefallen.
Die Funktion bekommt einen Wert übergeben: $ID. Auf den Inhalt dieser Variablen komme ich später.
Damit unsere Funktion mit dem Array $felder arbeiten kann, kann man es entweder wie $ID übergeben oder einfach global machen. Global bedeutet, dass $felder auch für die Funktion sichtbar ist obwohl es ihr nicht übergeben wurde. Das ganze sieht dann so aus:
Code:
function struktur($ID) { 
	global $felder;
}
In die Funktion kommt eine for schleife, die das Array durchläuft:
Code:
for ($x = 0; $x < count($felder); $x++){
}
In die for Schleife kommt eine if abfrage. In dieser wird dann der UP des bereits angezeigten HP gesucht und auch angezeigt. Ist grade ein wenig schwer zu verstehen, wird aber noch erklärt. Damit das Menü mit seinen Unterpunkten übersichtlich angezeigt wird benutze ich <ul> und <il> die man aus dem HTML kennt.. Jetzt sieht die Funktion so aus:
Code:
function struktur($ID) {
	global $felder;
		
		for ($x = 0; $x < count($felder); $x++){
			if ($felder[$x]["vater"]==$ID) {  // $x gleicht dem key des jeweiligen Arrays und vater                                                     //(logischerweise) der Bezugsid
				echo "<ul>";
				echo "[*]";
				echo $felder[$x]["eintrag"];
			  	struktur($felder[$x]["id"]); // die funktion wird rekursiv aufgerufen
			echo "";
			echo "[/list]";
			}
		}
	
}
Die Funktion wird am ende des Skriptes so aufgerufen: struktur(0);
Erklärung: Die Funktion wird aufgerufen und bekommt den wert 0 übergeben -> $ID = 0. In der for Schleife wird das Array durchgegangen. Beim ersten Durchlauf ist $x = 0. Das heißt: mit $felder[$x]["vater"] frage ich nach dem Vater im Array mit dem Key “0“. In der if Schleife wird verglichen, ob es in irgendeinem Array den Vater mit dem Wert von $ID gibt (und der war ja 0), somit wird das Array mit dem Key 0 ausgewählt. Dann werden die Öffnungs-Tags <ul> und <il> ausgegeben. Nach der Ausgabe von „eintrag“ wird die Funktion neu aufgerufen und die $ID bekommt den Wert $felder[$x]["id"], denn das ist ja so zusagen der Bezug für den nächsten anzuzeigenden „eintrag“. Wenn die Funktion keinen „eintrag“ zu $ID findet, wird die Funktion von welcher Sie aufgerufen wurde weiter verarbeitet -> dann werden nur noch die Tags[/list]und </il> zugemacht.

Und so sieht das funktionierende Zwischenergebnis aus, welches uns schon mal das richtig ausgibt:
Code:
$felder = array ( 
0 => array ( "id" => 1, "eintrag" => "HP1", "vater" => 0, "href" =>"baum.php", "status" => 0 ),
1 => array ( "id" => 2, "eintrag" => "HP2", "vater" => 0, "href" =>"baum.php", "status" => 0 ),
2 => array ( "id" => 3, "eintrag" => "UP1", "vater" => 1, "href" =>"baum.php", "status" => 0 ),
3 => array ( "id" => 4, "eintrag" => "UUP1", "vater" => 3, "href" =>"baum.php", "status" => 0 ),
4 => array ( "id" => 5, "eintrag" => "UP2", "vater" => 1, "href" =>"baum.php", "status" => 0 ),
5 => array ( "id" => 6, "eintrag" => "UUP1", "vater" => 8, "href" =>"baum.php", "status" => 0 ),
6 => array ( "id" => 7, "eintrag" => "UP1", "vater" => 2, "href" =>"baum.php", "status" => 0 ),
7 => array ( "id" => 8, "eintrag" => "UP3", "vater" => 1, "href" =>"baum.php", "status" => 0 ),
8 => array ( "id" => 9, "eintrag" => "UUP1", "vater" => 5, "href" =>"baum.php", "status" => 0 ),
9 => array ( "id" => 10, "eintrag" => "HP3", "vater" => 0, "href" =>"baum.php", "status" => 0 ),
10 => array ( "id" => 11, "eintrag" => "UUP2", "vater" => 5, "href" =>"baum.php", "status" => 0 )  
);

function struktur($ID) {
	global $felder;
		
		for ($x = 0; $x < count($felder); $x++){
			if ($felder[$x]["vater"]==$ID) { 
				echo "<ul>";
				echo "[*]";
				echo $felder[$x]["eintrag"]; 
			  	struktur($felder[$x]["id"]);	
			echo "";
			echo "[/list]";
			}
		}
	
}
struktur(0);
Jetzt kann man die aber noch immer nicht zu und aufklappen. Ok dazu müssen wir den Status verändern. Der Status 0 eines Punktes sagt, dass die auf ihn bezogenen UPs zugeklappt sind und 1, dass sie aufgeklappt sind. Ich starte eine Session, in dieser Session wird das Array $felder registriert und ist somit immer in diesem Dokument vorhanden. Wieso das? Wenn man die Seite startet wird das Array generiert und damit wird gearbeitet und das passiert bei jedem Aktualisieren oder neu Aufrufen der Seite. Und damit werde ich nichts ändern können. Deswegen sage ich, er soll das Array einmal bilden, bei neu Aufrufen der Seite aber, mit einem anderem (was eigentlich dasselbe ist) arbeiten. Die Session wird folgendermaßen gestartet und das Array $felder regestriert:
Code:
<?php
session_start(); 
session_register("felder");
?>
Das muss im Dokument als erstes stehen. Das heißt wirklich ganz oben, noch vor HTML oder etwas anderem.
Ausführliche Infos zu session_start : http://www.php.net/manual/de/function.session-start.php
Ausführliche Infos zu session_register : http://www.php.net/manual/de/functio...n-register.php

Im Script mache ich folgendes:
Code:
if (!isset($_GET["x"])){ // das ist die Variable die in der URL übergeben wird
$felder = array ( 
0 => array ( "id" => 1, "eintrag" => "HP1", "vater" => 0, "href" =>"baum.php", "status" => 0 ),
1 => array ( "id" => 2, "eintrag" => "HP2", "vater" => 0, "href" =>"baum.php", "status" => 0 ),
2 => array ( "id" => 3, "eintrag" => "UP1", "vater" => 1, "href" =>"baum.php", "status" => 0 ),
3 => array ( "id" => 4, "eintrag" => "UUP1", "vater" => 3, "href" =>"baum.php", "status" => 0 ),
4 => array ( "id" => 5, "eintrag" => "UP2", "vater" => 1, "href" =>"baum.php", "status" => 0 ),
5 => array ( "id" => 6, "eintrag" => "UUP1", "vater" => 8, "href" =>"baum.php", "status" => 0 ),
6 => array ( "id" => 7, "eintrag" => "UP1", "vater" => 2, "href" =>"baum.php", "status" => 0 ),
7 => array ( "id" => 8, "eintrag" => "UP3", "vater" => 1, "href" =>"baum.php", "status" => 0 ),
8 => array ( "id" => 9, "eintrag" => "UUP1", "vater" => 5, "href" =>"baum.php", "status" => 0 ),
9 => array ( "id" => 10, "eintrag" => "HP3", "vater" => 0, "href" =>"baum.php", "status" => 0 ),
10 => array ( "id" => 11, "eintrag" => "UUP2", "vater" => 5, "href" =>"baum.php", "status" => 0 )  
);
} else {
$felder = $_SESSION["felder"];
if ($felder[$_GET["x"]]["status"] == 0) {
		$felder[$_GET["x"]]["status"] = 1;
		} else {
		$felder[$_GET["x"]]["status"] = 0;
		}
}
Erklärung: (!isset($_GET["x"])) <- hier wird geprüft ob schon mal auf einen Linkt geklickt wurde, falls nicht bildet er das Array. Zu else: Falls schon gecklickt wurde, füllt er $felder mit dem von Session mitgeführtem Array $felder und ändert den Status. Wenn der status auf 0 ist, wird er auf 1 gesetzt und sonst auf 0.

Der eintrag der angezeigt wird, wird jetzt zum Link, welcher auf dasselbe Dokument verweist und die Variable $x übergibt:
echo "".$felder[$x]["eintrag"]."";

Dann muss man jetzt in der Funktion folgendes noch einfügen:
Code:
if ($felder[$x]["status"] == 1) {
struktur($felder[$x]["id"]);	
}
Jetzt wird die Funktion nur aufgerufen wenn der status auf 1 ist (was ja dem Script sagt, dass die UPs ausgeklappt sind).

So und das fertige Script sieht dann so aus:
Code:
<?php
session_start(); 
session_register("felder");
?>
<html>
<head>
<title>Klappmenü</title>
</head>

<body>
<?php

if (!isset($_GET["x"])){
$felder = array ( 
0 => array ( "id" => 1, "eintrag" => "HP1", "vater" => 0, "status" => 0 ),
1 => array ( "id" => 2, "eintrag" => "HP2", "vater" => 0, "status" => 0 ),
2 => array ( "id" => 3, "eintrag" => "UP1", "vater" => 1, "status" => 0 ),
3 => array ( "id" => 4, "eintrag" => "UUP1", "vater" => 3, "status" => 0 ),
4 => array ( "id" => 5, "eintrag" => "UP2", "vater" => 1, "status" => 0 ),
5 => array ( "id" => 6, "eintrag" => "UUP1", "vater" => 8, "status" => 0 ),
6 => array ( "id" => 7, "eintrag" => "UP1", "vater" => 2, "status" => 0 ),
7 => array ( "id" => 8, "eintrag" => "UP3", "vater" => 1, "status" => 0 ),
8 => array ( "id" => 9, "eintrag" => "UUP1", "vater" => 5, "status" => 0 ),
9 => array ( "id" => 10, "eintrag" => "HP3", "vater" => 0, "status" => 0 ),
10 => array ( "id" => 11, "eintrag" => "UUP2", "vater" => 5, "status" => 0 )  
);
} else {
$felder = $_SESSION["felder"];
if ($felder[$_GET["x"]]["status"] == 0) {
		$felder[$_GET["x"]]["status"] = 1;
		} else {
		$felder[$_GET["x"]]["status"] = 0;
		}
}

function struktur($ID) {
	global $felder;
		
		for ($x = 0; $x < count($felder); $x++){
			if ($felder[$x]["vater"]==$ID) { 
				echo "<ul>";
				echo "[*]";
				echo "".$felder[$x]["eintrag"].""; 
				if ($felder[$x]["status"] == 1) {
			  	struktur($felder[$x]["id"]);	
				}
			echo "";
			echo "[/list]";
			}
		}
	
}
struktur(0);
?>
</body>
</html>
__________________
Aufstrebend, kompetent und werbefrei.
www.developers-guide.net
supertramp ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.03.2005, 13:29  
Erfahrener Benutzer
 
Registriert seit: 08.03.2005
Beiträge: 123
nullplan
Standard

@supertramp

Hi... hab dein Script benutz und es natürlich für meine zwecke eitwas geändert...(nur andere arrays)

aber wenn ich mich nicht irre öffnen sich auch bei deinem Script in der originalform die UUPs nicht...

kannst mir weiterhelfen...

mein nick sagt alles...!

cu
__________________
Was auch immer, du mich auch!
nullplan ist offline  
Alt 09.03.2005, 21:06  
Erfahrener Benutzer
 
Registriert seit: 01.12.2003
Beiträge: 4.113
supertramp
Standard

das mag ja sein, was du so sagst....

aber ich würde mal sagen:
Zitat:
Zitat von supertramp
Diese Tutorial wurde von -->bigJay<-- geschrieben.
daher: immer an den Autoren wenden, oder in PHP-Anfänger einen entspr. thread starten...
supertramp ist offline  
Alt 18.10.2005, 20:33  
Gast
 
Beiträge: n/a
Standard Link

Mensch was ein toller beitrag..ist echt nicht einfach was zu finden ohne java in sachen menüs.
nun meine frage...........wie kann ich meine links einbinden?

Ich habe dieses beispiel in meine seite eingebaut und es im linke frame eingebunden. da dieses menü sich aber selber aufrufen muss kann ich also z.b. nicht zur main.php nen link setzten oder?

ich hätte keine idee ausser das man überprüft ob die niedrigste hyrachi aktiv ist

dank
 
Alt 18.10.2005, 21:56  
Gast
 
Beiträge: n/a
Standard

Eine Möglichkeit wäre:
Du fügst im Array noch einen Punkt "href" hinzu. Dann kannst du die Unterpunkte die zu einer bestimmten
Seite führen verlinken (sprich "href" => "/unterseite.php"). Und die HPs die ja nur über die UPs verfügen und zu keiner bestimmten Seite führen sollen, werden nicht verlinkt (einfach "href" => "false" oder so). In der for Schleife wird dann geprüft ob ein Link vorhanden ist, wenn ja wirds verlinkt und ansonsten eben ganz normal wie bisher

gruß
bigJay
 
Alt 18.10.2005, 22:19  
Gast
 
Beiträge: n/a
Standard

genau das hab ich auch gemacht klappt auch aber nun, wie ich gerade gepostet hatte hab ich das problem das wenn ich nun mit nem untermenü ein frame mit na seite lade und dann wieder auf nem übergeordneten menü klick ich nicht weis wie ich das frame auf dem das navigationsframe verweist wieder reloade-> wie kann ich neben einenm hyperlink noch ein anderes frame ansteuern?
 
Alt 18.10.2005, 22:29  
Gast
 
Beiträge: n/a
Standard

Ich bin mir nicht 100% sicher und wenns jemand besser weiß, soll mich korrigieren, aber da wirst du wohl oder übel nicht um JavaScript herum kommen.

Aber wie wärs damit: Immer wenn du auf einen HP klickst, prüfst du ob ein anderer HP schon offen ist und wenn das der Fall ist, schliesst du diesen einfach. Damit hast du immer nur einen HP offen und musst nicht immer durch einen extra klick den HP zumachen.

gruß
bigJay
 
Alt 18.10.2005, 22:40  
Gast
 
Beiträge: n/a
Standard

aber ich meine was soll das menü wenn man nichts mit aufrufen kann
 
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Navigation mit Unterpunkten themonk HTML, Usability und Barrierefreiheit 3 13.12.2007 21:20
Frage zu einem Tutorial: Menü mit Unterpunkten PHP Tipps 2005 1 14.01.2005 15:49

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php menü mit unterpunkten, html menu unterpunkte, php menü baum, php menübaum, php menu unterpunkte, menübaum php, php baum menu, php baumstruktur menu, menü mit unterpunkten html, menü unterpunkte html, php menü mit unterpunkten und links, php menübaum array, http://www.php.de/beitragsarchiv/14368-menue-mit-unterpunkten.html, menü mit unterpunkten php, php liste unterpunkte, baumstruktur php datenbank aufklappen, php baumstruktur für menü darstellen, php menu array, html unterpunkt menü, html php menü mit unterpunkten

Alle Zeitangaben in WEZ +1. Es ist jetzt 11:25 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.