Skip to content

Commit a5ab64d

Browse files
committed
Added support for ArrayContext
1 parent 7771f1f commit a5ab64d

File tree

3 files changed

+65
-15
lines changed

3 files changed

+65
-15
lines changed

src/Validation/Validator.php

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,20 @@
3030
*/
3131
class Validator implements ArrayAccess, IteratorAggregate, Countable
3232
{
33+
/**
34+
* Default empty message
35+
*
36+
* @var string
37+
*/
38+
const DEFAULT_EMPTY_MESSAGE = 'This field cannot be left empty';
39+
40+
/**
41+
* Default required message
42+
*
43+
* @var string
44+
*/
45+
const DEFAULT_REQUIRED_MESSAGE = 'This field is required';
46+
3347
/**
3448
* Used to flag nested rules created with addNested() and addNestedMany()
3549
*
@@ -1937,9 +1951,9 @@ public function regex($field, $regex, $message = null, $when = null)
19371951
*/
19381952
public function getRequiredMessage($field)
19391953
{
1940-
$defaultMessage = 'This field is required';
1954+
$defaultMessage = static::DEFAULT_REQUIRED_MESSAGE;
19411955
if ($this->_useI18n) {
1942-
$defaultMessage = __d('cake', 'This field is required');
1956+
$defaultMessage = __d('cake', $defaultMessage);
19431957
}
19441958

19451959
return isset($this->_presenceMessages[$field])
@@ -1955,9 +1969,9 @@ public function getRequiredMessage($field)
19551969
*/
19561970
public function getEmptyMessage($field)
19571971
{
1958-
$defaultMessage = 'This field cannot be left empty';
1972+
$defaultMessage = static::DEFAULT_EMPTY_MESSAGE;
19591973
if ($this->_useI18n) {
1960-
$defaultMessage = __d('cake', 'This field cannot be left empty');
1974+
$defaultMessage = __d('cake', $defaultMessage);
19611975
}
19621976

19631977
return isset($this->_allowEmptyMessages[$field])

src/View/Form/ArrayContext.php

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
use Cake\Http\ServerRequest;
1818
use Cake\Utility\Hash;
19+
use Cake\Validation\Validator;
1920

2021
/**
2122
* Provides a basic array based context provider for FormHelper.
@@ -29,7 +30,8 @@
2930
* will be used when there is no request data set. Data should be nested following
3031
* the dot separated paths you access your fields with.
3132
* - `required` A nested array of fields, relationships and boolean
32-
* flags to indicate a field is required.
33+
* flags to indicate a field is required. The value can also be a string to be used
34+
* as the required error message
3335
* - `schema` An array of data that emulate the column structures that
3436
* Cake\Database\Schema\Schema uses. This array allows you to control
3537
* the inferred type for fields and allows auto generation of attributes
@@ -53,7 +55,12 @@
5355
* 'defaults' => [
5456
* 'id' => 1,
5557
* 'title' => 'First post!',
56-
* ]
58+
* ],
59+
* 'required' => [
60+
* 'id' => true, // will use default required message
61+
* 'title' => 'Please enter a title',
62+
* 'body' => false,
63+
* ],
5764
* ];
5865
* ```
5966
*/
@@ -194,24 +201,36 @@ public function val($field, $options = [])
194201
* @return bool
195202
*/
196203
public function isRequired($field)
204+
{
205+
return (bool)$this->getRequiredMessage($field);
206+
}
207+
208+
/**
209+
* {@inheritDoc}
210+
*/
211+
public function getRequiredMessage($field)
197212
{
198213
if (!is_array($this->_context['required'])) {
199-
return false;
214+
return null;
200215
}
201216
$required = Hash::get($this->_context['required'], $field);
202217
if ($required === null) {
203218
$required = Hash::get($this->_context['required'], $this->stripNesting($field));
204219
}
205220

206-
return (bool)$required;
207-
}
221+
if ($required === false) {
222+
return null;
223+
}
208224

209-
/**
210-
* {@inheritDoc}
211-
*/
212-
public function getRequiredMessage($field)
213-
{
214-
return null;
225+
if ($required === true) {
226+
$required = Validator::DEFAULT_REQUIRED_MESSAGE;
227+
228+
if (function_exists('__d ')) {
229+
$required = __d('cake', $required);
230+
}
231+
}
232+
233+
return $required;
215234
}
216235

217236
/**

tests/TestCase/View/Form/ArrayContextTest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,23 @@ public function setUp()
3535
$this->request = new ServerRequest();
3636
}
3737

38+
public function testGetRequiredMessage()
39+
{
40+
$context = new ArrayContext($this->request, [
41+
'required' => [
42+
'Comments' => [
43+
'required' => 'My custom message',
44+
'nope' => false,
45+
'tags' => true
46+
]
47+
]
48+
]);
49+
50+
$this->assertSame('My custom message', $context->getRequiredMessage('Comments.required'));
51+
$this->assertSame('This field is required', $context->getRequiredMessage('Comments.tags'));
52+
$this->assertSame(null, $context->getRequiredMessage('Comments.nope'));
53+
}
54+
3855
/**
3956
* Test getting the primary key.
4057
*

0 commit comments

Comments
 (0)