[Form][DX] FileType "multiple" fixes
This commit is contained in:
parent
0221ffcb8f
commit
36b7ba64f4
@ -12,12 +12,37 @@
|
|||||||
namespace Symfony\Component\Form\Extension\Core\Type;
|
namespace Symfony\Component\Form\Extension\Core\Type;
|
||||||
|
|
||||||
use Symfony\Component\Form\AbstractType;
|
use Symfony\Component\Form\AbstractType;
|
||||||
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
use Symfony\Component\Form\FormEvent;
|
||||||
|
use Symfony\Component\Form\FormEvents;
|
||||||
use Symfony\Component\Form\FormInterface;
|
use Symfony\Component\Form\FormInterface;
|
||||||
use Symfony\Component\Form\FormView;
|
use Symfony\Component\Form\FormView;
|
||||||
|
use Symfony\Component\OptionsResolver\Options;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
|
|
||||||
class FileType extends AbstractType
|
class FileType extends AbstractType
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||||
|
{
|
||||||
|
if ($options['multiple']) {
|
||||||
|
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
|
||||||
|
$form = $event->getForm();
|
||||||
|
$data = $event->getData();
|
||||||
|
|
||||||
|
// submitted data for an input file (not required) without choosing any file
|
||||||
|
if (array(null) === $data) {
|
||||||
|
$emptyData = $form->getConfig()->getEmptyData();
|
||||||
|
|
||||||
|
$data = is_callable($emptyData) ? call_user_func($emptyData, $form, $data) : $emptyData;
|
||||||
|
$event->setData($data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
@ -39,9 +64,7 @@ class FileType extends AbstractType
|
|||||||
*/
|
*/
|
||||||
public function finishView(FormView $view, FormInterface $form, array $options)
|
public function finishView(FormView $view, FormInterface $form, array $options)
|
||||||
{
|
{
|
||||||
$view
|
$view->vars['multipart'] = true;
|
||||||
->vars['multipart'] = true
|
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -49,10 +72,18 @@ class FileType extends AbstractType
|
|||||||
*/
|
*/
|
||||||
public function configureOptions(OptionsResolver $resolver)
|
public function configureOptions(OptionsResolver $resolver)
|
||||||
{
|
{
|
||||||
|
$dataClass = function (Options $options) {
|
||||||
|
return $options['multiple'] ? null : 'Symfony\Component\HttpFoundation\File\File';
|
||||||
|
};
|
||||||
|
|
||||||
|
$emptyData = function (Options $options) {
|
||||||
|
return $options['multiple'] ? array() : null;
|
||||||
|
};
|
||||||
|
|
||||||
$resolver->setDefaults(array(
|
$resolver->setDefaults(array(
|
||||||
'compound' => false,
|
'compound' => false,
|
||||||
'data_class' => 'Symfony\Component\HttpFoundation\File\File',
|
'data_class' => $dataClass,
|
||||||
'empty_data' => null,
|
'empty_data' => $emptyData,
|
||||||
'multiple' => false,
|
'multiple' => false,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
@ -44,6 +44,33 @@ class FileTypeTest extends \Symfony\Component\Form\Test\TypeTestCase
|
|||||||
$this->assertNull($form->getData());
|
$this->assertNull($form->getData());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testSubmitEmptyMultiple()
|
||||||
|
{
|
||||||
|
$form = $this->factory->createBuilder('file', null, array(
|
||||||
|
'multiple' => true,
|
||||||
|
))->getForm();
|
||||||
|
|
||||||
|
// submitted data when an input file is uploaded without choosing any file
|
||||||
|
$form->submit(array(null));
|
||||||
|
|
||||||
|
$this->assertSame(array(), $form->getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSetDataMultiple()
|
||||||
|
{
|
||||||
|
$form = $this->factory->createBuilder('file', null, array(
|
||||||
|
'multiple' => true,
|
||||||
|
))->getForm();
|
||||||
|
|
||||||
|
$data = array(
|
||||||
|
$this->createUploadedFileMock('abcdef', 'first.jpg', true),
|
||||||
|
$this->createUploadedFileMock('zyxwvu', 'second.jpg', true),
|
||||||
|
);
|
||||||
|
|
||||||
|
$form->setData($data);
|
||||||
|
$this->assertSame($data, $form->getData());
|
||||||
|
}
|
||||||
|
|
||||||
public function testSubmitMultiple()
|
public function testSubmitMultiple()
|
||||||
{
|
{
|
||||||
$form = $this->factory->createBuilder('file', null, array(
|
$form = $this->factory->createBuilder('file', null, array(
|
||||||
|
Reference in New Issue
Block a user