Baumstruktur aus SQL - Frage zu 'nested sets'

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Baumstruktur aus SQL - Frage zu 'nested sets'

    Hallo,

    um Daten aus der Datenbank in einer Baumstruktur darzustellen, verwende ich nun das nested sets - Modell aus dem Tutorial.

    Über eine Ausgabe mit switch($level) { ... case 1: ... case 2: ...
    erhalte ich nachfolgende Struktur:

    A - Das Wurzelposting
    ......B - Reply auf "A"
    ...........C - Reply auf "B"
    ...........D - 2. Reply auf "B"

    B - Das zweite Wurzelposting
    ......B - ...............
    ......C - ..............


    Hat jemand eine Idee, wie man es erreicht daß man durch Klick auf den Mutterknoten, die Kindsknoten ausblenden kann (so wie bei Windows XP mit den Ordnern, mit den Minus und Plus-Zeichen neben den gelben Ordnern).

    Also, hier z.B. durch Klick auf B-Reply auf "A" werden C und D ausgeblendet.

  • #2
    da du im ph frast, prüfe auf

    level == 1
    und left muss größer left_desparent und kleiner right_parent sein

    Kommentar


    • #3
      danke für deine Antwort,

      werde daraus leider überhaupt nicht schlau

      was meinst du mit: "da du im ph frast.."

      und was sind diese Variablen: "left_desparent und kleiner right_parent"

      Kommentar


      • #4
        1. war wohl ein schreibfehler: "da du im ph frast.." => "da du im php-forum fragst" lautet die übersetzung und will meinen, du suchst eine php-basierte lösung

        2. schau dir die tabelle der datenbank an ... du hast links/left + rechts/right und irgendwo dazwischen gibt es eine beziehung ...
        Kissolino.com

        Kommentar


        • #5
          @wurzel: thanks 4 translation. muss am getränk liegen...

          Kommentar


          • #6
            ich habe in der Tabelle 2 Felder, rgt und lft, welche die Beziehungen der nodes untereinander definieren, d.h. eltern- und Kindbeziehungen.
            Ich sehe da nur folgende Ansatzpunkte für das Ausblenden der Kindelemente eines Elementes:
            - über php, also serverseitig, nur über reload der Seite
            - clientseitig nur über ein javascript o.ä.

            Nur frage ich mich, wie dies denn mit den Elementen einer XML-Datei ist. Da kann man Kindelemente aus - und einblenden ohne reload und ohne Javascript. So einen Weg suche ich eigentlich hier, mit dieser sql-basierten Baumausgabe.

            Kommentar


            • #7
              - über php, also serverseitig, nur über reload der Seite
              - clientseitig nur über ein javascript o.ä.
              ähm, logisch oder?

              Nur frage ich mich, wie dies denn mit den Elementen einer XML-Datei ist. Da kann man Kindelemente aus - und einblenden ohne reload und ohne Javascript. So einen Weg suche ich eigentlich hier, mit dieser sql-basierten Baumausgabe.
              ja? Bsp? Es spricht ja auch nichts dagegen auf Basis deiner SQL-Daten eine XML-Datei zu erstellen.

              Kommentar


              • #8
                wollte gerade die xml-Datei anhängen, aber geht leider nicht. Hier ein Ausschnitt:

                - <anbieter>
                - <immobilie>
                + <objektkategorie>
                <nutzungsart WOHNEN="true" GEWERBE="true" ANLAGE="true" />
                <vermarktungsart KAUF="true" />
                - <objektart>
                <haus haustyp="SCHLOSS" />


                da wo + ist, kann man durch Klick darauf das Element 'öffnen' und sich die Kindselemente anschauen.
                Ich habe auch schon daran gedacht, eine Xml-Datei für die Baumstruktur zu verwenden, jedoch weiß ich nicht, ob ich da mit dem Layout genügend flexibel bin, sollte nämlich als eine Art Navigation, wie im Windows - Explorer ausschauen.

                Kommentar


                • #9
                  kannst gerne mal an tobiaz@php-resource.de schicken...

                  nested sets ist für die Darstellung eines kompletten baum sicher ideal. also dafür liebe ich es. wenn man aber nur teile darstellen will, ists nicht mehr ganz so schön.

                  ich überlege ob ich einen snippet habe, der nur einen ausgeklappten zweig anzeigt. wenn ich mich aber recht erinnere, basiert auch dieser code darauf, dass der ganze baum angezeigt wird.
                  (war ne erweiterung eines scriptes, das ohnehin den kompletten baum anzeigt und nur zusätzlich eine xtra-navi hat.)
                  Für solche Sachen ist das Model eben nicht wirklich geeignet

                  Kommentar


                  • #10
                    wie wo ? *fg*
                    ganz versteh ich euere aufregung nicht ..
                    ist so ziemlich alles möglich
                    (allerdings aufwändig - von der sql seite her)

                    Code:
                    mysql> select * from content;
                    +-----+-----+-----------+
                    | lft | rgt | link      |
                    +-----+-----+-----------+
                    |   1 |   2 | news      |
                    |   3 |  16 | produkte  |
                    |   4 |   5 | chat      |
                    |   6 |   9 | community |
                    |   7 |   8 | module    |
                    |  10 |  15 | bot       |
                    |  11 |  12 | larissa   |
                    |  13 |  14 | sms bot   |
                    |  17 |  20 | über      |
                    |  18 |  19 | coragon   |
                    |  21 |  22 | kontakt   |
                    |  23 |  24 | impressum |
                    +-----+-----+-----------+
                    12 rows in set (0.00 sec)
                    wenn man alles will:
                    Code:
                    mysql> SELECT content.link, (
                        ->   SELECT IFNULL(concat('/', group_concat(LCASE(link.link) SEPARATOR '/')), '/')
                        ->     FROM content AS link
                        ->     LEFT JOIN content AS child ON (link.lft < child.lft AND link.rgt > child.rgt)
                        ->     WHERE child.link = content.link ) AS parent, (
                        ->   SELECT IFNULL(concat('/', group_concat(LCASE(link.link) SEPARATOR '/')), '/')
                        ->     FROM content AS link
                        ->     LEFT JOIN content AS child ON (link.lft <= child.lft AND link.rgt >=child.rgt)
                        ->     WHERE child.link = content.link ) AS path, (
                        ->   SELECT count(*)
                        ->     FROM content AS c, content AS c2
                        ->     WHERE c.link = content.link AND c.lft BETWEEN c2.lft AND c2.rgt
                        ->     GROUP BY c.lft) AS level
                        ->   FROM content;
                    +-----------+---------------------+----------------------------+-------+
                    | link      | parent              | path                       | level |
                    +-----------+---------------------+----------------------------+-------+
                    | news      | /                   | /news                      |     1 |
                    | produkte  | /                   | /produkte                  |     1 |
                    | chat      | /produkte           | /produkte/chat             |     2 |
                    | community | /produkte           | /produkte/community        |     2 |
                    | module    | /produkte/community | /produkte/community/module |     3 |
                    | bot       | /produkte           | /produkte/bot              |     2 |
                    | larissa   | /produkte/bot       | /produkte/bot/larissa      |     3 |
                    | sms bot   | /produkte/bot       | /produkte/bot/sms bot      |     3 |
                    | über      | /                   | /über                      |     1 |
                    | coragon   | /über               | /über/coragon              |     2 |
                    | Kontakt   | /                   | /kontakt                   |     1 |
                    | impressum | /                   | /impressum                 |     1 |
                    +-----------+---------------------+----------------------------+-------+
                    12 rows in set (0.13 sec)
                    hat man sich dann zu den produkten vorgehangelt,
                    so wird folgende abfrage sinnvoll sein:

                    Code:
                    mysql> SELECT content.link as link, (
                        ->   SELECT IFNULL(concat('/', group_concat(LCASE(link.link) SEPARATOR '/')), '/')
                        ->     FROM content AS link
                        ->     LEFT JOIN content AS child ON (link.lft < child.lft AND link.rgt > child.rgt)
                        ->     WHERE child.link = content.link ) AS parent, (
                        ->   SELECT IFNULL(concat('/', group_concat(LCASE(link.link) SEPARATOR '/')), '/')
                        ->     FROM content AS link
                        ->     LEFT JOIN content AS child ON (link.lft <= child.lft AND link.rgt >=child.rgt)
                        ->     WHERE child.link = content.link ) AS path, (
                        ->   SELECT count(*)
                        ->     FROM content AS c, content AS c2
                        ->     WHERE c.link = content.link AND c.lft BETWEEN c2.lft AND c2.rgt
                        ->     GROUP BY c.lft) AS level
                        ->   FROM content
                        ->   WHERE (
                        ->     SELECT IFNULL(concat('/', group_concat(LCASE(link.link) SEPARATOR '/')), '/')
                        ->       FROM content AS link
                        ->       LEFT JOIN content AS child ON (link.lft < child.lft AND link.rgt >child.rgt)
                        ->       WHERE child.link = content.link ) IN ('/', '/produkte');
                    +-----------+-----------+---------------------+-------+
                    | link      | parent    | path                | level |
                    +-----------+-----------+---------------------+-------+
                    | news      | /         | /news               |     1 |
                    | produkte  | /         | /produkte           |     1 |
                    | chat      | /produkte | /produkte/chat      |     2 |
                    | community | /produkte | /produkte/community |     2 |
                    | bot       | /produkte | /produkte/bot       |     2 |
                    | über      | /         | /über               |     1 |
                    | kontakt   | /         | /kontakt            |     1 |
                    | impressum | /         | /impressum          |     1 |
                    +-----------+-----------+---------------------+-------+
                    8 rows in set (0.22 sec)
                    [/CODE]

                    man kann sich natürlich spielen, wenn man erst mal soweit ist
                    .. und ja, hab meine zeit dafür gebraucht - bin aber beinahe stolz drauf

                    ps: wahrscheinlich wärs geschickt sich obiges in ein view zu legen und dann von diesem die auswahl zu treffen - mysql unterstützt dies aber, wie wir alle wissen, leider nicht
                    Zuletzt geändert von Coragon Rivito; 20.06.2004, 12:41.
                    mfg,
                    [color=#0080c0]Coragon[/color]

                    Kommentar


                    • #11
                      wie wär's hiermit: http://www.php-resource.de/forum/sho...ghlight=nested

                      Kommentar

                      Lädt...
                      X