[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Перемещение всей ветви в NESTED SETS
p.pavluxa
Здравствуйте. Разобрался наконец-то с структурой NESTED SETS, но немогу теперь найти способ (готовый код) что бы переместить кусок ветви на другое место.

Подкажите что нибудь



Спустя 32 минуты, 56 секунд (30.08.2012 - 19:20) Placido написал(а):
Можно воспользоваться ORM Doctrine. Как-то на этом форуме я написал по этому поводу статью: Nested Sets и ORM Doctrine.

Спустя 44 минуты, 4 секунды (30.08.2012 - 20:04) p.pavluxa написал(а):
Вопрос решен. Вырезал нужную часть кода с класса DBTree.

function MoveAll($ID, $newParentId, $condition = '') {
$node_info = $this->GetNodeInfo($ID);
if (FALSE === $node_info) {
return FALSE;
}
list($leftId, $rightId, $level) = $node_info;
$node_info = $this->GetNodeInfo($newParentId);
if (FALSE === $node_info) {
return FALSE;
}
list($leftIdP, $rightIdP, $levelP) = $node_info;
if ($ID == $newParentId || $leftId == $leftIdP || ($leftIdP >= $leftId && $leftIdP <= $rightId) || ($level == $levelP+1 && $leftId > $leftIdP && $rightId < $rightIdP)) {
$this->ERRORS_MES[] = extension_loaded('gettext') ? _('cant_move_tree') : 'cant_move_tree';
return FALSE;
}
if (!empty($condition)) {
$condition = $this->_PrepareCondition($condition);
}
if ($leftIdP < $leftId && $rightIdP > $rightId && $levelP < $level - 1) {
$sql = 'UPDATE ' . $this->table . ' SET '
. $this->table_level . ' = CASE WHEN ' . $this->table_left . ' BETWEEN ' . $leftId . ' AND ' . $rightId . ' THEN ' . $this->table_level.sprintf('%+d', -($level-1)+$levelP) . ' ELSE ' . $this->table_level . ' END, '
. $this->table_right . ' = CASE WHEN ' . $this->table_right . ' BETWEEN ' . ($rightId+1) . ' AND ' . ($rightIdP-1) . ' THEN ' . $this->table_right . '-' . ($rightId-$leftId+1) . ' '
. 'WHEN ' . $this->table_left . ' BETWEEN ' . $leftId . ' AND ' . $rightId . ' THEN ' . $this->table_right . '+' . ((($rightIdP-$rightId-$level+$levelP)/2)*2+$level-$levelP-1) . ' ELSE ' . $this->table_right . ' END, '
. $this->table_left . ' = CASE WHEN ' . $this->table_left . ' BETWEEN ' . ($rightId+1) . ' AND ' . ($rightIdP-1) . ' THEN ' . $this->table_left . '-' . ($rightId-$leftId+1) . ' '
. 'WHEN ' . $this->table_left . ' BETWEEN ' . $leftId . ' AND ' . $rightId . ' THEN ' . $this->table_left . '+' . ((($rightIdP-$rightId-$level+$levelP)/2)*2+$level-$levelP-1) . ' ELSE ' . $this->table_left . ' END '
. 'WHERE ' . $this->table_left . ' BETWEEN ' . ($leftIdP+1) . ' AND ' . ($rightIdP-1);
} elseif ($leftIdP < $leftId) {
$sql = 'UPDATE ' . $this->table . ' SET '
. $this->table_level . ' = CASE WHEN ' . $this->table_left . ' BETWEEN ' . $leftId . ' AND ' . $rightId . ' THEN ' . $this->table_level.sprintf('%+d', -($level-1)+$levelP) . ' ELSE ' . $this->table_level . ' END, '
. $this->table_left . ' = CASE WHEN ' . $this->table_left . ' BETWEEN ' . $rightIdP . ' AND ' . ($leftId-1) . ' THEN ' . $this->table_left . '+' . ($rightId-$leftId+1) . ' '
. 'WHEN ' . $this->table_left . ' BETWEEN ' . $leftId . ' AND ' . $rightId . ' THEN ' . $this->table_left . '-' . ($leftId-$rightIdP) . ' ELSE ' . $this->table_left . ' END, '
. $this->table_right . ' = CASE WHEN ' . $this->table_right . ' BETWEEN ' . $rightIdP . ' AND ' . $leftId . ' THEN ' . $this->table_right . '+' . ($rightId-$leftId+1) . ' '
. 'WHEN ' . $this->table_right . ' BETWEEN ' . $leftId . ' AND ' . $rightId . ' THEN ' . $this->table_right . '-' . ($leftId-$rightIdP) . ' ELSE ' . $this->table_right . ' END '
. 'WHERE (' . $this->table_left . ' BETWEEN ' . $leftIdP . ' AND ' . $rightId. ' '
. 'OR ' . $this->table_right . ' BETWEEN ' . $leftIdP . ' AND ' . $rightId . ')';
} else {
$sql = 'UPDATE ' . $this->table . ' SET '
. $this->table_level . ' = CASE WHEN ' . $this->table_left . ' BETWEEN ' . $leftId . ' AND ' . $rightId . ' THEN ' . $this->table_level.sprintf('%+d', -($level-1)+$levelP) . ' ELSE ' . $this->table_level . ' END, '
. $this->table_left . ' = CASE WHEN ' . $this->table_left . ' BETWEEN ' . $rightId . ' AND ' . $rightIdP . ' THEN ' . $this->table_left . '-' . ($rightId-$leftId+1) . ' '
. 'WHEN ' . $this->table_left . ' BETWEEN ' . $leftId . ' AND ' . $rightId . ' THEN ' . $this->table_left . '+' . ($rightIdP-1-$rightId) . ' ELSE ' . $this->table_left . ' END, '
. $this->table_right . ' = CASE WHEN ' . $this->table_right . ' BETWEEN ' . ($rightId+1) . ' AND ' . ($rightIdP-1) . ' THEN ' . $this->table_right . '-' . ($rightId-$leftId+1) . ' '
. 'WHEN ' . $this->table_right . ' BETWEEN ' . $leftId . ' AND ' . $rightId . ' THEN ' . $this->table_right . '+' . ($rightIdP-1-$rightId) . ' ELSE ' . $this->table_right . ' END '
. 'WHERE (' . $this->table_left . ' BETWEEN ' . $leftId . ' AND ' . $rightIdP . ' '
. 'OR ' . $this->table_right . ' BETWEEN ' . $leftId . ' AND ' . $rightIdP . ')';
}
$sql .= $condition;
$this->db->StartTrans();
$res = $this->db->Execute($sql);
if (FALSE === $res) {
$this->ERRORS[] = array(2, 'SQL query error.', __FILE__ . '::' . __CLASS__ . '::' . __FUNCTION__ . '::' . __LINE__, 'SQL QUERY: ' . $sql, 'SQL ERROR: ' . $this->db->ErrorMsg());
$this->ERRORS_MES[] = extension_loaded('gettext') ? _('internal_error') : 'internal_error';
$this->db->FailTrans();
return FALSE;
}
$this->db->CompleteTrans();
return TRUE;
}

Спустя 27 минут, 15 секунд (30.08.2012 - 20:32) p.pavluxa написал(а):
Возник вопрос, а как переместить узел и всех его детей в самое начало дерева?

Спустя 22 часа, 10 минут, 17 секунд (31.08.2012 - 18:42) p.pavluxa написал(а):
Парнишки, ау...

Спустя 24 минуты, 25 секунд (31.08.2012 - 19:06) Игорь_Vasinsky написал(а):
это тема редкая, я например вообще не вкурсе что это за NESTED SETS

можешь обратиться в ЛК Winston, killer8080,Семён

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.