8000 [Form] Fix `keep_as_list` when data is not an array · symfony/symfony@86b5597 · GitHub
[go: up one dir, main page]

Skip to content

Commit 86b5597

Browse files
committed
[Form] Fix keep_as_list when data is not an array
1 parent 17963ff commit 86b5597

File tree

3 files changed

+23
-6
lines changed

3 files changed

+23
-6
lines changed

src/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ 8000 -199,7 +199,13 @@ public function onSubmit(FormEvent $event): void
199199
}
200200

201201
if ($this->keepAsList) {
202-
$formReindex = [];
202+
$formReindex = $dataKeys = [];
203+
foreach ($data as $key => $value) {
204+
$dataKeys[] = $key;
205+
}
206+
foreach ($dataKeys as $key) {
207+
unset($data[$key]);
208+
}
203209
foreach ($form as $name => $child) {
204210
$formReindex[] = $child;
205211
$form->remove($name);
@@ -208,8 +214,8 @@ public function onSubmit(FormEvent $event): void
208214
$form->add($index, $this->type, array_replace([
209215
'property_path' => '['.$index.']',
210216
], $this->options));
217+
$data[] = $child->getData();
211218
}
212-
$data = array_values($data);
213219
}
214220

215221
$event->setData($data);

src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
namespace Symfony\Component\Form\Tests\Extension\Core\EventListener;
1313

14-
use Doctrine\Common\Collections\ArrayCollection;
1514
use PHPUnit\Framework\TestCase;
1615
use Symfony\Component\EventDispatcher\EventDispatcher;
1716
use Symfony\Component\Form\AbstractType;
@@ -310,11 +309,11 @@ public function testOnSubmitDealsWithObjectBackedIteratorAggregate()
310309
$this->assertArrayNotHasKey(2, $event->getData());
311310
}
312311

313-
public function testOnSubmitDealsWithArrayBackedIteratorAggregate()
312+
public function testOnSubmitDealsWithTraversableArrayAccess()
314313
{
315314
$this->builder->add($this->getBuilder('1'));
316315

317-
$data = new ArrayCollection([0 => 'first', 1 => 'second', 2 => 'third']);
316+
$data = new \ArrayIterator([0 => 'first', 1 => 'second', 2 => 'third']);
318317
$event = new FormEvent($this->builder->getForm(), $data);
319318
$listener = new ResizeFormListener(TextType::class, [], false, true);
320319
$listener->onSubmit($event);
@@ -323,6 +322,19 @@ public function testOnSubmitDealsWithArrayBackedIteratorAggregate()
323322
$this->assertArrayNotHasKey(2, $event->getData());
324323
}
325324

325+
public function testKeepAsListWorksWithTraversableArrayAccess()
326+
{
327+
$this->builder->add($this->getBuilder('1'));
328+
329+
$data = new \ArrayIterator([0 => 'first', 1 => 'second', 2 => 'third']);
330+
$event = new FormEvent($this->builder->getForm(), $data);
331+
$listener = new ResizeFormListener(TextType::class, keepAsList: true);
332+
$listener->onSubmit($event);
333+
334+
$this->assertArrayNotHasKey(1, $event->getData());
335+
$this->assertArrayNotHasKey(2, $event->getData());
336+
}
337+
326338
public function testOnSubmitDeleteEmptyNotCompoundEntriesIfAllowDelete()
327339
{
328340
$this->builder->setData(['0' => 'first', '1' => 'second']);

src/Symfony/Component/Form/composer.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
"symfony/service-contracts": "^2.5|^3"
2828
},
2929
"require-dev": {
30-
"doctrine/collections": "^1.0|^2.0",
3130
"symfony/validator": "^6.4|^7.0",
3231
"symfony/dependency-injection": "^6.4|^7.0",
3332
"symfony/expression-language": "^6.4|^7.0",

0 commit comments

Comments
 (0)
0