Browse Source

Adding missing afterValidate callback to behaviors, Fixes #3024

Jose Lorenzo Rodriguez 13 years ago
parent
commit
39715bcd89

+ 1 - 0
lib/Cake/Model/BehaviorCollection.php

@@ -285,6 +285,7 @@ class BehaviorCollection extends ObjectCollection implements CakeEventListener {
 			'Model.beforeFind' => 'trigger',
 			'Model.afterFind' => 'trigger',
 			'Model.beforeValidate' => 'trigger',
+			'Model.afterValidate' => 'trigger',
 			'Model.beforeSave' => 'trigger',
 			'Model.afterSave' => 'trigger',
 			'Model.beforeDelete' => 'trigger',

+ 11 - 0
lib/Cake/Model/ModelBehavior.php

@@ -147,6 +147,17 @@ class ModelBehavior extends Object {
 	}
 
 /**
+ * afterValidate is called just after model data was validated, you can use this callback
+ * to perform any data cleanup or preparation if needed
+ *
+ * @param Model $model Model using this behavior
+ * @return mixed False will stop this event from being passed to other behaviors
+ */
+	public function afterValidate(Model $model) {
+		return true;
+	}
+
+/**
  * beforeSave is called before a model is saved.  Returning false from a beforeSave callback
  * will abort the save operation.
  *

+ 44 - 0
lib/Cake/Test/Case/Model/BehaviorCollectionTest.php

@@ -195,6 +195,29 @@ class TestBehavior extends ModelBehavior {
 	}
 
 /**
+ * afterValidate method
+ *
+ * @param Model $model
+ * @param bool $cascade
+ * @return void
+ */
+	public function afterValidate(Model $model) {
+		$settings = $this->settings[$model->alias];
+		if (!isset($settings['afterValidate']) || $settings['afterValidate'] == 'off') {
+			return parent::afterValidate($model);
+		}
+		switch ($settings['afterValidate']) {
+			case 'on':
+				return false;
+			break;
+			case 'test':
+				$model->data = array('foo');
+				return true;
+			break;
+		}
+	}
+
+/**
  * beforeDelete method
  *
  * @param Model $model
@@ -967,6 +990,27 @@ class BehaviorCollectionTest extends CakeTestCase {
 	}
 
 /**
+ * testBehaviorValidateAfterCallback method
+ *
+ * @return void
+ */
+	public function testBehaviorValidateAfterCallback() {
+		$Apple = new Apple();
+
+		$Apple->Behaviors->attach('Test');
+		$this->assertSame($Apple->validates(), true);
+
+		$Apple->Behaviors->attach('Test', array('afterValidate' => 'on'));
+		$this->assertSame($Apple->validates(), true);
+		$this->assertSame($Apple->validationErrors, array());
+
+		$Apple->Behaviors->attach('Test', array('afterValidate' => 'test'));
+		$Apple->data = array('bar');
+		$Apple->validates();
+		$this->assertEquals(array('foo'), $Apple->data);
+	}
+
+/**
  * testBehaviorValidateMethods method
  *
  * @return void