From 60d7bbaa104f5c67d521efb26200c70be0dd8ff5 Mon Sep 17 00:00:00 2001 From: mark_story Date: Sat, 5 Sep 2015 22:00:43 -0400 Subject: [PATCH] Always update updated/modified columns when a fieldList is used. When a fieldList is used, and updated is not in the fieldList, the column should continue to be updated even if the column has a value from the user. Because the field is not in the fieldList, we must assume that the intent is for the field to update automatically, as it would have if the updated column was not present in the save data. Refs #7076 --- lib/Cake/Model/Model.php | 7 +++++- lib/Cake/Test/Case/Model/ModelWriteTest.php | 28 +++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/lib/Cake/Model/Model.php b/lib/Cake/Model/Model.php index 9ded1b59e..7fbef1832 100644 --- a/lib/Cake/Model/Model.php +++ b/lib/Cake/Model/Model.php @@ -1835,7 +1835,12 @@ class Model extends Object implements CakeEventListener { $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 7974fa7cc..1b26c8a25 100644 --- a/lib/Cake/Test/Case/Model/ModelWriteTest.php +++ b/lib/Cake/Test/Case/Model/ModelWriteTest.php @@ -387,6 +387,30 @@ class ModelWriteTest extends BaseModelTest { $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', ['conditions' => ['Post.id' => 1]]); + $data = array( + 'Post' => array( + 'id' => 1, + 'title' => 'New title', + 'updated' => '1999-01-01 00:00:00', + ) + ); + $model->save($data, array( + 'fieldList' => ['title'] + )); + $new = $model->find('first', ['conditions' => ['Post.id' => 1]]); + $this->assertGreaterThan($original['Post']['updated'], $new['Post']['updated']); + } + /** * Test save() resets the whitelist after afterSave * @@ -1960,8 +1984,8 @@ class ModelWriteTest extends BaseModelTest { 'title' => 'New Article With Tags and fieldList', 'body' => '', 'published' => 'N', - 'created' => '', - 'updated' => '' + 'created' => static::date(), + 'updated' => static::date(), ), 'Tag' => array( 0 => array(