From e4174d780c837786937a70515d2fc8a7771cdbc8 Mon Sep 17 00:00:00 2001 From: Jordi Sala Morales Date: Sun, 11 Mar 2018 15:00:38 +0100 Subject: [PATCH] Entities with construct can be used on Collection and AdminType There was a problem with entities that defined a constructor with arguments. It was impossible to use them on Collection and AdminType because we didn't override the default behavior when the data is empty. --- src/Builder/FormContractor.php | 6 ++++++ tests/Builder/FormContractorTest.php | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/src/Builder/FormContractor.php b/src/Builder/FormContractor.php index dceb834db..0e7b9b625 100644 --- a/src/Builder/FormContractor.php +++ b/src/Builder/FormContractor.php @@ -157,6 +157,9 @@ public function getDefaultOptions($type, FieldDescriptionInterface $fieldDescrip $options['delete'] = false; $options['data_class'] = $fieldDescription->getAssociationAdmin()->getClass(); + $options['empty_data'] = function () use ($fieldDescription) { + return $fieldDescription->getAssociationAdmin()->getNewInstance(); + }; $fieldDescription->setOption('edit', $fieldDescription->getOption('edit', 'admin')); // NEXT_MAJOR: Check only against FQCNs when dropping support for Symfony 2.8 } elseif ('sonata_type_collection' === $type || $this->checkFormClass($type, [CollectionType::class])) { @@ -174,6 +177,9 @@ public function getDefaultOptions($type, FieldDescriptionInterface $fieldDescrip $options['type_options'] = [ 'sonata_field_description' => $fieldDescription, 'data_class' => $fieldDescription->getAssociationAdmin()->getClass(), + 'empty_data' => function () use ($fieldDescription) { + return $fieldDescription->getAssociationAdmin()->getNewInstance(); + }, ]; } diff --git a/tests/Builder/FormContractorTest.php b/tests/Builder/FormContractorTest.php index 3d7ae904c..fee9b2995 100644 --- a/tests/Builder/FormContractorTest.php +++ b/tests/Builder/FormContractorTest.php @@ -64,6 +64,7 @@ public function testDefaultOptionsForSonataFormTypes() { $admin = $this->createMock(AdminInterface::class); $modelManager = $this->createMock(ModelManagerInterface::class); + $model = $this->createMock(\stdClass::class); $modelClass = 'FooEntity'; $admin->method('getModelManager')->willReturn($modelManager); @@ -73,6 +74,7 @@ public function testDefaultOptionsForSonataFormTypes() $fieldDescription->method('getAdmin')->willReturn($admin); $fieldDescription->method('getTargetEntity')->willReturn($modelClass); $fieldDescription->method('getAssociationAdmin')->willReturn($admin); + $admin->method('getNewInstance')->willReturn($model); // NEXT_MAJOR: Use only FQCNs when dropping support for Symfony 2.8 $modelTypes = [ @@ -110,6 +112,7 @@ public function testDefaultOptionsForSonataFormTypes() $this->assertSame($modelClass, $options['data_class']); $this->assertFalse($options['btn_add']); $this->assertFalse($options['delete']); + $this->assertSame($model, $options['empty_data']()); } // collection type @@ -121,6 +124,7 @@ public function testDefaultOptionsForSonataFormTypes() $this->assertTrue($options['modifiable']); $this->assertSame($fieldDescription, $options['type_options']['sonata_field_description']); $this->assertSame($modelClass, $options['type_options']['data_class']); + $this->assertSame($model, $options['type_options']['empty_data']()); } }