From a5ab64d9d5644bff4a1e887c36187c870e58ae26 Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Tue, 20 Mar 2018 12:59:35 -0500 Subject: [PATCH] Added support for ArrayContext --- src/Validation/Validator.php | 22 ++++++++-- src/View/Form/ArrayContext.php | 41 ++++++++++++++----- tests/TestCase/View/Form/ArrayContextTest.php | 17 ++++++++ 3 files changed, 65 insertions(+), 15 deletions(-) diff --git a/src/Validation/Validator.php b/src/Validation/Validator.php index c05007fa84b..47e4f6299ac 100644 --- a/src/Validation/Validator.php +++ b/src/Validation/Validator.php @@ -30,6 +30,20 @@ */ class Validator implements ArrayAccess, IteratorAggregate, Countable { + /** + * Default empty message + * + * @var string + */ + const DEFAULT_EMPTY_MESSAGE = 'This field cannot be left empty'; + + /** + * Default required message + * + * @var string + */ + const DEFAULT_REQUIRED_MESSAGE = 'This field is required'; + /** * Used to flag nested rules created with addNested() and addNestedMany() * @@ -1937,9 +1951,9 @@ public function regex($field, $regex, $message = null, $when = null) */ public function getRequiredMessage($field) { - $defaultMessage = 'This field is required'; + $defaultMessage = static::DEFAULT_REQUIRED_MESSAGE; if ($this->_useI18n) { - $defaultMessage = __d('cake', 'This field is required'); + $defaultMessage = __d('cake', $defaultMessage); } return isset($this->_presenceMessages[$field]) @@ -1955,9 +1969,9 @@ public function getRequiredMessage($field) */ public function getEmptyMessage($field) { - $defaultMessage = 'This field cannot be left empty'; + $defaultMessage = static::DEFAULT_EMPTY_MESSAGE; if ($this->_useI18n) { - $defaultMessage = __d('cake', 'This field cannot be left empty'); + $defaultMessage = __d('cake', $defaultMessage); } return isset($this->_allowEmptyMessages[$field]) diff --git a/src/View/Form/ArrayContext.php b/src/View/Form/ArrayContext.php index 6c3a1aff9a2..d8b4fcdaed8 100644 --- a/src/View/Form/ArrayContext.php +++ b/src/View/Form/ArrayContext.php @@ -16,6 +16,7 @@ use Cake\Http\ServerRequest; use Cake\Utility\Hash; +use Cake\Validation\Validator; /** * Provides a basic array based context provider for FormHelper. @@ -29,7 +30,8 @@ * will be used when there is no request data set. Data should be nested following * the dot separated paths you access your fields with. * - `required` A nested array of fields, relationships and boolean - * flags to indicate a field is required. + * flags to indicate a field is required. The value can also be a string to be used + * as the required error message * - `schema` An array of data that emulate the column structures that * Cake\Database\Schema\Schema uses. This array allows you to control * the inferred type for fields and allows auto generation of attributes @@ -53,7 +55,12 @@ * 'defaults' => [ * 'id' => 1, * 'title' => 'First post!', - * ] + * ], + * 'required' => [ + * 'id' => true, // will use default required message + * 'title' => 'Please enter a title', + * 'body' => false, + * ], * ]; * ``` */ @@ -194,24 +201,36 @@ public function val($field, $options = []) * @return bool */ public function isRequired($field) + { + return (bool)$this->getRequiredMessage($field); + } + + /** + * {@inheritDoc} + */ + public function getRequiredMessage($field) { if (!is_array($this->_context['required'])) { - return false; + return null; } $required = Hash::get($this->_context['required'], $field); if ($required === null) { $required = Hash::get($this->_context['required'], $this->stripNesting($field)); } - return (bool)$required; - } + if ($required === false) { + return null; + } - /** - * {@inheritDoc} - */ - public function getRequiredMessage($field) - { - return null; + if ($required === true) { + $required = Validator::DEFAULT_REQUIRED_MESSAGE; + + if (function_exists('__d ')) { + $required = __d('cake', $required); + } + } + + return $required; } /** diff --git a/tests/TestCase/View/Form/ArrayContextTest.php b/tests/TestCase/View/Form/ArrayContextTest.php index 9acb758680a..d2869e06fb6 100644 --- a/tests/TestCase/View/Form/ArrayContextTest.php +++ b/tests/TestCase/View/Form/ArrayContextTest.php @@ -35,6 +35,23 @@ public function setUp() $this->request = new ServerRequest(); } + public function testGetRequiredMessage() + { + $context = new ArrayContext($this->request, [ + 'required' => [ + 'Comments' => [ + 'required' => 'My custom message', + 'nope' => false, + 'tags' => true + ] + ] + ]); + + $this->assertSame('My custom message', $context->getRequiredMessage('Comments.required')); + $this->assertSame('This field is required', $context->getRequiredMessage('Comments.tags')); + $this->assertSame(null, $context->getRequiredMessage('Comments.nope')); + } + /** * Test getting the primary key. *