12
12
namespace Symfony \Component \Form \Extension \Core \Type ;
13
13
14
14
use Symfony \Component \Form \AbstractType ;
15
+ use Symfony \Component \Form \FormBuilderInterface ;
16
+ use Symfony \Component \Form \FormEvent ;
17
+ use Symfony \Component \Form \FormEvents ;
15
18
use Symfony \Component \Form \FormInterface ;
16
19
use Symfony \Component \Form \FormView ;
20
+ use Symfony \Component \OptionsResolver \Options ;
17
21
use Symfony \Component \OptionsResolver \OptionsResolver ;
18
22
19
23
class FileType extends AbstractType
20
24
{
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
+
21
46
/**
22
47
* {@inheritdoc}
23
48
*/
@@ -39,20 +64,26 @@ public function buildView(FormView $view, FormInterface $form, array $options)
39
64
*/
40
65
public function finishView (FormView $ view , FormInterface $ form , array $ options )
41
66
{
42
- $ view
43
- ->vars ['multipart ' ] = true
44
- ;
67
+ $ view ->vars ['multipart ' ] = true ;
45
68
}
46
69
47
70
/**
48
71
* {@inheritdoc}
49
72
*/
50
73
public function configureOptions (OptionsResolver $ resolver )
51
74
{
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
+
52
83
$ resolver ->setDefaults (array (
53
84
'compound ' => false ,
54
- 'data_class ' => ' Symfony\Component\HttpFoundation\File\File ' ,
55
- 'empty_data ' => null ,
85
+ 'data_class ' => $ dataClass ,
86
+ 'empty_data ' => $ emptyData ,
56
87
'multiple ' => false ,
57
88
));
58
89
}
0 commit comments