Browse Source

Allow saving new records with pre specified primary key value with treebehavior.

ADmad 13 years ago
parent
commit
5de492fb25

+ 1 - 1
lib/Cake/Model/Behavior/TreeBehavior.php

@@ -178,7 +178,7 @@ class TreeBehavior extends ModelBehavior {
 		extract($this->settings[$Model->alias]);
 
 		$this->_addToWhitelist($Model, array($left, $right));
-		if (!$Model->id) {
+		if (!$Model->id || !$Model->exists()) {
 			if (array_key_exists($parent, $Model->data[$Model->alias]) && $Model->data[$Model->alias][$parent]) {
 				$parentNode = $Model->find('first', array(
 					'conditions' => array($scope, $Model->escapeField() => $Model->data[$Model->alias][$parent]),

+ 30 - 0
lib/Cake/Test/Case/Model/Behavior/TreeBehaviorNumberTest.php

@@ -370,6 +370,36 @@ class TreeBehaviorNumberTest extends CakeTestCase {
 	}
 
 /**
+ * testAddWithPreSpecifiedId method
+ *
+ * @return void
+ */
+	public function testAddWithPreSpecifiedId() {
+		extract($this->settings);
+		$this->Tree = new $modelClass();
+		$this->Tree->initialize(2, 2);
+
+		$data = $this->Tree->find('first', array(
+			'fields' => array('id'),
+			'conditions' => array($modelClass . '.name' => '1.1')
+		));
+
+		$this->Tree->create();
+		$result = $this->Tree->save(array($modelClass => array(
+			'id' => 100,
+			'name' => 'testAddMiddle',
+			$parentField => $data[$modelClass]['id'])
+		));
+		$expected = array_merge(
+			array($modelClass => array('id' => 100, 'name' => 'testAddMiddle', $parentField => '2')),
+			$result
+		);
+		$this->assertSame($expected, $result);
+
+		$this->assertTrue($this->Tree->verify());
+	}
+
+/**
  * testAddInvalid method
  *
  * @return void

+ 32 - 0
lib/Cake/Test/Case/Model/Behavior/TreeBehaviorUuidTest.php

@@ -21,6 +21,7 @@
 
 App::uses('Model', 'Model');
 App::uses('AppModel', 'Model');
+App::uses('String', 'Utility');
 require_once dirname(dirname(__FILE__)) . DS . 'models.php';
 
 /**
@@ -57,6 +58,37 @@ class TreeBehaviorUuidTest extends CakeTestCase {
 	public $fixtures = array('core.uuid_tree');
 
 /**
+ * testAddWithPreSpecifiedId method
+ *
+ * @return void
+ */
+	public function testAddWithPreSpecifiedId() {
+		extract($this->settings);
+		$this->Tree = new $modelClass();
+		$this->Tree->initialize(2, 2);
+
+		$data = $this->Tree->find('first', array(
+			'fields' => array('id'),
+			'conditions' => array($modelClass . '.name' => '1.1')
+		));
+
+		$id = String::uuid();
+		$this->Tree->create();
+		$result = $this->Tree->save(array($modelClass => array(
+			'id' => $id,
+			'name' => 'testAddMiddle',
+			$parentField => $data[$modelClass]['id'])
+		));
+		$expected = array_merge(
+			array($modelClass => array('id' => $id, 'name' => 'testAddMiddle', $parentField => '2')),
+			$result
+		);
+		$this->assertSame($expected, $result);
+
+		$this->assertTrue($this->Tree->verify());
+	}
+
+/**
  * testMovePromote method
  *
  * @return void