Skip to content

Commit a326d5f

Browse files
martinsedlacekdg
authored andcommitted
ChoiceControl, MultiChoiceControl, HiddenField: added BackedEnum support (#293)
1 parent 0b19cf1 commit a326d5f

File tree

4 files changed

+33
-8
lines changed

4 files changed

+33
-8
lines changed

src/Forms/Controls/ChoiceControl.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,16 @@ public function loadHttpData(): void
4949

5050
/**
5151
* Sets selected item (by key).
52-
* @param string|int|null $value
52+
* @param string|int|\BackedEnum|null $value
5353
* @return static
5454
* @internal
5555
*/
5656
public function setValue($value)
5757
{
58+
if ($value instanceof \BackedEnum) {
59+
$value = $value->value;
60+
}
61+
5862
if ($this->checkDefaultValue && $value !== null && !array_key_exists((string) $value, $this->items)) {
5963
$set = Nette\Utils\Strings::truncate(implode(', ', array_map(function ($s) { return var_export($s, true); }, array_keys($this->items))), 70, '...');
6064
throw new Nette\InvalidArgumentException("Value '$value' is out of allowed set [$set] in field '{$this->name}'.");

src/Forms/Controls/HiddenField.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ public function setValue($value)
4646
{
4747
if ($value === null) {
4848
$value = '';
49+
} elseif ($value instanceof \BackedEnum) {
50+
$value = $value->value;
4951
} elseif (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
5052
throw new Nette\InvalidArgumentException(sprintf("Value must be scalar or null, %s given in field '%s'.", gettype($value), $this->name));
5153
}

src/Forms/Controls/MultiChoiceControl.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ public function setValue($values)
6060

6161
$flip = [];
6262
foreach ($values as $value) {
63-
if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
63+
if ($value instanceof \BackedEnum) {
64+
$value = $value->value;
65+
} elseif (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
6466
throw new Nette\InvalidArgumentException(sprintf("Values must be scalar, %s given in field '%s'.", gettype($value), $this->name));
6567
}
6668

tests/Forms/Forms.enum.phpt

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,8 @@ enum TestEnum: string
2121
}
2222

2323

24-
setUp(function () {
25-
ob_start();
26-
Form::initialize(true);
27-
});
28-
29-
3024
test('validators for enums', function () {
25+
Form::initialize(true);
3126
$form = new Form;
3227
$input = $form->addText('text');
3328
$input->setValue(TestEnum::Case1->value);
@@ -37,3 +32,25 @@ test('validators for enums', function () {
3732
Assert::false(Validator::validateEqual($input, TestEnum::Case2));
3833
Assert::false(Validator::validateEqual($input, 1));
3934
});
35+
36+
37+
test('enum as default value', function () {
38+
$items = ['case 1' => '1', 'case 2' => '2', 'case 3' => '3', 'case 4' => '4'];
39+
40+
Form::initialize(true);
41+
$form = new Form;
42+
$form->addSelect('select', null, $items);
43+
$form->addMultiSelect('multi', null, $items);
44+
$form->addHidden('hidden', TestEnum::Case2);
45+
46+
$form->setDefaults([
47+
'select' => TestEnum::Case1,
48+
'multi' => [TestEnum::Case1, TestEnum::Case2],
49+
]);
50+
51+
Assert::same([
52+
'select' => 'case 1',
53+
'multi' => ['case 1', 'case 2'],
54+
'hidden' => 'case 2',
55+
], $form->getValues('array'));
56+
});

0 commit comments

Comments
 (0)