![]() |
| | Themen-Optionen | Thema durchsuchen |
| | Nach oben #1 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.379
|
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 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 691
|
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 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.379
|
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 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 691
|
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 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.379
|
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 |
| Johannes Müller Registriert seit: 15.09.2005 Ort: Königreich Flieden
Beiträge: 552
|
@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 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 691
|
@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 |
| Christian W. Achatz Registriert seit: 05.02.2007 Ort: München
Beiträge: 150
|
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!
__________________ Viele Grüße, Dr.E. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. Think about software design before you start to write code! 2. Discuss and review it together with experts! 3. Choose good tools (-> http://adventure-php-framework.org)! 4. Write clean and reusable software only! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| | |
| | Nach oben #10 | |
| Johannes Müller Registriert seit: 15.09.2005 Ort: Königreich Flieden
Beiträge: 552
| Zitat:
sql Code:
sql Code:
__________________ Weißt Bescheid - Scheiß wie weit | |
| | |
| | Nach oben #11 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.379
|
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: 287
|
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 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.379
|
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: 287
|
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 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.379
|
@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: 287
|
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 |
| | |
| | Nach oben #18 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.379
|
Die Daten, die dann in level stehen ergeben sich ja auch nur aus denen, die schon eingetragen sind. Daher möchte ich auf diesen Umweg eigentlich verzichten. Ich werde den von mir gewünschten Lösungsweg in aller Ruhe umsetzen. Ich habe eine funktionierende Lösung auf anderem Wege gefunden, die funktioniert, aber eben noch nicht das ist, was ich gerne erreichen möchte. Ich werde hier (wenn es meine Zeit zulässt) aber noch weitermachen.
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | Thema durchsuchen |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Probleme mit Erstellung einer breadcrumb-Navigation | Ben | PHP-Programmierung | 8 | 09.10.2006 15:56 |
| "Dynamische" Menü | bacarni | JavaScript und AJAX | 7 | 23.05.2006 18:27 |
| NestedSets vs. ParentId | Jay | Datenbanken | 9 | 17.02.2006 11:25 |
| [Linktipp] Entwurfsmuster bei der dynamischen Erstellung von HTML-Formularen | Ben | Nachrichten | 0 | 03.11.2005 18:23 |
| [PHP] Erstellung und Bearbeitung von Bildern mittels PHP | WarrenFaith | Tutorials | 1 | 23.08.2005 15:30 |