diff --git a/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php b/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php index b5a06156c0..3bf57df048 100644 --- a/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php +++ b/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php @@ -65,18 +65,38 @@ class FormValidator extends ConstraintValidator // Validate the data against the constraints defined // in the form $constraints = $config->getOption('constraints', array()); - foreach ($constraints as $constraint) { - foreach ($groups as $group) { - if (in_array($group, $constraint->groups)) { - if ($validator) { - $validator->atPath('data')->validate($form->getData(), $constraint, $group); - } else { - // 2.4 API - $this->context->validateValue($form->getData(), $constraint, 'data', $group); + + if ($groups instanceof GroupSequence) { + if ($validator) { + $validator->atPath('data')->validate($form->getData(), $constraints, $groups); + } else { + // 2.4 API + foreach ($groups as $group) { + foreach ($constraints as $constraint) { + if (in_array($group, $constraint->groups)) { + $this->context->validateValue($form->getData(), $constraint, 'data', $group); + } } - // Prevent duplicate validation - continue 2; + if (count($this->context->getViolations()) > 0) { + break; + } + } + } + } else { + foreach ($constraints as $constraint) { + foreach ($groups as $group) { + if (in_array($group, $constraint->groups)) { + if ($validator) { + $validator->atPath('data')->validate($form->getData(), $constraint, $group); + } else { + // 2.4 API + $this->context->validateValue($form->getData(), $constraint, 'data', $group); + } + + // Prevent duplicate validation + continue 2; + } } } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php index 8cd2dabc02..78015b5049 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php @@ -342,7 +342,7 @@ class FormValidatorTest extends AbstractConstraintValidatorTest $this->assertNoViolation(); } - public function testHandleCallbackValidationGroups() + public function testHandleGroupSequenceValidationGroups() { $object = $this->getMockBuilder('\stdClass')->getMock(); $options = array('validation_groups' => new GroupSequence(array('group1', 'group2'))); @@ -351,13 +351,14 @@ class FormValidatorTest extends AbstractConstraintValidatorTest ->getForm(); $this->expectValidateAt(0, 'data', $object, new GroupSequence(array('group1', 'group2'))); + $this->expectValidateAt(1, 'data', $object, new GroupSequence(array('group1', 'group2'))); $this->validator->validate($form, new Form()); $this->assertNoViolation(); } - public function testHandleGroupSequenceValidationGroups() + public function testHandleCallbackValidationGroups() { $object = $this->getMockBuilder('\stdClass')->getMock(); $options = array('validation_groups' => array($this, 'getValidationGroups')); diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php index 79e4dc78f7..e0de1c1ff8 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php @@ -12,14 +12,22 @@ namespace Symfony\Component\Form\Tests\Extension\Validator\Type; use Symfony\Component\Form\Extension\Validator\Type\FormTypeValidatorExtension; +use Symfony\Component\Form\Extension\Validator\ValidatorExtension; +use Symfony\Component\Form\Forms; +use Symfony\Component\Form\Tests\Extension\Core\Type\FormTypeTest; +use Symfony\Component\Form\Tests\Extension\Core\Type\TextTypeTest; +use Symfony\Component\Validator\Constraints\Email; +use Symfony\Component\Validator\Constraints\GroupSequence; +use Symfony\Component\Validator\Constraints\Length; use Symfony\Component\Validator\ConstraintViolationList; +use Symfony\Component\Validator\Validation; class FormTypeValidatorExtensionTest extends BaseValidatorExtensionTest { public function testSubmitValidatesData() { $builder = $this->factory->createBuilder( - 'form', + FormTypeTest::TESTED_TYPE, null, array( 'validation_groups' => 'group', @@ -63,8 +71,27 @@ class FormTypeValidatorExtensionTest extends BaseValidatorExtensionTest new FormTypeValidatorExtension(null); } + public function testGroupSequenceWithConstraintsOption() + { + $form = Forms::createFormFactoryBuilder() + ->addExtension(new ValidatorExtension(Validation::createValidator())) + ->getFormFactory() + ->create(FormTypeTest::TESTED_TYPE, null, (array('validation_groups' => new GroupSequence(array('First', 'Second'))))) + ->add('field', TextTypeTest::TESTED_TYPE, array( + 'constraints' => array( + new Length(array('min' => 10, 'groups' => array('First'))), + new Email(array('groups' => array('Second'))), + ), + )) + ; + + $form->submit(array('field' => 'wrong')); + + $this->assertCount(1, $form->getErrors(true)); + } + protected function createForm(array $options = array()) { - return $this->factory->create('form', null, $options); + return $this->factory->create(FormTypeTest::TESTED_TYPE, null, $options); } }