![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Projektleiter
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.235
|
Ich möchte ein db-gestütztes Menü realisieren.
Meine db-Struktur ist (vereinfacht) so: Code:
ID | parentID | order | text 1 | 0 | 2 | irgendwas 2 | 1 | 1 | irgendwas 3 | 0 | 1 | irgendwas 4 | 3 | 1 | irgendwas 5 | 3 | 2 | irgendwas 6 | 2 | 2 | irgendwas 7 | 1 | 2 | irgendwas 8 | 1 | 3 | irgendwas 9 | 6 | 2 | irgendwas 10 | 2 | 1 | irgendwas 11 | 6 | 1 | irgendwas 12 | 0 | 3 | irgendwas Die jeweiligen Kinder sollen aber nur gezeigt werden, wenn sie, eines ihrer Vorfahren oder eines der Nachfahren aktuell angezeigt wird. Die ID der aktuellen Seite ist natürlich bekannt. Nun könnte ich mir da was zusammenbasteln, aber ich bin mir noch niciht im klaren, wie das effektiv gestaltbar ist. Die Ausgabe soll dann so aussehen: menü.jpeg wobei die nicht betroffenen Bereiche dann natürlich auch nicht dargestellt werden sollen! Beim Aufruf der Startseite sind also nur diese drei Einträge relevant: Code:
ID | parentID | order | text 3 | 0 | 1 | irgendwas 1 | 0 | 2 | irgendwas 12 | 0 | 3 | irgendwas Code:
ID | parentID | order | text 3 | 0 | 1 | irgendwas 4 | 3 | 1 | irgendwas 5 | 3 | 2 | irgendwas 1 | 0 | 2 | irgendwas 12 | 0 | 3 | irgendwas Nun die Frage: Wie kann ich sowas am besten umsetzen?
__________________
Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
|
|
|
|
|
Nach oben #2 |
|
Erfahrener Benutzer
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 609
|
Das Ganze in einer einzigen Abfrage per SQL abzubacken wird wahrscheinlich nicht möglich sein, daran habe ich mir selber auch schonmal die Zähne ausgebissen. Wenn das jedoch gewünscht ist, sollte man vielleicht auf nested sets setzen!?
Ansonsten würde ich die Datensätze auslesen lassen (alle!), sortiert nach order. Danach erstellst du dir ein Array beim Durchlauf der abgefragten Datensätze und prüfst ganz zum Schluss, welcher Zweig dieses Arrays die ID der aktuellen Seite enthält!? Das wäre so mein Gedankengang, wenngleich ich selber weiß, dass es keine saubere Lösung ist. Alternativ wäre es aber auch möglich - sofern mehrere DB-Abfragen kein Problem darstellen - alle Datensätze abzufragen, die den selben "order" haben, wie die aktuelle Seite: Code:
SELECT `m2`.* FROM `menu` AS `m1` LEFT OUTER JOIN `menu` AS `m2` ON `m2`.`order`=`m1`.`order` WHERE `m1`.`id`='3'
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
|
|
|
|
|
Nach oben #3 |
|
Projektleiter
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.235
|
order steht nicht für die Verschiebung nach rechts, sondern für die Reihenfolge innerhalb einer subgruppe.
__________________
Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
|
|
|
|
|
Nach oben #5 |
|
Erfahrener Benutzer
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 609
|
Ich habe den Code nicht testen können, sollte aber eigentlich funktionieren:
PHP-Code:
Wenn es funktioniert, hilft es dir vielleicht!?
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
|
|
|
|
|
Nach oben #6 |
|
Projektleiter
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.235
|
Ich werde mal selbst was versuchen - und dabei deinen code im Blick behalten.
Wenn ich nicht weiterkommen sollte melde ich mich wieder - wenn ich die vermeintlich ultimative Lösung gefunden habe: dann auch...
__________________
Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
|
|
|
|
|
Nach oben #7 |
|
Erfahrener Benutzer
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 491
|
@MrNiceGuy
Das Subquery ist eigentlich ziemlich überflüssig... das geht auch mit nem einfachen join sql Code:
__________________
Weißt Bescheid - Scheiß wie weit |
|
|
|
|
|
Nach oben #8 |
|
Erfahrener Benutzer
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 609
|
@Straight: danke für die Info, den Umgang mit "USING" kannte ich bisher noch nicht. Werde ich mich aber mal reinlesen.
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
|
|
|
|
|
Nach oben #9 |
|
Entwickler
Registriert seit: 05.02.2007
Ort: München
Beiträge: 113
|
Hallo Jann,
ich hatte dazu vor einiger Zeit mal im phpfriend.de-Forum dazu gepostet. Falls es dich interessiert, findest du ein Package mit einer Beispiel-Implementierung (basiert auf Rekursion und das Ergebnis wird in einem Objektbau repräsentiert) unter http://www.adventure-php-framework.o...umstruktur.zip. Solltest du Fragen haben, her damit!
__________________
Grüße, Dr.E. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Have a look at http://www.adventure-php-framework.org! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
|
|
|
|
Nach oben #10 | |
|
Erfahrener Benutzer
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 491
|
Zitat:
sql Code:
sql Code:
__________________
Weißt Bescheid - Scheiß wie weit |
|
|
|
|
|
|
Nach oben #11 |
|
Projektleiter
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.235
|
Also - meine bisherigen Versuche waren noch nicht sehr berauschend.
Aber ich habe noch immer ausreichend Ehrgeiz dran zu bleiben. Heute allerdings werde ich damit nicht mehr weitermachen.
__________________
Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
|
|
|
|
|
Nach oben #12 |
|
Erfahrener Benutzer
Registriert seit: 30.10.2005
Beiträge: 274
|
Für Pear gibt es eine Klasse für sowas http://pear.php.net/package/DB_NestedSet
http://www.klempert.de/nested_sets/artikel/ Durch diese Nested Set Technik können solche Bäume sehr schnell ausgelesen werden, da im ResultSet ein Art Zähler vorhanden ist, der die Tiefe angibt, was man dann je nach Anzahl formatieren kann. Wenn man das erstmal raus hat mit den NestedSets, wäre es vielleicht möglich eine zeitgemäßere Klasse für sowas zu schreiben. |
|
|
|
|
|
Nach oben #13 |
|
Projektleiter
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.235
|
NestedSets wollte ich eigentlich gerne ... vermeiden.
Danke aber auf jeden Fall für den link zu dem Artikel! Der scheint richtig gut zu sein!
__________________
Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
|
|
|
|
|
Nach oben #14 |
|
Erfahrener Benutzer
Registriert seit: 30.10.2005
Beiträge: 274
|
Hier ist mal ein Schnipsel denn ich vor längerem mal gebaut habe. Da habe ich mit PEAR Nested Sets etwas gespielt.
|
|
|
|
|
|
Nach oben #15 |
|
Projektleiter
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.235
|
@ex³: magst du nicht ein kleines Tutorial dazu schreiben?
__________________
Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
|
|
|
|
|
Nach oben #16 |
|
Erfahrener Benutzer
Registriert seit: 30.10.2005
Beiträge: 274
|
Eigentlich nicht
Die Datenbankstruktur wird abstrahiert und alles in Funktionen gekapselt die sich wie Knoten und Äste verhalten und nur damit sollte man Dinge ändern, sonst wird das ganze etwas inkonsistent. Die Spalten der vorgegeben Datenbankstruktur kann man selbst ändern, müssen aber später dem Objekt mitgeteilt werden. |
|
|
|
|
|
Nach oben #17 |
|
Neuer Benutzer
Registriert seit: 08.11.2005
Beiträge: 4
|
Ich mach dir nen Vorschlag, füge einfach eine Spalte "level" hinzu, die die Einrückung bestimmt. Beim Erstellen eines Datensatzes nimmst du dann einfach das Parent-Element und addierst den Level um 1.
Dann kannste alle Datensätze nach "order" sortiert in einen Array speichern und über diesen Array das Menü rekursiv ausgeben. Die Einrückung geht dann wie gesagt mit "level". mfg Link |
|
|
|