mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Fr 26.04.2024 13:50 Benutzername: Passwort: Auto-Login

Thema: [PHP/MySQL] Dynamisches Menü mit Nested Sets vom 22.01.2008


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> [PHP/MySQL] Dynamisches Menü mit Nested Sets
Seite: 1, 2  Weiter
Autor Nachricht
LioGetz
Threadersteller

Dabei seit: 24.03.2003
Ort: Aachen
Alter: 44
Geschlecht: Männlich
Verfasst Di 22.01.2008 14:54
Titel

[PHP/MySQL] Dynamisches Menü mit Nested Sets

Antworten mit Zitat Zum Seitenanfang

Hi @ all...

ich hab mal wieder ein kleines Verständnis-Problem *zwinker*.

Folgendes: Für ein etwas größeres Projekt habe ich mich mal wieder schlau gemacht, welche Art und Weise "die Beste" ist, um ein (hierachisches) Menü dynamisch aus ner DB zu laden.
Dabei bin ich auf "Nested Sets" gestoßen und mir diverse Artikel dazu durchgelesen. Ein häufig herangezogener Beitrag ist dieser hier.

Die "Logik" hinter den Nested Sets und die Vorteile habe ich soweit verstanden, nur irgendwie haperts bei mir noch bei der praktischen Verwendung.
Ich hab ne DB aufgezogen (wie im Artikel: mit ID, Name, lft, rgt) und mit Testeinträgen gefüllt (bis zu drei "Menüebenen" tief). Soweit - so gut...und jetzt?

Wie bekomme ich das Menü so ausgelesen, wie es in dem Beispiel aussieht??

Zitat:

Säugetiere
- Primaten
o Halbaffen
o Affen
- Nagetiere

// Sorry, die Einrückung klappt hier im Bsp. irgendwie nicht *Schnief*


Mit diesem Statement bekomme ich zwar die Daten nach Namen & Level sortiert, aber den Schritt zur Ausgabe (Listenartige Struktur <li><ul> etc...) verstehe ich nicht

Code:

  SELECT n.name,
         COUNT(*)-1 AS level
    FROM tree AS n,
         tree AS p
   WHERE n.lft BETWEEN p.lft AND p.rgt
GROUP BY n.lft
ORDER BY n.lft;


Kann mir da jemand helfen? Wie soll die Schleife aussehen die ich brauche um so ein Menü zu erstellen?

Danke im voraus

CU
Lio Grins
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
pixelpapst303

Dabei seit: 06.07.2006
Ort: hamburg
Alter: 50
Geschlecht: Männlich
Verfasst Di 22.01.2008 15:23
Titel

Antworten mit Zitat Zum Seitenanfang

wenn du den klempert schon hier nennst, dann downloade doch auch seine demoklasse mit treemanager... *zwinker*

http://www.klempert.de/nested_sets/

(download oben rechts)
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Anzeige
Anzeige
LioGetz
Threadersteller

Dabei seit: 24.03.2003
Ort: Aachen
Alter: 44
Geschlecht: Männlich
Verfasst Di 22.01.2008 15:38
Titel

Antworten mit Zitat Zum Seitenanfang

jaja...danke, aber das hatte ich schon gemacht...das hat mir aber nicht wirklich weiter geholfen...
Zum einen ist das für mich zu überdimensioniert, zum zweiten verstehe ich es dann immer noch nicht...
"Der Clou" ist einfach "irgend n Schleifenkonstrukt" um die Daten (anhand der Ebenen) hierarchisch auszugeben...nur wie das geht - das ist ja mein Problem *zwinker*

Sowas wie im Folgenden soll die Ausgabe sein, aber ich versteh einfach nicht wie man das Anhand der Nested Set Daten in der DB ausgeben bekommt...ich dachte das Modell wäre so dafür geeignet um hierarchische Strukturen auszugeben ??

Code:


<ul>
 <li>Hauptpunkt 1
  <ul>
   <li>Unterpunkt 1
    <ul>
     <li>Unter-Unterpunkt 1</li>
    </ul>
   </li>
   </ul>
  </li>
  <li>Hauptpunkt 2</li>
</ul>

...usw usw *zwinker*

Thx, CU
Lio Grins
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
pixelpapst303

Dabei seit: 06.07.2006
Ort: hamburg
Alter: 50
Geschlecht: Männlich
Verfasst Di 22.01.2008 15:58
Titel

Antworten mit Zitat Zum Seitenanfang

im grunde brauchst du in deinem beispiel doch "nur" jeweils das level vom aktuellen eintrag mit dem vom nächten eintrag vergleichen. in php sind da next() und current() - (arrayfunktionen) deine freunde.

