From a563ab3caf5cc91bf497a3e8ff3174a2fdd7f29b Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Sun, 6 Mar 2022 15:19:09 +0100 Subject: [PATCH] add ability to rename file in file manager --- .../FileManagerAdminController.php | 77 ++++++++++++++++++- core/FileManager/FsFileManager.php | 24 ++++++ core/Form/FileManager/FileRenameType.php | 40 ++++++++++ core/Resources/translations/messages.fr.yaml | 3 + .../views/file_manager/file_rename.html.twig | 33 ++++++++ .../views/file_manager/info.html.twig | 22 ++++-- 6 files changed, 190 insertions(+), 9 deletions(-) create mode 100644 core/Form/FileManager/FileRenameType.php create mode 100644 core/Resources/views/file_manager/file_rename.html.twig diff --git a/core/Controller/FileManager/FileManagerAdminController.php b/core/Controller/FileManager/FileManagerAdminController.php index 61194c7..ff768b2 100644 --- a/core/Controller/FileManager/FileManagerAdminController.php +++ b/core/Controller/FileManager/FileManagerAdminController.php @@ -7,6 +7,7 @@ use App\Core\FileManager\FsFileManager; use App\Core\Form\FileManager\DirectoryCreateType; use App\Core\Form\FileManager\DirectoryRenameType; use App\Core\Form\FileManager\FileInformationType; +use App\Core\Form\FileManager\FileRenameType; use App\Core\Form\FileManager\FileUploadType; use App\Core\Manager\EntityManager; use Symfony\Component\HttpFoundation\Request; @@ -204,7 +205,9 @@ class FileManagerAdminController extends AdminController ]); } - $form = $this->createForm(DirectoryRenameType::class); + $form = $this->createForm(DirectoryRenameType::class, [ + 'name' => $splInfo->getFilename(), + ]); if ($request->isMethod('POST')) { $form->handleRequest($request); @@ -252,6 +255,78 @@ class FileManagerAdminController extends AdminController ]); } + /** + * @Route("/file/rename/{ajax}", name="admin_file_manager_file_rename", methods={"GET", "POST"}) + */ + public function fileRename(FsFileManager $manager, Request $request, TranslatorInterface $translator, bool $ajax = false): Response + { + $splInfo = $manager->getSplInfo($request->query->get('file')); + + if (!$splInfo) { + throw $this->createNotFoundException(); + } + + if ($splInfo->isDir()) { + throw $this->createNotFoundException(); + } + + if ($manager->isLocked($request->query->get('file'))) { + return $this->render('@Core/file_manager/file_rename.html.twig', [ + 'locked' => true, + ]); + } + + $form = $this->createForm(FileRenameType::class, [ + 'name' => preg_replace(sprintf('/\.%s/', $splInfo->getExtension()), '', $splInfo->getFilename()), + ]); + + if ($request->isMethod('POST')) { + $form->handleRequest($request); + + if ($form->isValid()) { + $status = $manager->renameFile($form->get('name')->getData(), $request->query->get('file')); + + if (true === $status) { + if (!$request->isXmlHttpRequest()) { + $this->addFlash('success', 'File renamed.'); + } else { + return $this->json([ + '_error' => 0, + '_message' => $translator->trans('File renamed.'), + '_level' => 'success', + '_dispatch' => 'file_manager.file.rename.success', + ]); + } + } else { + if (!$request->isXmlHttpRequest()) { + $this->addFlash('warning', 'File not renamed.'); + } else { + return $this->json([ + '_error' => 1, + '_message' => $translator->trans('File not renamed.'), + '_level' => 'warning', + '_dispatch' => 'file_manager.file.rename.error', + ]); + } + } + } else { + $this->addFlash('warning', 'Unauthorized char(s).'); + } + + return $this->redirectToRoute('admin_file_manager_index', [ + 'path' => $splInfo->getRelativePath(), + ]); + } + + return $this->render('@Core/file_manager/file_rename.html.twig', [ + 'form' => $form->createView(), + 'file' => $request->query->get('file'), + 'exention' => $splInfo->getExtension(), + 'locked' => false, + 'ajax' => $ajax, + ]); + } + /** * @Route("/upload/{ajax}", name="admin_file_manager_upload", options={"expose"=true}, methods={"GET", "POST"}) */ diff --git a/core/FileManager/FsFileManager.php b/core/FileManager/FsFileManager.php index f27e925..e4a1751 100644 --- a/core/FileManager/FsFileManager.php +++ b/core/FileManager/FsFileManager.php @@ -199,6 +199,30 @@ class FsFileManager return true; } + public function renameFile(string $name, string $path, bool $keepExtension = true): bool + { + $file = $this->getSplInfo($path); + + if (!$file || $this->isLocked($path)) { + return false; + } + + $filesystem = new Filesystem(); + $newPath = $file->getPath().'/'.$this->normalizePath($name); + + if ($keepExtension && $file->getExtension()) { + $newPath .= sprintf('.%s', $file->getExtension()); + } + + if ($filesystem->exists($newPath)) { + return false; + } + + $filesystem->rename($file->getPathName(), $newPath); + + return true; + } + public function upload($files, string $path, array $fullPaths = []) { if ($files instanceof UploadedFile) { diff --git a/core/Form/FileManager/FileRenameType.php b/core/Form/FileManager/FileRenameType.php new file mode 100644 index 0000000..b2a2ea5 --- /dev/null +++ b/core/Form/FileManager/FileRenameType.php @@ -0,0 +1,40 @@ +add( + 'name', + TextType::class, + [ + 'label' => 'Name', + 'required' => true, + 'attr' => [ + ], + 'constraints' => [ + new Regex([ + 'pattern' => '#['.preg_quote('\\/?%*:|"<>').'\t\n\r]+#', + 'match' => false, + ]), + new NotBlank(), + ], + ] + ); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + ]); + } +} diff --git a/core/Resources/translations/messages.fr.yaml b/core/Resources/translations/messages.fr.yaml index f9fc7f6..c2f6d2b 100644 --- a/core/Resources/translations/messages.fr.yaml +++ b/core/Resources/translations/messages.fr.yaml @@ -192,8 +192,11 @@ "Directory not created.": "Répertoire non créé." "Directory renamed.": "Répertoire renommé." "Directory not renamed.": "Répertoire non renommé." +"File renamed.": "Fichier renommé." +"File not renamed.": "Fichier non renommé." "Rename": "Renommer" "Rename directory": "Renommer le répertoire" +"Rename file": "Renommer le fichier" "New directory": "Nouveau répertoire" "Preview": "Aperçu" "Insert": "Insérer" diff --git a/core/Resources/views/file_manager/file_rename.html.twig b/core/Resources/views/file_manager/file_rename.html.twig new file mode 100644 index 0000000..d55b3d2 --- /dev/null +++ b/core/Resources/views/file_manager/file_rename.html.twig @@ -0,0 +1,33 @@ + diff --git a/core/Resources/views/file_manager/info.html.twig b/core/Resources/views/file_manager/info.html.twig index 7ceb0a7..816896f 100644 --- a/core/Resources/views/file_manager/info.html.twig +++ b/core/Resources/views/file_manager/info.html.twig @@ -134,11 +134,13 @@ {% if context == 'tinymce' %} {% if not isLocked %} {% if splInfo.isDir %} - {% else %} - + {% endif %} {% else %}
@@ -149,23 +151,27 @@ {% endif %}
- + {% if splInfo.isFile %} - - + + {% endif %}
{% else %}
{% if not isLocked %} - {% if splInfo.isDir %} - + {% else %} + {% endif %} @@ -176,7 +182,7 @@ {% endif %} {% if splInfo.type == 'file' %} - + {{ 'Download'|trans }} {% endif %}