From ee70361e53eabf3ca86ab1de28506bd7af5e608b Mon Sep 17 00:00:00 2001 From: Yonel Ceruto Date: Thu, 12 Oct 2017 18:51:51 -0400 Subject: [PATCH] [Form] Fix 5.5 compatibility for ResizeFormListener --- .../Core/EventListener/ResizeFormListener.php | 4 +- .../EventListener/ResizeFormListenerTest.php | 47 +++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php b/src/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php index 402a1f0725..8ce2d2e065 100644 --- a/src/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php +++ b/src/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php @@ -149,12 +149,12 @@ class ResizeFormListener implements EventSubscriberInterface throw new UnexpectedTypeException($data, 'array or (\Traversable and \ArrayAccess)'); } - if ($entryFilter = $this->deleteEmpty) { + if ($this->deleteEmpty) { $previousData = $form->getData(); /** @var FormInterface $child */ foreach ($form as $name => $child) { $isNew = !isset($previousData[$name]); - $isEmpty = is_callable($entryFilter) ? $entryFilter($child->getData()) : $child->isEmpty(); + $isEmpty = is_callable($this->deleteEmpty) ? call_user_func($this->deleteEmpty, $child->getData()) : $child->isEmpty(); // $isNew can only be true if allowAdd is true, so we don't // need to check allowAdd again 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 281581bcff..017c1bdc04 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php @@ -275,4 +275,51 @@ class ResizeFormListenerTest extends TestCase $this->assertArrayNotHasKey(0, $event->getData()); $this->assertArrayNotHasKey(2, $event->getData()); } + + public function testOnSubmitDeleteEmptyNotCompoundEntriesIfAllowDelete() + { + $this->form->setData(array('0' => 'first', '1' => 'second')); + $this->form->add($this->getForm('0')); + $this->form->add($this->getForm('1')); + + $data = array(0 => 'first', 1 => ''); + foreach ($data as $child => $dat) { + $this->form->get($child)->setData($dat); + } + $event = new FormEvent($this->form, $data); + $listener = new ResizeFormListener('text', array(), false, true, true); + $listener->onSubmit($event); + + $this->assertEquals(array(0 => 'first'), $event->getData()); + } + + public function testOnSubmitDeleteEmptyCompoundEntriesIfAllowDelete() + { + $this->form->setData(array('0' => array('name' => 'John'), '1' => array('name' => 'Jane'))); + $form1 = $this->getBuilder('0') + ->setCompound(true) + ->setDataMapper($this->getDataMapper()) + ->getForm(); + $form1->add($this->getForm('name')); + $form2 = $this->getBuilder('1') + ->setCompound(true) + ->setDataMapper($this->getDataMapper()) + ->getForm(); + $form2->add($this->getForm('name')); + $this->form->add($form1); + $this->form->add($form2); + + $data = array('0' => array('name' => 'John'), '1' => array('name' => '')); + foreach ($data as $child => $dat) { + $this->form->get($child)->setData($dat); + } + $event = new FormEvent($this->form, $data); + $callback = function ($data) { + return '' === $data['name']; + }; + $listener = new ResizeFormListener('text', array(), false, true, $callback); + $listener->onSubmit($event); + + $this->assertEquals(array('0' => array('name' => 'John')), $event->getData()); + } }