шагов, чтобы переместить поддерево вокруг в категории дереве с использованием вложенного набора модели (с левым и правым колонком) являются: 1. преобразования ЯПТА и RGT столбцов в своих негативных аналогах для данной категории вы (это будет «удалить» поддерево из дерева, пока) 2. Если вы перемещаете поддерево вверх (или «слева» во вложенном представлении множества), переместите все категории между новый родительский элемент поддерева и его старый левый (или правый, во втором случае) предел вправо, в противном случае (при перемещении поддерева вниз) вправо. Это включает настройку левого и правого столбцов этих категорий на их значения плюс (или минус во втором случае) расстояние между левым и правым столбцом поддерева (или подлежащей перемещению категорией) 3. после этого все вам нужно сделать, чтобы вернуть левый и правый столбцы в положительные значения и в то же время вычесть (или добавить во втором случае) разницу между ее левым пределом и новым родительским левым столбцом (или между родительским левым и правый предел во втором случае)
все это кажется очень сложными, выраженным в одном случае, так что я сломал его до двух случаев:
$step = 1+ $this->_categoriesTable->rgt
- $this->_categoriesTable->lft;
$lft = $this->_categoriesTable->lft;
$rgt = $this->_categoriesTable->rgt;
$id = $this->_categoriesTable->id;
$distance = $lft - $parentLeft - 1;
$query = '
UPDATE %s SET lft=-lft, rgt=-rgt
WHERE lft>=%d AND lft<=%d;
UPDATE %s SET lft=lft+%d WHERE lft>%d AND lft<%d;
UPDATE %s SET rgt=rgt+%d WHERE rgt>%d AND rgt<%d;
UPDATE %s SET lft=-lft-%d, rgt=-rgt-%d WHERE lft<=-%d
AND lft>=-%d;
UPDATE %s SET parent_id=%d, title=%s, description=%s,
metadescription=%s WHERE id=%s';
$query = sprintf($query,
$this->_db->nameQuote('#__categories'),
$lft, $rgt,
$this->_db->nameQuote('#__categories'), $step,
$parentLeft, $lft,
$this->_db->nameQuote('#__categories'), $step,
$parentLeft, $lft,
$this->_db->nameQuote('#__categories'), $distance,
$distance, $lft, $rgt,
$this->_db->nameQuote('#__categories'),
$data['parent_id'],
$this->_db->Quote($this->_categoriesTable->title),
$this->_db->Quote($this->_categoriesTable->description),
$this->_db->Quote(
$this->_categoriesTable->metadescription),
$this->_db->Quote($id));
// and for the moving to the "right" case
$step = 1+ $this->_categoriesTable->rgt
- $this->_categoriesTable->lft;
$distance = $parentLeft - $this->_categoriesTable->rgt;
// Memorize this because we bind and we need the old values
$lft = $this->_categoriesTable->lft;
$rgt = $this->_categoriesTable->rgt;
$id = $this->_categoriesTable->id;
$query = sprintf($query,
$this->_db->nameQuote('#__categories'),
$lft, $rgt,
$this->_db->nameQuote('#__categories'), $step,
$rgt, $parentLeft,
$this->_db->nameQuote('#__categories'), $step,
$rgt, $parentLeft,
$this->_db->nameQuote('#__categories'), $distance,
$distance, $lft, $rgt,
$this->_db->nameQuote('#__categories'),
$data['parent_id'],
$this->_db->Quote($this->_categoriesTable->title),
$this->_db->Quote($this->_categoriesTable->description),
$this->_db->Quote(
$this->_categoriesTable->metadescription),
$this->_db->Quote($id));
Вау, '= гг G' ... – mattalxndr