Guten Tag zusammen,
ich benutze Nested Sets für eine Seitenstruktur. Jedoch gibt es noch Bugs, die ich beseitigen möchte. Entweder durch das Verbieten bestimmter Anwender-Aktionen oder eine Korrektur in der Logik.
Code
	
Fehler lässt sich reproduzieren. 
1. Menschen INTO Katzen [COLOR="YellowGreen"](geht[/COLOR])
2. Menschen INTO Root ([COLOR="Red"]Fehler[/COLOR])
3. Menschen INTO Root wiederholen ([COLOR="YellowGreen"]geht[/COLOR])
Die Schritte mit Veränderungen der Werte als Grafik (Klick):

Uploaded with ImageShack.us
Ich versteh nicht was das soll. Grundsätzlich geht es ja, leider nur beim Wiederholen der Aktion.
Folgendes funktioniert:
# ABOVE
- Verschieben von Teilbäumen (Menschen ABOVE Tiere)
- Verschieben von Knoten (Frau ABOVE Mann)
# INTO
- Teilweise Verschieben von Teilbaum (Menschen INTO Katzen)
# BELOW
- Teilweise Verschieben von Teilbäumen (Menschen BELOW Katzen)
Quellen:
- Nested Sets ? Wikipedia
- Nested Sets – Verschachtelte Bäume mit MySQL - Arne Klempert
- aseantic Blog - Nested Sets - Teil 4: Komplexe SQL-Abfragen für Nested Sets
- Bäume verschieben in Nested Sets | REDUXO
Freue mich auf Antworten!
carapau
					ich benutze Nested Sets für eine Seitenstruktur. Jedoch gibt es noch Bugs, die ich beseitigen möchte. Entweder durch das Verbieten bestimmter Anwender-Aktionen oder eine Korrektur in der Logik.
Code
PHP Code:
	
	
                $src_tree  = $P->get_page($_GET['src_page_id']);  // Die Seite soll verschoben werden
        $dest_tree = $P->get_page($_GET['dest_page_id']); // Die Zielseite
        $move = $_GET['move']; // Wie soll die Seite verschoben werden? (INTO, ABOVE, BELOW)
        
        // Werte der Zielseite
        $dest_lft         = $dest_tree["lft"];         // Links 
        $dest_rgt         = $dest_tree["rgt"];         // Rechts
        $dest_children     = $dest_tree["children"];     // Anzahl der Kinder
                
        // Werte der zu verschiebenen Seite
        $src_lft         = $src_tree["lft"];         // Links
        $src_rgt         = $src_tree["rgt"];         // Rechts
        $src_children     = $src_tree["children"];     // Anzahl der Kinder
        
        // Einträge aus der Struktur entfernen / Platz machen
        $sql[] = "UPDATE pages SET lft = lft*(-1) WHERE lft BETWEEN $src_lft AND $src_rgt";
        $sql[] = "UPDATE pages SET rgt = rgt*(-1) WHERE rgt BETWEEN $src_lft AND $src_rgt";
    
        // Lücken schließen
        $sql[] = "UPDATE pages SET lft = lft-($src_rgt-$src_lft+1) WHERE lft>$src_rgt";
        $sql[] = "UPDATE pages SET rgt = rgt-($src_rgt-$src_lft+1) WHERE rgt>=$src_rgt";
        
        $exec_sql = false; // SQL nicht ausführen    
        // Wie soll verschoben werden?
        switch ($move) {
            // INTO
            case 'into':
                // Einträge ändern
                $sql[] = "UPDATE pages SET lft=lft+($src_rgt-$src_lft+1) WHERE lft>$dest_rgt";
                $sql[] = "UPDATE pages SET rgt=rgt+($src_rgt-$src_lft+1) WHERE rgt>=$dest_rgt";
                
                // Einträge an gewünschte Stelle schieben
                $sql[] = "UPDATE pages SET lft=$dest_rgt+((lft*(-1))-$src_lft) WHERE lft<0";
                $sql[] = "UPDATE pages SET rgt=$dest_rgt+((rgt*(-1))-$src_lft) WHERE rgt<0";
                
                $exec_sql = true; // SQL ausführen
                break;
                
            // ABOVE
            case 'above':
                // Einträge ändern
                $sql[] = "UPDATE pages SET rgt=rgt+($src_rgt-$src_lft+1) WHERE rgt>$dest_lft";
                $sql[] = "UPDATE pages SET lft=lft+($src_rgt-$src_lft+1) WHERE lft>=$dest_lft";
                
                // Einträge an gewünschte Stelle schieben
                $sql[] = "UPDATE pages SET lft=$dest_lft+((lft*(-1))-$src_lft) WHERE lft<0";
                $sql[] = "UPDATE pages SET rgt=$dest_lft+((rgt*(-1))-$src_lft) WHERE rgt<0";
                
                $exec_sql = true; // SQL ausführen
                break;
                
            // BELOW
            case 'below':
                // Einträge ändern
                $sql[] = "UPDATE pages SET rgt=rgt+($src_rgt-$src_lft+1) WHERE rgt>$dest_rgt";
                $sql[] = "UPDATE pages SET lft=lft+($src_rgt-$src_lft+1) WHERE lft>$dest_rgt";
                
                // Einträge an gewünschte Stelle schieben
                $sql[] = "UPDATE pages SET lft=$dest_rgt+((lft*(-1))-$src_lft+1) WHERE lft<0";
                $sql[] = "UPDATE pages SET rgt=$dest_rgt+((rgt*(-1))-$src_lft+1) WHERE rgt<0";
                
                $exec_sql = true; // SQL ausführen
                break;
        }
        
        // SQL ausführen?
        if ($exec_sql) {
            // Statements durchlaufen
            for ($i = 0; $i < count($sql); $i++) {
                // Query ausführen
                if (DB::getInstance()->query($sql[$i])) {
                    echo "Query erfolgreich ausgeführt!<br/>";
                } else {
                    echo "Fehler: ".$sql[$i]."<hr/>";
                }
            }
        } 
1. Menschen INTO Katzen [COLOR="YellowGreen"](geht[/COLOR])
2. Menschen INTO Root ([COLOR="Red"]Fehler[/COLOR])
3. Menschen INTO Root wiederholen ([COLOR="YellowGreen"]geht[/COLOR])
Die Schritte mit Veränderungen der Werte als Grafik (Klick):

Uploaded with ImageShack.us
Ich versteh nicht was das soll. Grundsätzlich geht es ja, leider nur beim Wiederholen der Aktion.
Folgendes funktioniert:
# ABOVE
- Verschieben von Teilbäumen (Menschen ABOVE Tiere)
- Verschieben von Knoten (Frau ABOVE Mann)
# INTO
- Teilweise Verschieben von Teilbaum (Menschen INTO Katzen)
# BELOW
- Teilweise Verschieben von Teilbäumen (Menschen BELOW Katzen)
Quellen:
- Nested Sets ? Wikipedia
- Nested Sets – Verschachtelte Bäume mit MySQL - Arne Klempert
- aseantic Blog - Nested Sets - Teil 4: Komplexe SQL-Abfragen für Nested Sets
- Bäume verschieben in Nested Sets | REDUXO
Freue mich auf Antworten!

carapau
 
          
 Nested Sets Bug - wer findet den Fehler?
									
									
									Nested Sets Bug - wer findet den Fehler?
								
 Moderator
 Moderator




 Was willst du denn dafür haben?
 Was willst du denn dafür haben?
							
						
Comment