wenn next dann größer current is, geht n ul auf. wenns kleiner is, ein ul zu. wenns gleich is passiert nüschts...
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Di 22.01.2008 16:00
Titel

Antworten mit Zitat Zum Seitenanfang

Da du über ne Relation gehst und das ganze natürlich keine verschachtelten Objektrepräsentation zurück gibt, wirst du dein Menu eigends über das Einrückungslevel generieren müssen (Diese Beispiel-Monsterqueries dazu liefern das als Attribut an einem Tupel mit).

Aber mal ehrlich. Warum willste das überhaupt machen? Nimm dir doch ein array bzw. ein Objekt und speichere einfach die serialisierte Repräsentation in der Datenbank (bspw. als Xml, Json, per serialize()) => Fertisch. Nested sets sind zwar eine eine geniale "es geht doch mit rdbs"-Lösung, aber irgendwie trotzdem recht teuer. Nicht so sehr bei der Ausgabe, aber die Einfügeoperationen sind schon ne Wissenschaft für sich, die Transaktionen nicht sehr performant.
  View user's profile Private Nachricht senden
LioGetz
Threadersteller

Dabei seit: 24.03.2003
Ort: Aachen
Alter: 44
Geschlecht: Männlich
Verfasst Di 22.01.2008 17:23
Titel

Antworten mit Zitat Zum Seitenanfang

hmmm...und ich habe fast vermutet das sowas kommt^^

Seltsam, dabei hab ich an mehreren Quellen gelesen das man Nested Sets für Hierarchische Strukturen nutzt (Menüs, Breadcrumber Navigation etc.)...wenn es dafür "so sinnvoll" sein soll, dann frag ich mich warum es so kompliziert ist, bzw. im Netz (oder an den oben zitierten Quellen) keine Bsp. dafür gibt ??!!
Der Standard um ne Navi aus ner DB zu holen ist ja "ID | Name | Parent" Angaben zu machen...um Anhand des Parents zu wissen auf welcher Ebene der jeweilige Menüpunkt steht.

Aber ich dachte einfach "mach mal was professionelleres" was ja angeblich auch besser sein soll...also ihr meint dass das Quatsch ist für n normes Menü??

CU
Lio Grins
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Di 22.01.2008 18:20
Titel

Antworten mit Zitat Zum Seitenanfang

Ich hab auch dauernd "nested sets" gebrüllt, wenn mal nach Bäumen gesucht wurde. Aber im Endeffekt hat mir die Erfahrung gezeigt, dass das schon eher Exotenstatus genießt. Es kann sicher im Grenzfall von Vorteil sein, aber mir will jetzt keiner Einfallen.

Große Bäume: Lädst du in den Primärspeicher
Kleine Bäume: Gehen sowieso sehr performant über ein hierarchisches Format im Dateisystem oder alternativ als serialisiertes, hierarchisches Format in einem Datenbankfeld.

Einfügeoperationen sind bei großen Bäumen in Strukturformaten und bei Nested Sets - wage ich einfach mal zu behaupten - gleich teuer, bzw. ich glaube sogar, dass die NestedSets-Transaktionen teurer sind.

Andererseits ist bspw. mysql mit der myisam-engine schon höllisch schnell, sogar n-prozesse * m Queries in einer Transaktion sind eigentlich kein Problem. Wenn du die Herausforderung nicht scheust, sind NestedSets somit also schon eine Alternative.

In anderen StorageEngines würde ich es nicht empfehlen, und andere DBS haben eh proprietäre Funktionen, um bspw. Parent-Child-Beziehungen auszuwählen oder xml-bäume zu durchwandern.
  View user's profile Private Nachricht senden
LioGetz
Threadersteller

Dabei seit: 24.03.2003
Ort: Aachen
Alter: 44
Geschlecht: Männlich
Verfasst Di 22.01.2008 19:00
Titel

Antworten mit Zitat Zum Seitenanfang

ich versteh zwar nur die hälfte von dem was du mir sagen willst - aber ich schließe mal daraus:

OK, ist schwachsinn für ein "einfaches Menü" wenn es auch anders einfacher zu realisieren ist Grins

Danke für die Infos

CU
Lio Grins
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
 
Ähnliche Themen HTML-Liste mit Nested Sets erstellen
[Wordpress] Dynamisches Menü?!
Dynamisches Flash-Menü auf HTML
Dynamisches Menü für alle Browser
suche bestimmtes script für dynamisches Menü auf Website
CD mit diversen PDF's --> "dynamisches" Flash-Menü
Neues Thema eröffnen   Neue Antwort erstellen Seite: 1, 2  Weiter
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.