diff --git a/src/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php b/src/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php index f1c39db245..207cbd3d38 100644 --- a/src/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php +++ b/src/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php @@ -139,11 +139,17 @@ class ResizeFormListener implements EventSubscriberInterface // The data mapper only adds, but does not remove items, so do this // here if ($this->allowDelete) { + $toDelete = array(); + foreach ($data as $name => $child) { if (!$form->has($name)) { - unset($data[$name]); + $toDelete[] = $name; } } + + foreach ($toDelete as $name) { + unset($data[$name]); + } } $event->setData($data); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php index 3c162654dd..07620dc635 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php @@ -254,7 +254,20 @@ class ResizeFormListenerTest extends \PHPUnit_Framework_TestCase $this->assertEquals(array(), $event->getData()); } - public function testOnSubmitDealsWithIteratorAggregate() + public function testOnSubmitDealsWithObjectBackedIteratorAggregate() + { + $this->form->add($this->getForm('1')); + + $data = new \ArrayObject(array(0 => 'first', 1 => 'second', 2 => 'third')); + $event = new FormEvent($this->form, $data); + $listener = new ResizeFormListener('text', array(), false, true); + $listener->onSubmit($event); + + $this->assertArrayNotHasKey(0, $event->getData()); + $this->assertArrayNotHasKey(2, $event->getData()); + } + + public function testOnSubmitDealsWithArrayBackedIteratorAggregate() { $this->form->add($this->getForm('1'));