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

This commit is contained in:
ADmad 2012-10-10 17:21:16 +05:30
parent 4acc687dcd
commit 5de492fb25
3 changed files with 63 additions and 1 deletions

View file

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

View file

@ -369,6 +369,36 @@ class TreeBehaviorNumberTest extends CakeTestCase {
$this->assertSame($validTree, true); $this->assertSame($validTree, true);
} }
/**
* 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 * testAddInvalid method
* *

View file

@ -21,6 +21,7 @@
App::uses('Model', 'Model'); App::uses('Model', 'Model');
App::uses('AppModel', 'Model'); App::uses('AppModel', 'Model');
App::uses('String', 'Utility');
require_once dirname(dirname(__FILE__)) . DS . 'models.php'; require_once dirname(dirname(__FILE__)) . DS . 'models.php';
/** /**
@ -56,6 +57,37 @@ class TreeBehaviorUuidTest extends CakeTestCase {
*/ */
public $fixtures = array('core.uuid_tree'); 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 * testMovePromote method
* *