src/Form/Common/CustomFileType.php line 72

Open in your IDE?
  1. <?php
  2. namespace App\Form\Common;
  3. use Nellapp\Bundle\SDKBundle\Uploader\Service\NellappFileService;
  4. use Symfony\Component\DependencyInjection\ContainerInterface;
  5. use Symfony\Component\Form\AbstractType;
  6. use Symfony\Component\Form\Extension\Core\Type\FileType;
  7. use Symfony\Component\Form\Extension\Core\Type\TextType;
  8. use Symfony\Component\Form\FormBuilderInterface;
  9. use Symfony\Component\Form\FormInterface;
  10. use Symfony\Component\Form\FormView;
  11. use Symfony\Component\HttpFoundation\File\UploadedFile;
  12. use Symfony\Component\OptionsResolver\Options;
  13. use Symfony\Component\OptionsResolver\OptionsResolver;
  14. class CustomFileType extends AbstractType
  15. {
  16. public function __construct(
  17. private ContainerInterface $container,
  18. private NellappFileService $nellappFileService,
  19. )
  20. {
  21. }
  22. public function buildForm(FormBuilderInterface $builder, array $options): void
  23. {
  24. $builder
  25. ->add('filename', TextType::class, [
  26. 'required' => true,
  27. 'attr' => [
  28. 'data-custom-file-input-fileName' => true
  29. ]
  30. ])
  31. ->add('originalFilename', TextType::class, [
  32. 'required' => true,
  33. 'attr' => [
  34. 'data-custom-file-input-originalFilename' => true
  35. ]
  36. ])
  37. ->add('file', FileType::class, [
  38. 'mapped' => false,
  39. 'label' => 'Importer un fichier (facultatif)',
  40. 'required' => true,
  41. 'attr' => [
  42. 'multiple' => false,
  43. 'accept' => implode(',', array_keys($options['mime_types'])),
  44. 'data-custom-file-input-file' => true,
  45. 'data-custom-file-original-url' => $builder->getData() ? $builder->getData()->getOriginalFileName() : null
  46. ]
  47. ]);
  48. }
  49. public function configureOptions(OptionsResolver $resolver): void
  50. {
  51. $resolver->setDefaults([
  52. 'upload_endpoint' => null,
  53. 'mime_types' => [],
  54. 'max_size' => null,
  55. ]);
  56. $resolver->setRequired('data_class');
  57. $resolver->setNormalizer('attr', function (Options $options, array $value): array {
  58. if ($options['upload_endpoint'] != null) {
  59. $helper = $this->container->get('oneup_uploader.templating.uploader_helper');
  60. $value = array_merge(
  61. $value,
  62. [
  63. 'data-custom-file-uploader' => true,
  64. 'data-script-handled' => "false",
  65. 'data-custom-file-uploader-endpoint' => $helper->endpoint($options['upload_endpoint']),
  66. ]
  67. );
  68. }
  69. if ($options['max_size'] !== null) {
  70. $value['data-custom-file-max-size'] = $options['max_size'];
  71. $value['data-custom-file-max-size-label'] = $this->nellappFileService->formatSize($options['max_size']);
  72. }
  73. return $value;
  74. });
  75. $resolver->setNormalizer('max_size', function(Options $options, ?int $value) {
  76. $class = $options['data_class'];
  77. $config = $this->nellappFileService->getConfig($class::getUploaderAlias());
  78. // Files over PHP upload_max_filesize / post_max_size never reach the uploader, so the real limit is the lowest one
  79. $phpMaxSize = (int) UploadedFile::getMaxFilesize();
  80. $maxSize = $config['maxsize'] ?? null;
  81. return $maxSize !== null ? min($maxSize, $phpMaxSize) : $phpMaxSize;
  82. });
  83. $resolver->setNormalizer('mime_types', function(Options $options, array $value) {
  84. $class = $options['data_class'];
  85. $config = $this->nellappFileService->getConfig($class::getUploaderAlias());
  86. return $config['mimeTypes'] ?? [];
  87. });
  88. // Options used to render the list of extensions and the max size accepted by the uploader. Should be linked with the OneUpUploader
  89. $resolver->setRequired('extensions');
  90. $resolver->setAllowedTypes('extensions', 'string[]');
  91. }
  92. public function buildView(FormView $view, FormInterface $form, array $options): void
  93. {
  94. $extensions = [];
  95. foreach ($options['extensions'] as $extension) {
  96. if (!in_array($extension, $extensions)) {
  97. $extensions[] = $extension;
  98. }
  99. }
  100. $view->vars['file_max_size'] = $options['max_size'];
  101. $view->vars['file_allowed_extensions'] = $extensions;
  102. }
  103. public function getBlockPrefix(): string
  104. {
  105. return 'upload_file';
  106. }
  107. }