RepeatedType should always have inner types mapped

This commit is contained in:
Artem Lopata 2020-04-10 13:43:00 +02:00
parent 932a4f86ed
commit 728cd66a13
3 changed files with 64 additions and 2 deletions

View File

@ -31,13 +31,16 @@ class RepeatedType extends AbstractType
$options['options']['error_bubbling'] = $options['error_bubbling']; $options['options']['error_bubbling'] = $options['error_bubbling'];
} }
// children fields must always be mapped
$defaultOptions = ['mapped' => true];
$builder $builder
->addViewTransformer(new ValueToDuplicatesTransformer([ ->addViewTransformer(new ValueToDuplicatesTransformer([
$options['first_name'], $options['first_name'],
$options['second_name'], $options['second_name'],
])) ]))
->add($options['first_name'], $options['type'], array_merge($options['options'], $options['first_options'])) ->add($options['first_name'], $options['type'], array_merge($options['options'], $options['first_options'], $defaultOptions))
->add($options['second_name'], $options['type'], array_merge($options['options'], $options['second_options'])) ->add($options['second_name'], $options['type'], array_merge($options['options'], $options['second_options'], $defaultOptions))
; ;
} }

View File

@ -12,6 +12,7 @@
namespace Symfony\Component\Form\Tests\Extension\Core\Type; namespace Symfony\Component\Form\Tests\Extension\Core\Type;
use Symfony\Component\Form\Form; use Symfony\Component\Form\Form;
use Symfony\Component\Form\Tests\Fixtures\NotMappedType;
class RepeatedTypeTest extends BaseTypeTest class RepeatedTypeTest extends BaseTypeTest
{ {
@ -78,6 +79,41 @@ class RepeatedTypeTest extends BaseTypeTest
$this->assertFalse($form['second']->isRequired()); $this->assertFalse($form['second']->isRequired());
} }
public function testMappedOverridesDefault()
{
$form = $this->factory->create(NotMappedType::class);
$this->assertFalse($form->getConfig()->getMapped());
$form = $this->factory->create(static::TESTED_TYPE, null, [
'type' => NotMappedType::class,
]);
$this->assertTrue($form['first']->getConfig()->getMapped());
$this->assertTrue($form['second']->getConfig()->getMapped());
}
/**
* @dataProvider notMappedConfigurationKeys
*/
public function testNotMappedInnerIsOverridden($configurationKey)
{
$form = $this->factory->create(static::TESTED_TYPE, null, [
'type' => TextTypeTest::TESTED_TYPE,
$configurationKey => ['mapped' => false],
]);
$this->assertTrue($form['first']->getConfig()->getMapped());
$this->assertTrue($form['second']->getConfig()->getMapped());
}
public function notMappedConfigurationKeys()
{
return [
['first_options'],
['second_options'],
];
}
public function testSetInvalidOptions() public function testSetInvalidOptions()
{ {
$this->expectException('Symfony\Component\OptionsResolver\Exception\InvalidOptionsException'); $this->expectException('Symfony\Component\OptionsResolver\Exception\InvalidOptionsException');

View File

@ -0,0 +1,23 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Form\Tests\Fixtures;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;
class NotMappedType extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefault('mapped', false);
}
}