Browse Source

Reset node level when recovering tree.

Closes #6590
ADmad 10 years ago
parent
commit
52853ac5b5

+ 10 - 3
src/ORM/Behavior/TreeBehavior.php

@@ -741,9 +741,10 @@ class TreeBehavior extends Behavior
      *
      * @param int $counter The Last left column value that was assigned
      * @param mixed $parentId the parent id of the level to be recovered
+     * @param int $level Node level
      * @return int The next value to use for the left column
      */
-    protected function _recoverTree($counter = 0, $parentId = null)
+    protected function _recoverTree($counter = 0, $parentId = null, $level = -1)
     {
         $config = $this->config();
         list($parent, $left, $right) = [$config['parent'], $config['left'], $config['right']];
@@ -756,17 +757,23 @@ class TreeBehavior extends Behavior
             ->hydrate(false);
 
         $leftCounter = $counter;
+        $nextLevel = $level + 1;
         foreach ($query as $row) {
             $counter++;
-            $counter = $this->_recoverTree($counter, $row[$pk[0]]);
+            $counter = $this->_recoverTree($counter, $row[$pk[0]], $nextLevel);
         }
 
         if ($parentId === null) {
             return $counter;
         }
 
+        $fields = [$left => $leftCounter, $right => $counter + 1];
+        if ($config['level']) {
+            $fields[$config['level']] = $level;
+        }
+
         $this->_table->updateAll(
-            [$left => $leftCounter, $right => $counter + 1],
+            $fields,
             [$pk[0] => $parentId]
         );
 

+ 8 - 2
tests/TestCase/ORM/Behavior/TreeBehaviorTest.php

@@ -615,7 +615,10 @@ class TreeBehaviorTest extends TestCase
     public function testRecover()
     {
         $table = $this->table;
-        $table->updateAll(['lft' => null, 'rght' => null], []);
+
+        $expectedLevels = $table->find('list', ['valueField' => 'depth'])->toArray();
+        $table->updateAll(['lft' => null, 'rght' => null, 'depth' => null], []);
+        $table->behaviors()->Tree->config('level', 'depth');
         $table->recover();
 
         $expected = [
@@ -631,7 +634,10 @@ class TreeBehaviorTest extends TestCase
             '__17:18 - 10:radios',
             '21:22 - 11:alien hardware'
         ];
-        $this->assertMpttValues($expected, $this->table);
+        $this->assertMpttValues($expected, $table);
+
+        $result = $table->find('list', ['valueField' => 'depth'])->toArray();
+        $this->assertSame($expectedLevels, $result);
     }
 
     /**