diff --git a/src/Validation/Validator.php b/src/Validation/Validator.php index 96fb6ee0259..9eb31a85b1a 100644 --- a/src/Validation/Validator.php +++ b/src/Validation/Validator.php @@ -424,7 +424,7 @@ public function remove($field, $rule = null) /** * Sets whether a field is required to be present in data array. * - * @param string $field the name of the field + * @param string|array $field the name of the field * @param bool|string|callable $mode Valid values are true, false, 'create', 'update'. * If a callable is passed then the field will be required only when the callback * returns true. @@ -433,10 +433,30 @@ public function remove($field, $rule = null) */ public function requirePresence($field, $mode = true, $message = null) { - $this->field($field)->isPresenceRequired($mode); - if ($message) { - $this->_presenceMessages[$field] = $message; + if (!is_array($field)) { + $field = [ + $field => [ + 'mode' => $mode, + 'message' => $message + ] + ]; } + + foreach ($field as $fieldName => $setting) { + if (is_string($setting)) { + $fieldName = $setting; + $setting = []; + } + $setting += [ + 'mode' => $mode, + 'message' => $message + ]; + $this->field($fieldName)->isPresenceRequired($setting['mode']); + if ($setting['message']) { + $this->_presenceMessages[$fieldName] = $setting['message']; + } + } + return $this; } diff --git a/tests/TestCase/Validation/ValidatorTest.php b/tests/TestCase/Validation/ValidatorTest.php index 2b9901d1c41..924a8f582b8 100644 --- a/tests/TestCase/Validation/ValidatorTest.php +++ b/tests/TestCase/Validation/ValidatorTest.php @@ -191,6 +191,32 @@ public function testRequirePresence() $this->assertEquals('update', $validator->field('title')->isPresenceRequired()); } + /** + * Tests the requirePresence method + * + * @return void + */ + public function testRequirePresenceAsArray() + { + $validator = new Validator; + $validator->requirePresence(['title', 'created']); + $this->assertTrue($validator->field('title')->isPresenceRequired()); + $this->assertTrue($validator->field('created')->isPresenceRequired()); + + $validator->requirePresence([ + 'title' => [ + 'mode' => false + ], + 'content' => [ + 'mode' => 'update' + ], + 'subject' + ], true); + $this->assertFalse($validator->field('title')->isPresenceRequired()); + $this->assertEquals('update', $validator->field('content')->isPresenceRequired()); + $this->assertTrue($validator->field('subject')->isPresenceRequired()); + } + /** * Tests the requirePresence method when passing a callback * @@ -383,6 +409,36 @@ public function testCustomErrorsWithPresenceRequired() $this->assertEquals($expected, $errors); } + /** + * Tests custom error messages generated when a field presence is required + * + * @return void + */ + public function testCustomErrorsWithPresenceRequiredAsArray() + { + $validator = new Validator; + $validator->requirePresence(['title', 'content'], true, 'Custom message'); + $errors = $validator->errors(['foo' => 'something']); + $expected = [ + 'title' => ['_required' => 'Custom message'], + 'content' => ['_required' => 'Custom message'] + ]; + $this->assertEquals($expected, $errors); + + $validator->requirePresence([ + 'title' => [ + 'message' => 'Test message' + ], + 'content' + ], true, 'Custom message'); + $errors = $validator->errors(['foo' => 'something']); + $expected = [ + 'title' => ['_required' => 'Test message'], + 'content' => ['_required' => 'Custom message'] + ]; + $this->assertEquals($expected, $errors); + } + /** * Tests the allowEmpty method * @@ -1380,6 +1436,7 @@ public function testRangeFailure() $validator = new Validator(); $validator->range('username', [1]); } + /** * Tests the url proxy method *