Darstellungsproblem 'Nested Sets'

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

  • Darstellungsproblem 'Nested Sets'

    Hallo,

    ich habe es nun endlich geschafft SqlBäume mit Nested Sets zu erstellen. Doch jetzt scheitert es an der Darstellung mehrer Rootpostings.
    Hier ist die DB-Struktur:
    Code:
    +---------+---------+---------+------+-----+
    | node_id | root_id | payload | lft  | rgt |
    +---------+---------+---------+------+-----+
    |       1 |   1     |    A    |  1   |   6 |
    |       2 |   1     |    B    |  2   |   5 |
    |       3 |   1     |    C    |  3   |   4 |
    |       4 |   2     |    D    |  1   |   4 |
    |       5 |   2     |    E    |  2   |   3 |
    +---------+---------+---------+------+-----+
    Die Funktion, welche die Threads darstellen soll, sieht so aus:
    PHP-Code:
    $roots selRoots();

       foreach( 
    $roots as $root_id ) {

          
    $sql  "SELECT node1.payload, COUNT(*) AS level, node1.node_id AS id ";
          
    $sql .= "FROM node AS node1, node AS node2 ";
          
    $sql .= "WHERE node1.root_id = ".$root_id." AND node2.root_id = ".$root_id." AND node1.lft BETWEEN node2.lft AND node2.rgt ";
          
    $sql .= "GROUP BY node1.lft";

          
    $res mysql_query$sql );
          
    $i 0;

          
    // Anzeige der Threads
          ///////////////////////
          
    while( $row mysql_fetch_array$res ) ) {
             if( 
    $row'level' ] > $i ) {
                echo 
    "<ul>";
             }

             echo 
    "<li><a href=\"test2.php?id=".$row'id' ]."\">".$row'payload' ]."</a></li>";

             if( 
    $row'level' ] < $i ) {
                echo 
    "</ul>";
             }

             
    $i $row'level' ];
          }
       } 
    Als Ergebnis erhalte ich dies:
    Code:
    A
    |- B
      |- C
          |- D
              |-E
    Aber sollte nicht eigentlich dies dabei heraus kommen?
    Code:
    A
    |- B
    |  |- C
    D
    |-E
    Wo liegt mein Fehler und wie kann ich den bereinigen?

    Gruß,
    Arndtinho
    Zuletzt geändert von Arndtinho; 17.11.2004, 17:53.

  • #2
    gib mal die levels mit aus.

    Liegt ganz offensichtlich daran.

    Kommentar


    • #3
      Habe mir die Levels, wie Du gesagt hast, ausgeben lassen.
      Die sind (nach meiner Theorie) richtig:

      A und D -> Level: 1
      B und E -> Level: 2
      C -> Level: 3

      Gruß,
      Arndtinho
      Zuletzt geändert von Arndtinho; 17.11.2004, 17:54.

      Kommentar


      • #4
        Poste mal die ausgabe und zwar von allen oben genannten knoten.

        A und D -> Level: 1
        B und D -> Level: 2
        C -> Level: 3
        Das das hier schwachsinn ist, fällt dir selber auf?

        Kommentar


        • #5
          Habs gerade geändert, sorry. war ein Schreibfehler.

          Kommentar


          • #6
            guck dir mal den HTML-Quelltext an.

            Kommentar


            • #7
              Komischerweise funktioniert dies:

              PHP-Code:
              for ($i 0$i <= $row'level' ]; $i++) {
                 echo 
              "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
              }
              echo 
              $row'payload' ]."<br>"
              So erhalte ich das gewünschte Ergebnis. Das verwirrt mich.

              Gruß,
              Arndtinho

              Kommentar


              • #8
                mich nicht! Guck dir mal die auffäligkeiten im HTML-Quelltext an. Bzw. geh deinen ersten code mal im Kopf durch.

                Kommentar


                • #9
                  Mhh..ok.
                  Wenn ich nciht weiterkomme melde ich mcih ncohmal.

                  Gruß,
                  Arndtinho

                  Kommentar


                  • #10
                    Hallo,

                    habe mir die Sache in Ruhe nochmal angeschaut und festgestellt, das die offenen <ul> nicht geschlossen werden.
                    Dann habe ich mir mal die Levels und die dazugehörigen $i ausgegeben. Dies wiederum führte dazu, dass die Bedingung
                    PHP-Code:
                    if( $row'level' ] < $i 
                    nie erfüllt wird. Also brauche ich eine Differenz, oder?

                    Gruß,
                    Arndtinho

                    Kommentar


                    • #11
                      vielleicht meinst du mit der differenz schon das richtige. dann frage ich mich allerdings, warum du noch hier fragst.

                      wenn ich jetzt grade richtig liege, sollte es reichen, wenn das neue level kleiner ist, als das vorherige, die differenz (X) zu nemen, und dann X mal den </ul> tag machen.

                      Kommentar


                      • #12
                        So ungefähr dachte ich mir das auch.
                        PHP-Code:
                        $row['level'] - $i 
                        Aber bis jetzt habe ich es nicht geschaft dies umzusetzen.

                        Kommentar


                        • #13
                          str_repeat

                          Kommentar


                          • #14
                            ich bin einfach zu b..d.

                            Kommentar


                            • #15
                              Tut mir leid, bin kein Doktor.

                              Kommentar

                              Lädt...
                              X