Skip to content

Commit 0d00d8e

Browse files
committed
Form::onValidate - values are passed only when form is valid
1 parent b54569f commit 0d00d8e

2 files changed

Lines changed: 17 additions & 9 deletions

File tree

src/Forms/Container.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,11 @@ public function validate(array $controls = null): void
171171
if (!is_iterable($this->onValidate)) {
172172
throw new Nette\UnexpectedValueException('Property Form::$onValidate must be iterable, ' . gettype($this->onValidate) . ' given.');
173173
}
174+
175+
$isValid = !$this->getErrors();
174176
foreach ($this->onValidate as $handler) {
175177
$params = Nette\Utils\Callback::toReflection($handler)->getParameters();
176-
$values = isset($params[1])
178+
$values = isset($params[1]) && $isValid
177179
? $this->getValues($params[1]->getType() instanceof \ReflectionNamedType ? $params[1]->getType()->getName() : null)
178180
: null;
179181
$handler($this, $values);

tests/Forms/Forms.validationScope.phpt

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,32 @@ require __DIR__ . '/../bootstrap.php';
1515

1616

1717
$datasets = [
18-
['send1', ['container', 'form', 'name', 'age', 'age2']],
19-
['send2', ['form']],
20-
['send3', ['form', 'name']],
21-
['send4', ['form', 'age']],
22-
['send5', ['container', 'form', 'age', 'age2']],
18+
['send1', ['container', 'form', 'name', 'age', 'age2'], null],
19+
['send2', ['form'], ['optional' => '', 'details' => []]],
20+
['send3', ['form', 'name'], null],
21+
['send4', ['form', 'age'], null],
22+
['send5', ['container', 'form', 'age', 'age2'], null],
2323
];
2424

2525
foreach ($datasets as $case) {
2626
$form = new Form;
27-
$form->onValidate[] = function (Form $form) {
27+
$form->onValidate[] = function (Form $form, ?array $values) use (&$values1) {
2828
$form->addError('form');
29+
$values1 = $values;
2930
};
3031
$form->addText('name')->setRequired('name');
32+
$form->addText('optional');
3133

3234
$details = $form->addContainer('details');
33-
$details->onValidate[] = function (Container $container) {
35+
$details->onValidate[] = function (Container $container, $values) use (&$values2) {
3436
$container->getForm()->addError('container');
37+
$values2 = $values;
3538
};
3639
$details->addText('age')->setRequired('age');
3740
$details->addText('age2')->setRequired('age2');
3841

3942
$form->addSubmit('send1');
40-
$form->addSubmit('send2')->setValidationScope([]);
43+
$form->addSubmit('send2')->setValidationScope([$form['optional']]);
4144
$form->addSubmit('send3')->setValidationScope([$form['name']]);
4245
$form->addSubmit('send4')->setValidationScope([$form['details']['age']]);
4346
$form->addSubmit('send5')->setValidationScope([$form['details']]);
@@ -47,4 +50,7 @@ foreach ($datasets as $case) {
4750
Assert::truthy($form->isSubmitted());
4851
$form->validate();
4952
Assert::equal($case[1], $form->getErrors());
53+
54+
Assert::same($case[2], $values1);
55+
Assert::null($values2);
5056
}

0 commit comments

Comments
 (0)