From 854daa8f836268833475c63c51bbca986242a735 Mon Sep 17 00:00:00 2001 From: Bernhard Schussek Date: Tue, 10 Jul 2012 10:03:06 +0200 Subject: [PATCH] [Form] Fixed errors not to be added onto non-synchronized forms --- .../Validator/DelegatingValidator.php | 16 ++++++--- .../Validator/DelegatingValidatorTest.php | 35 +++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/Form/Extension/Validator/Validator/DelegatingValidator.php b/src/Symfony/Component/Form/Extension/Validator/Validator/DelegatingValidator.php index 992650d8f5..414cfccf8a 100644 --- a/src/Symfony/Component/Form/Extension/Validator/Validator/DelegatingValidator.php +++ b/src/Symfony/Component/Form/Extension/Validator/Validator/DelegatingValidator.php @@ -66,14 +66,18 @@ class DelegatingValidator implements FormValidatorInterface foreach ($propertyPath->getElements() as $element) { $children = $child->getChildren(); if (!isset($children[$element])) { - $form->addError($error); + if ($form->isSynchronized()) { + $form->addError($error); + } break; } $child = $children[$element]; } - $child->addError($error); + if ($child->isSynchronized()) { + $child->addError($error); + } } } } elseif (count($violations = $this->validator->validate($form))) { @@ -85,12 +89,16 @@ class DelegatingValidator implements FormValidatorInterface foreach ($mapping as $mappedPath => $child) { if (preg_match($mappedPath, $propertyPath)) { - $child->addError($error); + if ($child->isSynchronized()) { + $child->addError($error); + } continue 2; } } - $form->addError($error); + if ($form->isSynchronized()) { + $form->addError($error); + } } } } diff --git a/tests/Symfony/Tests/Component/Form/Extension/Validator/Validator/DelegatingValidatorTest.php b/tests/Symfony/Tests/Component/Form/Extension/Validator/Validator/DelegatingValidatorTest.php index 2b8222233a..4435523b73 100644 --- a/tests/Symfony/Tests/Component/Form/Extension/Validator/Validator/DelegatingValidatorTest.php +++ b/tests/Symfony/Tests/Component/Form/Extension/Validator/Validator/DelegatingValidatorTest.php @@ -12,9 +12,11 @@ namespace Symfony\Tests\Component\Form\Extension\Validator\Validator; use Symfony\Component\Form\FormBuilder; +use Symfony\Component\Form\CallbackTransformer; use Symfony\Component\Form\FormError; use Symfony\Component\Form\Util\PropertyPath; use Symfony\Component\Form\Extension\Validator\Validator\DelegatingValidator; +use Symfony\Component\Form\Exception\TransformationFailedException; use Symfony\Component\Validator\ConstraintViolation; use Symfony\Component\Validator\ExecutionContext; @@ -85,6 +87,24 @@ class DelegatingValidatorTest extends \PHPUnit_Framework_TestCase return $this->getBuilder($name, $propertyPath)->getForm(); } + protected function getNonSynchronizedForm() + { + $form = $this->getBuilder() + ->appendClientTransformer(new CallbackTransformer( + function ($normValue) { + return $normValue; + }, + function () { + throw new TransformationFailedException('Failed'); + } + )) + ->getForm(); + + $form->bind('foobar'); + + return $form; + } + protected function getMockForm() { return $this->getMock('Symfony\Tests\Component\Form\FormInterface'); @@ -118,6 +138,21 @@ class DelegatingValidatorTest extends \PHPUnit_Framework_TestCase $this->assertEquals(array($this->getFormError()), $form->getErrors()); } + public function testNoFormErrorsOnNonSynchronizedForm() + { + $form = $this->getNonSynchronizedForm(); + + $this->delegate->expects($this->once()) + ->method('validate') + ->will($this->returnValue(array( + $this->getConstraintViolation('constrainedProp') + ))); + + $this->validator->validate($form); + + $this->assertEquals(array(), $form->getErrors()); + } + public function testFormErrorsOnChild() { $parent = $this->getForm();