Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > Menü-Erstellung mit parentID
Antwort
 
Themen-Optionen
Alt 08.03.2008, 20:37   Nach oben    #1
Projektleiter
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.225
Standard Menü-Erstellung mit parentID

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
Alle Einträge mit parentID == 0 stehen ganz links. Die Kinder der jeweiligen ID ergeben sich durch die Definition, wer der jeweilige parant ist und sollen dann eingerück sein.

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
Wenn die Seite mit der ID == 3 aufgerufen wird, dann:
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
Ich denke, dass klar ist, was ich meine, oder?


Nun die Frage: Wie kann ich sowas am besten umsetzen?
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.03.2008, 20:45   Nach oben    #2
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
Standard

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'
(getestet habe ich das nicht, sollte aber eigentlich klappen!?) und dann rekursiv so oft diesen Vorgang wiederholt, bis "parentID" = 0 ist. Du müsstest dann halt bloß bei jedem neuen Durchlauf die ID in die aktuelle parentID ändern.
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.03.2008, 21:34   Nach oben    #3
Projektleiter
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.225
Standard

order steht nicht für die Verschiebung nach rechts, sondern für die Reihenfolge innerhalb einer subgruppe.
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.03.2008, 21:44   Nach oben    #4
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Nein, das geht nicht ohne Rekursion. Musst also so lange auslesen, bis parent_id == 0. Das Netzt ist sicher voll von Anleitungen dazu.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.03.2008, 22:10   Nach oben    #5
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
Standard

Ich habe den Code nicht testen können, sollte aber eigentlich funktionieren:

PHP-Code:
<?php
function functionGetMenu ($integerId)
{
  
$arrayResult = array ();
  
  
$resourceQuery mysql_query ('SELECT * FROM `menu` WHERE `parentId`=(SELECT `parentId` FROM `menu` WHERE `uid`=\''.$integerId.'\') ORDER BY `order` ASC');
  
  while (
$arrayQuery mysql_fetch_assoc ($resourceQuery))
  {
    
$arrayResult[$arrayQuery['uid']] = array ('arrayData' => $arrayQuery);

    
$integerParentId $arrayQuery['parentId'];
  }
  
  if (
$integerParentId 0)
  {
    
$arrayParent functionGetMenu ($integerParentId);
    
    
$arrayParent[$integerParentId]['arrayChilds'] = $arrayResult;
    
    
$arrayResult $arrayParent;
  }
  
  return 
$arrayResult;
}
?>
Ich hoffe, dass das passt. Die Unterabfrage stellt natürlich gewisse Voraussetzungen an den MySQL-Server und ist sicher nicht die schönste Lösung, brachte mir aber genau das Ergebnis, das ich brauchte.

Wenn es funktioniert, hilft es dir vielleicht!?
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.03.2008, 22:15   Nach oben    #6
Projektleiter
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.225
Standard

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:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.03.2008, 22:32   Nach oben    #7
Erfahrener Benutzer
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 503
Standard

@MrNiceGuy
Das Subquery ist eigentlich ziemlich überflüssig...
das geht auch mit nem einfachen join
sql Code:
  1. SELECT `sibling`.*
  2. FROM `menu` AS `sibling`
  3. JOIN `menu` AS `start` USING `parentID`
  4. WHERE `start`.`ID`= ?
  5. ORDER BY `sibling`.`order`
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist gerade online  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.03.2008, 09:50   Nach oben    #8
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
Standard

@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
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.03.2008, 11:01   Nach oben    #9
Entwickler
 
Benutzerbild von dr.e.
 
Registriert seit: 05.02.2007
Ort: München
Beiträge: 115
Standard

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!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.03.2008, 14:01   Nach oben    #10
Erfahrener Benutzer
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 503
Standard

Zitat:
Zitat von MrNiceGuy Beitrag anzeigen
@Straight: danke für die Info, den Umgang mit "USING" kannte ich bisher noch nicht. Werde ich mich aber mal reinlesen.
sql Code:
  1. USING `parentID`
is das gleiche wie
sql Code:
  1. ON `start`.`parentID` = `sibling`.`parentID`
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist gerade online  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.03.2008, 14:05   Nach oben    #11
Projektleiter
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.225
Standard

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:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2008, 16:45   Nach oben    #12
Erfahrener Benutzer
 
Registriert seit: 30.10.2005
Beiträge: 274
Standard

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.
ex³ ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2008, 19:45   Nach oben    #13
Projektleiter
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.225
Standard

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:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2008, 20:54   Nach oben    #14
Erfahrener Benutzer
 
Registriert seit: 30.10.2005
Beiträge: 274
Standard

Hier ist mal ein Schnipsel denn ich vor längerem mal gebaut habe. Da habe ich mit PEAR Nested Sets etwas gespielt. Leider ist kein DB Export drin, aber das DB Schema scheint in einem Der Unterordner zu liegen. Es hat ziemlich lange gedauert bis ich das zum Laufen gebracht habe. Der Code der Klasse finde ich persönlich überhaupt nicht nachvollziehbar, weil ich vor hat so eine Klasse mit php5 zu bauen, habe es aber doch abgebrochen. Ich glaube hier im Board fliegt sogar noch ein alter Thread dazu rum.
Angehängte Dateien
Dateityp: zip PearNestedSet.zip (63,4 KB, 5x aufgerufen)
ex³ ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.03.2008, 11:03   Nach oben    #15
Projektleiter
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.225
Standard

@ex³: magst du nicht ein kleines Tutorial dazu schreiben?
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.03.2008, 19:01   Nach oben    #16
Erfahrener Benutzer
 
Registriert seit: 30.10.2005
Beiträge: 274
Standard

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.
ex³ ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.03.2008, 18:20   Nach oben    #17
Neuer Benutzer
 
Registriert seit: 08.11.2005
Beiträge: 4
Standard

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
Link ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.03.2008, 09:13   Nach oben    #18
Projektleiter
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.225
Standard

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:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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 Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag