From 2a9e6771c3c483e8b67b90ba08345e115250a4b4 Mon Sep 17 00:00:00 2001 From: Ceeram Date: Thu, 19 Jan 2012 23:20:15 +0100 Subject: [PATCH] allow other parent field, set in find options or TreeHebavior, for threaded find. Fixes #1769 --- lib/Cake/Model/Behavior/TreeBehavior.php | 14 +++ lib/Cake/Model/Model.php | 6 +- .../Model/Behavior/TreeBehaviorNumberTest.php | 85 ++++++++++++++- lib/Cake/Test/Case/Model/ModelReadTest.php | 100 ++++++++++++++++++ 4 files changed, 203 insertions(+), 2 deletions(-) diff --git a/lib/Cake/Model/Behavior/TreeBehavior.php b/lib/Cake/Model/Behavior/TreeBehavior.php index be6825fb6b0..04897686f06 100644 --- a/lib/Cake/Model/Behavior/TreeBehavior.php +++ b/lib/Cake/Model/Behavior/TreeBehavior.php @@ -92,6 +92,20 @@ public function afterSave($Model, $created) { } } +/** + * Runs before a find() operation + * + * @param Model $Model Model using the behavior + * @param array $query Query parameters as set by cake + * @return array + */ + public function beforeFind($Model, $query) { + if ($Model->findQueryType == 'threaded' && !isset($query['parent'])) { + $query['parent'] = $this->settings[$Model->alias]['parent']; + } + return $query; + } + /** * Before delete method. Called before all deletes * diff --git a/lib/Cake/Model/Model.php b/lib/Cake/Model/Model.php index d285774de45..2e5b791358c 100644 --- a/lib/Cake/Model/Model.php +++ b/lib/Cake/Model/Model.php @@ -2813,9 +2813,13 @@ protected function _findThreaded($state, $query, $results = array()) { if ($state === 'before') { return $query; } elseif ($state === 'after') { + $parent = 'parent_id'; + if (isset($query['parent'])) { + $parent = $query['parent']; + } return Set::nest($results, array( 'idPath' => '/' . $this->alias . '/' . $this->primaryKey, - 'parentPath' => '/' . $this->alias . '/parent_id' + 'parentPath' => '/' . $this->alias . '/' . $parent )); } } diff --git a/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorNumberTest.php b/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorNumberTest.php index c536a98c027..b3ed7516e7c 100644 --- a/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorNumberTest.php +++ b/lib/Cake/Test/Case/Model/Behavior/TreeBehaviorNumberTest.php @@ -54,7 +54,7 @@ class TreeBehaviorNumberTest extends CakeTestCase { * * @var array */ - public $fixtures = array('core.number_tree'); + public $fixtures = array('core.number_tree', 'core.person'); /** * testInitialize method @@ -1284,4 +1284,87 @@ public function testArraySyntax() { $this->assertSame($this->Tree->getParentNode(2), $this->Tree->getParentNode(array('id' => 2))); $this->assertSame($this->Tree->getPath(4), $this->Tree->getPath(array('id' => 4))); } + +/** + * testFindThreaded method + * + * @return void + */ + public function testFindThreaded() { + $this->loadFixtures('Person'); + $Model = new Person(); + $Model->recursive = -1; + $Model->Behaviors->attach('Tree', array('parent' => 'mother_id')); + + $result = $Model->find('threaded'); + $expected = array( + array( + 'Person' => array( + 'id' => '4', + 'name' => 'mother - grand mother', + 'mother_id' => '0', + 'father_id' => '0' + ), + 'children' => array( + array( + 'Person' => array( + 'id' => '2', + 'name' => 'mother', + 'mother_id' => '4', + 'father_id' => '5' + ), + 'children' => array( + array( + 'Person' => array( + 'id' => '1', + 'name' => 'person', + 'mother_id' => '2', + 'father_id' => '3' + ), + 'children' => array() + ) + ) + ) + ) + ), + array( + 'Person' => array( + 'id' => '5', + 'name' => 'mother - grand father', + 'mother_id' => '0', + 'father_id' => '0' + ), + 'children' => array() + ), + array( + 'Person' => array( + 'id' => '6', + 'name' => 'father - grand mother', + 'mother_id' => '0', + 'father_id' => '0' + ), + 'children' => array( + array( + 'Person' => array( + 'id' => '3', + 'name' => 'father', + 'mother_id' => '6', + 'father_id' => '7' + ), + 'children' => array() + ) + ) + ), + array( + 'Person' => array( + 'id' => '7', + 'name' => 'father - grand father', + 'mother_id' => '0', + 'father_id' => '0' + ), + 'children' => array() + ) + ); + $this->assertEquals($expected, $result); + } } diff --git a/lib/Cake/Test/Case/Model/ModelReadTest.php b/lib/Cake/Test/Case/Model/ModelReadTest.php index 8660714da9e..e1ee8c0c308 100644 --- a/lib/Cake/Test/Case/Model/ModelReadTest.php +++ b/lib/Cake/Test/Case/Model/ModelReadTest.php @@ -2990,6 +2990,106 @@ public function testSelfAssociationAfterFind() { $this->assertEquals($afterFindData, $noAfterFindData); } +/** + * testFindThreadedNoParent method + * + * @return void + */ + public function testFindThreadedNoParent() { + $this->loadFixtures('Apple', 'Sample'); + $Apple = new Apple(); + $result = $Apple->find('threaded'); + $result = Set::extract($result, '{n}.children'); + $expected = array(array(), array(), array(), array(), array(), array(), array()); + $this->assertEquals($expected, $result); + } + +/** + * testFindThreaded method + * + * @return void + */ + public function testFindThreaded() { + $this->loadFixtures('Person'); + $Model = new Person(); + $Model->recursive = -1; + $result = $Model->find('threaded'); + $result = Set::extract($result, '{n}.children'); + $expected = array(array(), array(), array(), array(), array(), array(), array()); + $this->assertEquals($expected, $result); + + $result = $Model->find('threaded', array('parent' => 'mother_id')); + $expected = array( + array( + 'Person' => array( + 'id' => '4', + 'name' => 'mother - grand mother', + 'mother_id' => '0', + 'father_id' => '0' + ), + 'children' => array( + array( + 'Person' => array( + 'id' => '2', + 'name' => 'mother', + 'mother_id' => '4', + 'father_id' => '5' + ), + 'children' => array( + array( + 'Person' => array( + 'id' => '1', + 'name' => 'person', + 'mother_id' => '2', + 'father_id' => '3' + ), + 'children' => array() + ) + ) + ) + ) + ), + array( + 'Person' => array( + 'id' => '5', + 'name' => 'mother - grand father', + 'mother_id' => '0', + 'father_id' => '0' + ), + 'children' => array() + ), + array( + 'Person' => array( + 'id' => '6', + 'name' => 'father - grand mother', + 'mother_id' => '0', + 'father_id' => '0' + ), + 'children' => array( + array( + 'Person' => array( + 'id' => '3', + 'name' => 'father', + 'mother_id' => '6', + 'father_id' => '7' + ), + 'children' => array() + ) + ) + ), + array( + 'Person' => array( + 'id' => '7', + 'name' => 'father - grand father', + 'mother_id' => '0', + 'father_id' => '0' + ), + 'children' => array() + ) + ); + $this->assertEquals($expected, $result); + } + /** * testFindAllThreaded method *