1
0
mirror of synced 2025-01-18 22:41:43 +03:00

Make Doctrine_Node_NestedSet::delete() work correctly with multiple roots.

This commit is contained in:
romanb 2007-05-08 19:35:31 +00:00
parent 86fe74d58e
commit 4b5731baf5

View File

@ -21,13 +21,14 @@
/** /**
* Doctrine_Node_NestedSet * Doctrine_Node_NestedSet
* *
* @package Doctrine * @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @category Object Relational Mapping * @category Object Relational Mapping
* @link www.phpdoctrine.com * @link www.phpdoctrine.com
* @since 1.0 * @since 1.0
* @version $Revision$ * @version $Revision$
* @author Joe Simms <joe.simms@websites4.com> * @author Joe Simms <joe.simms@websites4.com>
* @author Roman Borschel <roman@code-factory.org>
*/ */
class Doctrine_Node_NestedSet extends Doctrine_Node implements Doctrine_Node_Interface class Doctrine_Node_NestedSet extends Doctrine_Node implements Doctrine_Node_Interface
{ {
@ -544,7 +545,7 @@ class Doctrine_Node_NestedSet extends Doctrine_Node implements Doctrine_Node_Int
* *
* @todo Exception handling/wrapping * @todo Exception handling/wrapping
*/ */
public function makeRoot() public function makeRoot($newRootId)
{ {
// TODO: throw exception instead? // TODO: throw exception instead?
if ($this->getLeftValue() == 1 || !$this->record->getTable()->getTree()->getAttribute('hasManyRoots')) { if ($this->getLeftValue() == 1 || !$this->record->getTable()->getTree()->getAttribute('hasManyRoots')) {
@ -567,11 +568,11 @@ class Doctrine_Node_NestedSet extends Doctrine_Node implements Doctrine_Node_Int
// Set new lft/rgt/root values for root node // Set new lft/rgt/root values for root node
$this->setLeftValue(1); $this->setLeftValue(1);
$this->setRightValue($oldRgt - $oldLft + 1); $this->setRightValue($oldRgt - $oldLft + 1);
$this->setRootValue($this->record->id); $this->setRootValue($newRootId);
// Update descendants lft/rgt/root values // Update descendants lft/rgt/root values
$diff = 1 - $oldLft; $diff = 1 - $oldLft;
$newRoot = $this->record->id; $newRoot = $newRootId;
$componentName = $this->record->getTable()->getComponentName(); $componentName = $this->record->getTable()->getComponentName();
$rootColName = $this->record->getTable()->getTree()->getAttribute('rootColumnName'); $rootColName = $this->record->getTable()->getTree()->getAttribute('rootColumnName');
$q = $this->record->getTable()->createQuery(); $q = $this->record->getTable()->createQuery();
@ -671,14 +672,14 @@ class Doctrine_Node_NestedSet extends Doctrine_Node implements Doctrine_Node_Int
public function delete() public function delete()
{ {
// TODO: add the setting whether or not to delete descendants or relocate children // TODO: add the setting whether or not to delete descendants or relocate children
$oldRoot = $this->getRootValue();
$q = $this->record->getTable()->createQuery(); $q = $this->record->getTable()->createQuery();
$componentName = $this->record->getTable()->getComponentName(); $componentName = $this->record->getTable()->getComponentName();
$q = $q->where($componentName. '.lft >= ? AND ' . $componentName . '.rgt <= ?', array($this->getLeftValue(), $this->getRightValue())); $q = $q->where($componentName. '.lft >= ? AND ' . $componentName . '.rgt <= ?', array($this->getLeftValue(), $this->getRightValue()));
$q = $this->record->getTable()->getTree()->returnQueryWithRootId($q, $this->getRootValue()); $q = $this->record->getTable()->getTree()->returnQueryWithRootId($q, $oldRoot);
$coll = $q->execute(); $coll = $q->execute();
@ -686,7 +687,7 @@ class Doctrine_Node_NestedSet extends Doctrine_Node implements Doctrine_Node_Int
$first = $this->getRightValue() + 1; $first = $this->getRightValue() + 1;
$delta = $this->getLeftValue() - $this->getRightValue() - 1; $delta = $this->getLeftValue() - $this->getRightValue() - 1;
$this->shiftRLValues($first, $delta); $this->shiftRLValues($first, $delta, $oldRoot);
return true; return true;
} }