From 9facb2f32fe933ef18020e7faf4d796916648cd5 Mon Sep 17 00:00:00 2001 From: Jan Pintr Date: Fri, 27 Oct 2023 12:30:56 +0200 Subject: [PATCH] [Form] Fix merging form data and files (ter) --- .../Tests/AbstractRequestHandlerTestCase.php | 44 +++++++++++++++++++ .../Tests/Extension/Type/ItemFileType.php | 26 +++++++++++ src/Symfony/Component/Form/Util/FormUtil.php | 18 ++++---- 3 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 src/Symfony/Component/Form/Tests/Extension/Type/ItemFileType.php diff --git a/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTestCase.php b/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTestCase.php index a68c8f8a0511f..09c8584431856 100644 --- a/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTestCase.php +++ b/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTestCase.php @@ -14,6 +14,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\Form\Extension\Core\DataMapper\DataMapper; +use Symfony\Component\Form\Extension\Core\Type\CollectionType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Form; use Symfony\Component\Form\FormBuilder; @@ -23,6 +24,7 @@ use Symfony\Component\Form\Forms; use Symfony\Component\Form\RequestHandlerInterface; use Symfony\Component\Form\ResolvedFormTypeFactory; +use Symfony\Component\Form\Tests\Extension\Type\ItemFileType; use Symfony\Component\Form\Util\ServerParams; /** @@ -311,6 +313,48 @@ public function testParamTakesPrecedenceOverFile($method) $this->assertSame('DATA', $form->getData()); } + public function testMergeZeroIndexedCollection() + { + $form = $this->createForm('root', 'POST', true); + $form->add('items', CollectionType::class, [ + 'entry_type' => ItemFileType::class, + 'allow_add' => true, + ]); + + $file = $this->getUploadedFile(); + + $this->setRequestData('POST', [ + 'root' => [ + 'items' => [ + 0 => [ + 'item' => 'test', + ], + ], + ], + ], [ + 'root' => [ + 'items' => [ + 0 => [ + 'file' => $file, + ], + ], + ], + ]); + + $this->requestHandler->handleRequest($form, $this->request); + + $itemsForm = $form->get('items'); + + $this->assertTrue($form->isSubmitted()); + $this->assertTrue($form->isValid()); + + $this->assertTrue($itemsForm->has('0')); + $this->assertFalse($itemsForm->has('1')); + + $this->assertEquals('test', $itemsForm->get('0')->get('item')->getData()); + $this->assertNotNull($itemsForm->get('0')->get('file')); + } + /** * @dataProvider methodExceptGetProvider */ diff --git a/src/Symfony/Component/Form/Tests/Extension/Type/ItemFileType.php b/src/Symfony/Component/Form/Tests/Extension/Type/ItemFileType.php new file mode 100644 index 0000000000000..38c25ec2a17ff --- /dev/null +++ b/src/Symfony/Component/Form/Tests/Extension/Type/ItemFileType.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Tests\Extension\Type; + +use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\FileType; +use Symfony\Component\Form\Extension\Core\Type\TextType; +use Symfony\Component\Form\FormBuilderInterface; + +class ItemFileType extends AbstractType +{ + public function buildForm(FormBuilderInterface $builder, array $options): void + { + $builder->add('item', TextType::class); + $builder->add('file', FileType::class); + } +} diff --git a/src/Symfony/Component/Form/Util/FormUtil.php b/src/Symfony/Component/Form/Util/FormUtil.php index 56b99ec119f0e..3485d800af281 100644 --- a/src/Symfony/Component/Form/Util/FormUtil.php +++ b/src/Symfony/Component/Form/Util/FormUtil.php @@ -50,13 +50,7 @@ public static function isEmpty($data) */ public static function mergeParamsAndFiles(array $params, array $files): array { - if (array_is_list($files)) { - foreach ($files as $value) { - $params[] = $value; - } - - return $params; - } + $isFilesList = array_is_list($files); foreach ($params as $key => $value) { if (\is_array($value) && \is_array($files[$key] ?? null)) { @@ -65,6 +59,14 @@ public static function mergeParamsAndFiles(array $params, array $files): array } } - return array_replace($params, $files); + if (!$isFilesList) { + return array_replace($params, $files); + } + + foreach ($files as $value) { + $params[] = $value; + } + + return $params; } }