[2.3] [Form] Modified iterator_to_array's 2nd parameter to false in ViolationMapper

This commit is contained in:
Issei.M 2016-05-11 01:50:58 +09:00 committed by Fabien Potencier
parent 4533220997
commit 7101cab29f
2 changed files with 26 additions and 11 deletions

View File

@ -161,9 +161,7 @@ class ViolationMapper implements ViolationMapperInterface
}
}
$children = iterator_to_array(new \RecursiveIteratorIterator(
new InheritDataAwareIterator($form)
));
$children = iterator_to_array(new \RecursiveIteratorIterator(new InheritDataAwareIterator($form)), false);
while ($it->valid()) {
if ($it->isIndex()) {
@ -188,7 +186,7 @@ class ViolationMapper implements ViolationMapperInterface
}
/** @var FormInterface $child */
foreach ($children as $key => $child) {
foreach ($children as $i => $child) {
$childPath = (string) $child->getPropertyPath();
if ($childPath === $chunk) {
$target = $child;
@ -197,7 +195,7 @@ class ViolationMapper implements ViolationMapperInterface
continue;
}
unset($children[$key]);
unset($children[$i]);
}
$it->next();

View File

@ -1477,22 +1477,39 @@ class ViolationMapperTest extends \PHPUnit_Framework_TestCase
public function testBacktrackIfSeveralSubFormsWithSamePropertyPath()
{
$violation = $this->getConstraintViolation('data.address[street]');
$parent = $this->getForm('parent');
$child1 = $this->getForm('subform1', 'address');
$child2 = $this->getForm('subform2', 'address');
$grandChild = $this->getForm('street');
$child3 = $this->getForm('subform3', null, null, array(), true);
$child4 = $this->getForm('subform4', null, null, array(), true);
$grandChild1 = $this->getForm('street');
$grandChild2 = $this->getForm('street', '[sub_address1_street]');
$grandChild3 = $this->getForm('street', '[sub_address2_street]');
$parent->add($child1);
$parent->add($child2);
$child2->add($grandChild);
$parent->add($child3);
$parent->add($child4);
$child2->add($grandChild1);
$child3->add($grandChild2);
$child4->add($grandChild3);
$this->mapper->mapViolation($violation, $parent);
$parent->submit(array());
$violation1 = $this->getConstraintViolation('data.address[street]');
$violation2 = $this->getConstraintViolation('data[sub_address1_street]');
$violation3 = $this->getConstraintViolation('data[sub_address2_street]');
$this->mapper->mapViolation($violation1, $parent);
$this->mapper->mapViolation($violation2, $parent);
$this->mapper->mapViolation($violation3, $parent);
// The error occurred on the child of the second form with the same path
$this->assertCount(0, $parent->getErrors(), $parent->getName().' should not have an error, but has one');
$this->assertCount(0, $child1->getErrors(), $child1->getName().' should not have an error, but has one');
$this->assertCount(0, $child2->getErrors(), $child2->getName().' should not have an error, but has one');
$this->assertEquals(array($this->getFormError()), $grandChild->getErrors(), $grandChild->getName().' should have an error, but has none');
$this->assertCount(0, $child3->getErrors(), $child3->getName().' should not have an error, but has one');
$this->assertCount(0, $child4->getErrors(), $child4->getName().' should not have an error, but has one');
$this->assertEquals(array($this->getFormError($violation1, $grandChild1)), $grandChild1->getErrors(), $grandChild1->getName().' should have an error, but has none');
$this->assertEquals(array($this->getFormError($violation2, $grandChild2)), $grandChild2->getErrors(), $grandChild2->getName().' should have an error, but has none');
$this->assertEquals(array($this->getFormError($violation3, $grandChild3)), $grandChild3->getErrors(), $grandChild3->getName().' should have an error, but has none');
}
}