<?php
namespace App\Form\Common;
use Nellapp\Bundle\SDKBundle\Uploader\Service\NellappFileService;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class CustomFileType extends AbstractType
{
public function __construct(
private ContainerInterface $container,
private NellappFileService $nellappFileService,
)
{
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('filename', TextType::class, [
'required' => true,
'attr' => [
'data-custom-file-input-fileName' => true
]
])
->add('originalFilename', TextType::class, [
'required' => true,
'attr' => [
'data-custom-file-input-originalFilename' => true
]
])
->add('file', FileType::class, [
'mapped' => false,
'label' => 'Importer un fichier (facultatif)',
'required' => true,
'attr' => [
'multiple' => false,
'accept' => implode(',', array_keys($options['mime_types'])),
'data-custom-file-input-file' => true,
'data-custom-file-original-url' => $builder->getData() ? $builder->getData()->getOriginalFileName() : null
]
]);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'upload_endpoint' => null,
'mime_types' => [],
'max_size' => null,
]);
$resolver->setRequired('data_class');
$resolver->setNormalizer('attr', function (Options $options, array $value): array {
if ($options['upload_endpoint'] != null) {
$helper = $this->container->get('oneup_uploader.templating.uploader_helper');
return array_merge(
$value,
[
'data-custom-file-uploader' => true,
'data-script-handled' => "false",
'data-custom-file-uploader-endpoint' => $helper->endpoint($options['upload_endpoint']),
]
);
}
return $value;
});
$resolver->setNormalizer('max_size', function(Options $options, ?int $value) {
$class = $options['data_class'];
$config = $this->nellappFileService->getConfig($class::getUploaderAlias());
return $config['maxSize'] ?? null;
});
$resolver->setNormalizer('mime_types', function(Options $options, array $value) {
$class = $options['data_class'];
$config = $this->nellappFileService->getConfig($class::getUploaderAlias());
return $config['mimeTypes'] ?? [];
});
// Options used to render the list of extensions and the max size accepted by the uploader. Should be linked with the OneUpUploader
$resolver->setRequired('extensions');
$resolver->setAllowedTypes('extensions', 'string[]');
}
public function buildView(FormView $view, FormInterface $form, array $options): void
{
$extensions = [];
foreach ($options['extensions'] as $extension) {
if (!in_array($extension, $extensions)) {
$extensions[] = $extension;
}
}
$view->vars['file_max_size'] = $options['max_size'];
$view->vars['file_allowed_extensions'] = $extensions;
}
public function getBlockPrefix(): string
{
return 'upload_file';
}
}