Skip to content

Commit be62015

Browse files
Merge branch '3.1' into 3.2
* 3.1: (28 commits) Fix merge [Validator] add class name to the cache key [Serializer] Remove AbstractObjectNormalizer::isAttributeToNormalize Throw less misleading exception when property access not found [Twig] Fix deprecations with Twig 1.29 Fixed typo [FrameworkBundle] Removed the kernel.debug parameter from the cache pool namespace seed Fix email address fix the docblock in regard to the role argument Don't use the "app" global variable in the profiler [VarDumper] fix tests when xdebug is enabled Fix merge FIXED NON EXISTING TYPE DECLARATION [Cache] Fix dumping SplDoublyLinkedList iter mode [Console] fixed PHP7 Errors when not using Dispatcher Regression test for missing controller arguments (3.1) Regression test for missing controller arguments fix a test checking for a value [Form][DX] FileType "multiple" fixes fixed CS ...
2 parents 925ad69 + 7661d05 commit be62015

File tree

2 files changed

+63
-5
lines changed

2 files changed

+63
-5
lines changed

Extension/Core/Type/FileType.php

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,37 @@
1212
namespace Symfony\Component\Form\Extension\Core\Type;
1313

1414
use Symfony\Component\Form\AbstractType;
15+
use Symfony\Component\Form\FormBuilderInterface;
16+
use Symfony\Component\Form\FormEvent;
17+
use Symfony\Component\Form\FormEvents;
1518
use Symfony\Component\Form\FormInterface;
1619
use Symfony\Component\Form\FormView;
20+
use Symfony\Component\OptionsResolver\Options;
1721
use Symfony\Component\OptionsResolver\OptionsResolver;
1822

1923
class FileType extends AbstractType
2024
{
25+
/**
26+
* {@inheritdoc}
27+
*/
28+
public function buildForm(FormBuilderInterface $builder, array $options)
29+
{
30+
if ($options['multiple']) {
31+
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
32+
$form = $event->getForm();
33+
$data = $event->getData();
34+
35+
// submitted data for an input file (not required) without choosing any file
36+
if (array(null) === $data) {
37+
$emptyData = $form->getConfig()->getEmptyData();
38+
39+
$data = is_callable($emptyData) ? call_user_func($emptyData, $form, $data) : $emptyData;
40+
$event->setData($data);
41+
}
42+
});
43+
}
44+
}
45+
2146
/**
2247
* {@inheritdoc}
2348
*/
@@ -39,20 +64,26 @@ public function buildView(FormView $view, FormInterface $form, array $options)
3964
*/
4065
public function finishView(FormView $view, FormInterface $form, array $options)
4166
{
42-
$view
43-
->vars['multipart'] = true
44-
;
67+
$view->vars['multipart'] = true;
4568
}
4669

4770
/**
4871
* {@inheritdoc}
4972
*/
5073
public function configureOptions(OptionsResolver $resolver)
5174
{
75+
$dataClass = function (Options $options) {
76+
return $options['multiple'] ? null : 'Symfony\Component\HttpFoundation\File\File';
77+
};
78+
79+
$emptyData = function (Options $options) {
80+
return $options['multiple'] ? array() : null;
81+
};
82+
5283
$resolver->setDefaults(array(
5384
'compound' => false,
54-
'data_class' => 'Symfony\Component\HttpFoundation\File\File',
55-
'empty_data' => null,
85+
'data_class' => $dataClass,
86+
'empty_data' => $emptyData,
5687
'multiple' => false,
5788
));
5889
}

Tests/Extension/Core/Type/FileTypeTest.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,33 @@ public function testSubmitEmpty()
4444
$this->assertNull($form->getData());
4545
}
4646

47+
public function testSubmitEmptyMultiple()
48+
{
49+
$form = $this->factory->createBuilder('Symfony\Component\Form\Extension\Core\Type\FileType', null, array(
50+
'multiple' => true,
51+
))->getForm();
52+
53+
// submitted data when an input file is uploaded without choosing any file
54+
$form->submit(array(null));
55+
56+
$this->assertSame(array(), $form->getData());
57+
}
58+
59+
public function testSetDataMultiple()
60+
{
61+
$form = $this->factory->createBuilder('Symfony\Component\Form\Extension\Core\Type\FileType', null, array(
62+
'multiple' => true,
63+
))->getForm();
64+
65+
$data = array(
66+
$this->createUploadedFileMock('abcdef', 'first.jpg', true),
67+
$this->createUploadedFileMock('zyxwvu', 'second.jpg', true),
68+
);
69+
70+
$form->setData($data);
71+
$this->assertSame($data, $form->getData());
72+
}
73+
4774
public function testSubmitMultiple()
4875
{
4976
$form = $this->factory->createBuilder('Symfony\Component\Form\Extension\Core\Type\FileType', null, array(

0 commit comments

Comments
 (0)