diff --git a/cake/libs/model/model.php b/cake/libs/model/model.php index 82e66860e..eb25472fd 100644 --- a/cake/libs/model/model.php +++ b/cake/libs/model/model.php @@ -379,6 +379,15 @@ class Model extends Overloadable { if ($this->actsAs !== null || $this->actsAs !== false) { $merge[] = 'actsAs'; } + $parentClass = get_parent_class($this); + if (strtolower($parentClass) !== 'appmodel') { + $parentVars = get_class_vars($parentClass); + foreach ($merge as $var) { + if (isset($parentVars[$var]) && !empty($parentVars[$var])) { + $appVars[$var] = Set::merge($appVars[$var], $parentVars[$var]); + } + } + } foreach ($merge as $var) { if (isset($appVars[$var]) && !empty($appVars[$var]) && is_array($this->{$var})) { diff --git a/cake/tests/cases/libs/model/model.test.php b/cake/tests/cases/libs/model/model.test.php index 3f2210f1a..bade867f4 100644 --- a/cake/tests/cases/libs/model/model.test.php +++ b/cake/tests/cases/libs/model/model.test.php @@ -100,11 +100,14 @@ class ModelTest extends CakeTestCase { $result = $TestModel->hasAndBelongsToMany; $expected = array('AssociationTest2' => array( - 'unique' => false, 'joinTable' => 'join_as_join_bs', 'foreignKey' => false, - 'className' => 'AssociationTest2', 'with' => 'JoinAsJoinB', - 'associationForeignKey' => 'join_b_id', 'conditions' => '', 'fields' => '', - 'order' => '', 'limit' => '', 'offset' => '', 'finderQuery' => '', - 'deleteQuery' => '', 'insertQuery' => '' + 'unique' => false, + 'joinTable' => 'join_as_join_bs', + 'foreignKey' => false, + 'className' => 'AssociationTest2', + 'with' => 'JoinAsJoinB', + 'associationForeignKey' => 'join_b_id', + 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', + 'finderQuery' => '', 'deleteQuery' => '', 'insertQuery' => '' )); $this->assertEqual($result, $expected); @@ -171,6 +174,25 @@ class ModelTest extends CakeTestCase { $this->assertEqual($TestModel->Tag->name, 'Tag'); $this->assertEqual($TestFakeModel->Tag->name, 'Tag'); } +/** + * test Model::__construct + * + * ensure that $actsAS and $_findMethods are merged. + * + * @return void + **/ + function testConstruct() { + $this->loadFixtures('Post', 'Comment'); + + $TestModel =& ClassRegistry::init('MergeVarPluginPost'); + $this->assertEqual($TestModel->actsAs, array('Containable', 'Tree')); + $this->assertTrue(isset($TestModel->Behaviors->Containable)); + $this->assertTrue(isset($TestModel->Behaviors->Tree)); + + $TestModel =& ClassRegistry::init('MergeVarPluginComment'); + $this->assertEqual($TestModel->actsAs, array('Containable', 'Containable' => array('some_settings'))); + $this->assertTrue(isset($TestModel->Behaviors->Containable)); + } /** * testColumnTypeFetching method * diff --git a/cake/tests/cases/libs/model/models.php b/cake/tests/cases/libs/model/models.php index 386faba88..d090d8134 100644 --- a/cake/tests/cases/libs/model/models.php +++ b/cake/tests/cases/libs/model/models.php @@ -497,6 +497,69 @@ class ModifiedComment extends CakeTestModel { return $results; } } + +/** + * MergeVarPluginAppModel class + * + * @package cake.tests + * @subpackage cake.tests.cases.libs.model + */ +class MergeVarPluginAppModel extends AppModel { +/** + * actsAs parameter + * + * @var array + */ + var $actsAs = array( + 'Containable' + ); +} +/** + * MergeVarPluginPost class + * + * @package cake.tests + * @subpackage cake.tests.cases.libs.model + */ +class MergeVarPluginPost extends MergeVarPluginAppModel { +/** + * actsAs parameter + * + * @var array + */ + var $actsAs = array( + 'Tree' + ); +/** + * useTable parameter + * + * @var string + */ + var $useTable = 'posts'; +} +/** + * MergeVarPluginComment class + * + * @package cake.tests + * @subpackage cake.tests.cases.libs.model + */ +class MergeVarPluginComment extends MergeVarPluginAppModel { +/** + * actsAs parameter + * + * @var array + */ + var $actsAs = array( + 'Containable' => array('some_settings') + ); +/** + * useTable parameter + * + * @var string + */ + var $useTable = 'comments'; +} + + /** * Attachment class *