Sprawa powróciła paręnaście dni temu w związku z pewnym projektem, do którego musiałem właśnie zaprojektować drzewo z możliwością przesuwania. Tak narodziły się dwa poniższe kody. Najpierw przesuwanie elementu w górę w obrębie tego samego rodzica:
<?php function moveUp($currId) { global $sql; $sql -> query('LOCK TABLES data d1 READ, data d2 READ, data WRITE'); $nextId = $sql -> get('SELECT d2.id FROM data d1, data d2 WHERE d1.parent_id = d2.parent_id AND d2.right = (d1.left - 1) AND d1.id=\''.$currId.'\''); if($nextId > 0) { $currDifference = 0; $currSubnodes = selectNodesId($currId, $currDifference); $nextDifference = 0; $nextSubnodes = selectNodesId($nextId, $nextDifference); $sql -> query('UPDATE data SET `left` = (`left` + '.$currDifference.'), `right` = (`right` + '.$currDifference.') WHERE id IN(\''.implode('\', \'', $nextSubnodes).'\')'); $sql -> query('UPDATE data SET `left` = (`left` - '.$nextDifference.'), `right` = (`right` - '.$nextDifference.') WHERE id IN(\''.implode('\', \'', $currSubnodes).'\')'); } $sql -> query('UNLOCK TABLES'); } // end moveUp(); ?>
A oto przesuwanie w dół:
<?php function moveDown($currId) { global $sql; $sql -> query('LOCK TABLES data d1 READ, data d2 READ, data WRITE'); $nextId = $sql -> get('SELECT d2.id FROM data d1, data d2 WHERE d1.parent_id = d2.parent_id AND d2.left = (d1.right + 1) AND d1.id=\''.$currId.'\''); if($nextId > 0) { $currDifference = 0; $currSubnodes = selectNodesId($currId, $currDifference); $nextDifference = 0; $nextSubnodes = selectNodesId($nextId, $nextDifference); $sql -> query('UPDATE data SET `left` = `left` - '.$currDifference.'), `right` = (`right` - '.$currDifference.') WHERE id IN(\''.implode('\', \'', $nextSubnodes).'\')'); $sql -> query('UPDATE data SET `left` = (`left` + '.$nextDifference.'), `right` = (`right` + '.$nextDifference.') WHERE id IN(\''.implode('\', \'', $currSubnodes).'\')'); } $sql -> query('UNLOCK TABLES'); } // end moveUp(); ?>
Funkcja selectNodesId powinna zwracać ID wszystkich węzłów zawartych wewnątrz węzła o podanym ID, wraz z nim samym. Do drugiego parametru, za pomocą referencji, wpisywana jest różnica między parametrami right i left powiększona o 1: RIGHT - LEFT + 1. Funkcje posiadają blokadę przed wysunięciem się poza drzewo - jest to realizowane przez zawartą w nich instrukcję if, która sprawdza, czy na pewno znaleziono ID sąsiedniego węzła.






Napisał kkkkkkk w środę, 25 kwietnia 2007 o 12:43
Witam,
czytalem Twoj poprzedni art i wlasnie jego dotyczy moje pytanie i problem.
chcialbym wynik zapytania zapisac do tablicy w postaci :
node1
submnodes
subnode_1
subnode_2
subnode_21
subnode_22
..................subnode_n
.
.
.
.
.
nodem
submnodes...
chyli drzewo zapisane do tablicy.
Jakis pomysl ?
Dzieki za odpowiedz.