diff --git a/core/Controller/FileManager/FileManagerAdminController.php b/core/Controller/FileManager/FileManagerAdminController.php index ec7677b..e9fb422 100644 --- a/core/Controller/FileManager/FileManagerAdminController.php +++ b/core/Controller/FileManager/FileManagerAdminController.php @@ -275,7 +275,20 @@ class FileManagerAdminController extends AdminController $form->handleRequest($request); if ($form->isValid()) { - $manager->upload($form->get('files')->getData(), $request->query->get('file')); + if ($form->get('files')->getData()) { + $manager->upload( + $form->get('files')->getData(), + $request->query->get('file') + ); + } + + if ($form->get('directory')->getData()) { + $manager->upload( + $form->get('directory')->getData(), + $request->query->get('file'), + $_FILES['file_upload']['full_path']['directory'] ?? [] + ); + } if (!$request->isXmlHttpRequest()) { $this->addFlash('success', 'Files uploaded.'); diff --git a/core/FileManager/FsFileManager.php b/core/FileManager/FsFileManager.php index f2f77ea..57d1d74 100644 --- a/core/FileManager/FsFileManager.php +++ b/core/FileManager/FsFileManager.php @@ -195,14 +195,20 @@ class FsFileManager return true; } - public function upload($files, string $path) + public function upload($files, string $path, array $fullPaths = []) { if ($files instanceof UploadedFile) { $files = [$files]; } - foreach ($files as $file) { - $this->uploadHandler->handleForm($file, $this->path.'/'.$path, null, true); + foreach ($files as $key => $file) { + $directory = $this->path.'/'.$path; + + if (isset($fullPaths[$key])) { + $directory .= '/'.trim(dirname($fullPaths[$key]), '/'); + } + + $this->uploadHandler->handleForm($file, $directory, null, true); } } diff --git a/core/Form/FileManager/FileUploadType.php b/core/Form/FileManager/FileUploadType.php index fec3fd0..b24bbcc 100644 --- a/core/Form/FileManager/FileUploadType.php +++ b/core/Form/FileManager/FileUploadType.php @@ -18,7 +18,7 @@ class FileUploadType extends AbstractType FileType::class, [ 'label' => 'Files', - 'required' => true, + 'required' => false, 'multiple' => true, 'attr' => [ ], @@ -31,6 +31,28 @@ class FileUploadType extends AbstractType ], ] ); + + $builder->add( + 'directory', + FileType::class, + [ + 'label' => 'Directory', + 'required' => false, + 'multiple' => true, + 'attr' => [ + 'webkitdirectory' => '', + 'mozdirectory' => '', + 'directory' => '', + ], + 'constraints' => [ + new All([ + new File([ + 'mimeTypes' => $options['mimes'], + ]), + ]), + ], + ] + ); } public function configureOptions(OptionsResolver $resolver) diff --git a/core/Resources/translations/messages.fr.yaml b/core/Resources/translations/messages.fr.yaml index 780f9e3..6a23fc8 100644 --- a/core/Resources/translations/messages.fr.yaml +++ b/core/Resources/translations/messages.fr.yaml @@ -192,3 +192,4 @@ "Attributes": "Attributs" "Choose": "Choisir" "Associated": "Associé(e)" +"Directory": "Répertoire"