diff --git a/lib/Cake/Model/Model.php b/lib/Cake/Model/Model.php index 9ded1b59e23..7fbef1832a1 100644 --- a/lib/Cake/Model/Model.php +++ b/lib/Cake/Model/Model.php @@ -1835,7 +1835,12 @@ protected function _doSave($data = null, $options = array()) { $now = time(); foreach ($dateFields as $updateCol) { - if (in_array($updateCol, $fields) || !$this->hasField($updateCol)) { + $fieldHasValue = in_array($updateCol, $fields); + $fieldInWhitelist = ( + count($this->whitelist) === 0 || + in_array($updateCol, $this->whitelist) + ); + if (($fieldHasValue && $fieldInWhitelist) || !$this->hasField($updateCol)) { continue; } diff --git a/lib/Cake/Test/Case/Model/ModelWriteTest.php b/lib/Cake/Test/Case/Model/ModelWriteTest.php index 7974fa7cc7c..70ca570e991 100644 --- a/lib/Cake/Test/Case/Model/ModelWriteTest.php +++ b/lib/Cake/Test/Case/Model/ModelWriteTest.php @@ -387,6 +387,34 @@ public function testSaveFieldListResetsWhitelistOnFailedSave() { $this->assertEquals($whitelist, $model->whitelist); } +/** + * Test that save() with a fieldList continues to write + * updated in all cases. + * + * @return void + */ + public function testSaveUpdatedWithFieldList() { + $this->loadFixtures('Post', 'Author'); + $model = ClassRegistry::init('Post'); + $original = $model->find('first', array( + 'conditions' => array('Post.id' => 1) + )); + $data = array( + 'Post' => array( + 'id' => 1, + 'title' => 'New title', + 'updated' => '1999-01-01 00:00:00', + ) + ); + $model->save($data, array( + 'fieldList' => array('title') + )); + $new = $model->find('first', array( + 'conditions' => array('Post.id' => 1) + )); + $this->assertGreaterThan($original['Post']['updated'], $new['Post']['updated']); + } + /** * Test save() resets the whitelist after afterSave * @@ -1960,8 +1988,8 @@ public function testSaveHabtm() { 'title' => 'New Article With Tags and fieldList', 'body' => '', 'published' => 'N', - 'created' => '', - 'updated' => '' + 'created' => static::date(), + 'updated' => static::date(), ), 'Tag' => array( 0 => array(