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
Kommentar