From 60eb228ddf9277f64e38d2914bd74e6f2d2f8ee2 Mon Sep 17 00:00:00 2001 From: Jose Lorenzo Rodriguez Date: Sat, 25 Aug 2012 13:29:16 +0200 Subject: [PATCH] Fixing issues with validation rules not being reset after calling create() on the model or when calling validates() multiple times This had interesting side effects when deep saving --- lib/Cake/Model/Validator/CakeValidationRule.php | 11 +++++++++++ lib/Cake/Model/Validator/CakeValidationSet.php | 12 ++++++++++++ lib/Cake/Test/Case/Model/ModelWriteTest.php | 6 +----- lib/Cake/Test/Case/Model/models.php | 2 +- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/lib/Cake/Model/Validator/CakeValidationRule.php b/lib/Cake/Model/Validator/CakeValidationRule.php index 8ebf82589..a59a01c7b 100644 --- a/lib/Cake/Model/Validator/CakeValidationRule.php +++ b/lib/Cake/Model/Validator/CakeValidationRule.php @@ -282,6 +282,17 @@ class CakeValidationRule { return true; } +/** + * Resets interal state for this rule, by default it will become valid + * and it will set isUpdate() to false + * + * @return void + **/ + public function reset() { + $this->_valid = true; + $this->_recordExists = false; + } + /** * Returns passed options for this rule * diff --git a/lib/Cake/Model/Validator/CakeValidationSet.php b/lib/Cake/Model/Validator/CakeValidationSet.php index fdecdc191..1cd32c617 100644 --- a/lib/Cake/Model/Validator/CakeValidationSet.php +++ b/lib/Cake/Model/Validator/CakeValidationSet.php @@ -117,6 +117,7 @@ class CakeValidationSet implements ArrayAccess, IteratorAggregate, Countable { * @return array list of validation errors for this field */ public function validate($data, $isUpdate = false) { + $this->reset(); $errors = array(); foreach ($this->getRules() as $name => $rule) { $rule->isUpdate($isUpdate); @@ -143,6 +144,17 @@ class CakeValidationSet implements ArrayAccess, IteratorAggregate, Countable { return $errors; } +/** + * Resets interal state for all validation rules in this set + * + * @return void + **/ + public function reset() { + foreach ($this->getRules() as $rule) { + $rule->reset(); + } + } + /** * Gets a rule for a given name if exists * diff --git a/lib/Cake/Test/Case/Model/ModelWriteTest.php b/lib/Cake/Test/Case/Model/ModelWriteTest.php index d46a6db27..f8601f4a9 100644 --- a/lib/Cake/Test/Case/Model/ModelWriteTest.php +++ b/lib/Cake/Test/Case/Model/ModelWriteTest.php @@ -3242,7 +3242,6 @@ class ModelWriteTest extends BaseModelTest { ) ), 1 => array( - 'body' => array('This field cannot be left blank'), 'Comment' => array( 0 => array( 'User' => array( @@ -3687,9 +3686,6 @@ class ModelWriteTest extends BaseModelTest { $expected = array( 0 => array( 'body' => array('This field cannot be left blank') - ), - 1 => array( - 'body' => array('This field cannot be left blank') ) ); $result = $TestModel->validationErrors; @@ -3703,7 +3699,7 @@ class ModelWriteTest extends BaseModelTest { ) ), array( - 'Article' => array('id' => 2, 'body' => 'Same here'), + 'Article' => array('id' => 2), 'Comment' => array( array('comment' => '', 'published' => 'Y', 'user_id' => 2) ) diff --git a/lib/Cake/Test/Case/Model/models.php b/lib/Cake/Test/Case/Model/models.php index b550a0ac6..b86a4b583 100644 --- a/lib/Cake/Test/Case/Model/models.php +++ b/lib/Cake/Test/Case/Model/models.php @@ -276,7 +276,7 @@ class Article extends CakeTestModel { public $validate = array( 'user_id' => 'numeric', 'title' => array('required' => false, 'rule' => 'notEmpty'), - 'body' => 'notEmpty', + 'body' => array('required' => false, 'rule' => 'notEmpty'), ); /**