From 7d85d03ad5fa268358b5f815207f3931f1964c7b Mon Sep 17 00:00:00 2001 From: DeSwa Date: Tue, 12 Dec 2023 10:55:15 +0300 Subject: [PATCH 1/2] File Name Sanitizer / Slugger --- DependencyInjection/Configuration.php | 10 +++++ Helpers/FileManagerUploadHandler.php | 47 ++++++++++++++++++++- README.md | 1 + Resources/doc/book/1-basic-configuration.md | 31 ++++++++++++++ composer.json | 1 + 5 files changed, 89 insertions(+), 1 deletion(-) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index e76fff6..9a20e15 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -62,6 +62,16 @@ public function getConfigTreeBuilder(): TreeBuilder { ->end() ->booleanNode('override')->defaultValue(false)->end() ->end() + ->children() + ->arrayNode('filename_sanitizer') + ->children() + ->scalarNode('transformer')->end() + ->booleanNode('slugger')->end() + ->scalarNode('prepend')->end() + ->scalarNode('append')->end() + ->end() + ->end() + ->end() ->end() ->end() ->end() diff --git a/Helpers/FileManagerUploadHandler.php b/Helpers/FileManagerUploadHandler.php index 6d8a394..62daf22 100644 --- a/Helpers/FileManagerUploadHandler.php +++ b/Helpers/FileManagerUploadHandler.php @@ -4,10 +4,15 @@ namespace Artgris\Bundle\FileManagerBundle\Helpers; +use Symfony\Component\String\Slugger\AsciiSlugger; + class FileManagerUploadHandler extends UploadHandler { protected function get_unique_filename($file_path, $name, $size, $type, $error, - $index, $content_range) { + $index, $content_range) { + + $name = $this->set_filename_sanitizer($name); + if ($this->options['override']) { return $name; } @@ -29,4 +34,44 @@ protected function get_unique_filename($file_path, $name, $size, $type, $error, return $name; } + protected function set_filename_sanitizer($name): string + { + + if(!isset($this->options['filename_sanitizer']['slugger']) || $this->options['filename_sanitizer']['slugger'] !== true){ + return $name; + } + + $file_extension = pathinfo($name, PATHINFO_EXTENSION); + $new_file_name = str_replace('.' . $file_extension, '', $name); + + $slugger = new AsciiSlugger(); + + if (isset($this->options['filename_sanitizer']['prepend'])) { + $new_file_name = $slugger->slug($new_file_name)->prepend($this->options['filename_sanitizer']['prepend']); + } + + if (isset($this->options['filename_sanitizer']['append'])) { + $new_file_name = $slugger->slug($new_file_name)->append($this->options['filename_sanitizer']['append']); + } + + if (isset($this->options['filename_sanitizer']['transformer'])) { + $new_file_name = match ($this->options['filename_sanitizer']['transformer']) { + 'uppercase' => $slugger->slug($new_file_name)->upper(), + 'lowercase' => $slugger->slug($new_file_name)->lower(), + 'camel' => $slugger->slug($new_file_name)->camel(), + 'snake' => $slugger->slug($new_file_name)->snake(), + 'cameltitle' => $slugger->slug($new_file_name)->camel()->title(), + 'title' => $slugger->slug($new_file_name)->title(), + 'titleall' => $slugger->slug($new_file_name)->title(true), + 'folded' => $slugger->slug($new_file_name)->folded(), + default => $slugger->slug($new_file_name), + }; + } else { + $new_file_name = $slugger->slug($new_file_name); + } + + + return $new_file_name . "." . $file_extension; + } + } \ No newline at end of file diff --git a/README.md b/README.md index dcf7de7..a3c28b8 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ FileManager is a simple Multilingual File Manager Bundle for Symfony * Upload, delete (multiple), rename, download and sort files * Create, rename and delete folders * Manage **Public** and **Private** folders +* File Names **Sanitizer** / **Slugger** ([Look Documentation](Resources/doc/book/1-basic-configuration.md)) * **Multilingual** (English, French, Catalan, German, Spanish, Dutch, Portuguese, Romanian, Russian, Turkish) * **Fully responsive design** (bootstrap) * Multilple view modes (list, thumbnail, with tree or not) diff --git a/Resources/doc/book/1-basic-configuration.md b/Resources/doc/book/1-basic-configuration.md index 66bc84b..2275f6d 100644 --- a/Resources/doc/book/1-basic-configuration.md +++ b/Resources/doc/book/1-basic-configuration.md @@ -313,6 +313,37 @@ artgris_file_manager: override: true ``` +#### File Name Sanitizer / Slugger +Change File Name with Slugger on upload file ( uses [Symfony AsciiSlugger Interface](https://symfony.com/doc/current/components/string.html) ) +> It is recommended to override 'true' + +**Be Sure installed Symfony/String** +> composer require symfony/string + +```yml +artgris_file_manager: + conf: + public: + dir: '%kernel.project_dir%/public/uploads' + upload: + override: true + # image_versions: {'thumbnail': {crop: true, max_width: 10, max_height: 10}} + filename_sanitizer: + slugger: true + transformer: 'none' # none, uppercase, lowercase, camel, snake, cameltitle, title, titleall, folded + prepend: '' # File name rename to : image.jpg -> 2024_image.jpg + append: '' # # File name rename to : image.jpg -> image_2025.jpg +``` ------------------------------------------------------------------------------- + +| Option | Type | Value | Example | +|:--------------|:---------:|:---------:|:-----------------------------------------------------| +| `slugger` | `Boolean` | | Fav logo śćąóź∆.jpg **rename to** Fav-logo-scaoz.jpg | +| `transformer` | `String` | lowercase | **fav-logo-scaoz.jpg** | +| `prepend` | `String` | 2024- | **2024-fav-logo-scaoz.jpg** | +| `append` | `String` | -2025 | **fav-logo-scaoz-2025.jpg** | + +>If prepend and append parameters will be blank, it wont add any strings. + [Chapter 2 - Service Configuration](2-service-configuration.md) → diff --git a/composer.json b/composer.json index fc2a25a..d1fb89a 100644 --- a/composer.json +++ b/composer.json @@ -25,6 +25,7 @@ "symfony/form": "^6.0||^7.0", "symfony/framework-bundle": "^6.0||^7.0", "symfony/mime": "^6.0||^7.0", + "symfony/string": "^6.0||^7.0", "symfony/translation": "^6.0||^7.0", "symfony/twig-bridge": "^6.0||^7.0", "symfony/twig-bundle": "^6.0||^7.0", From 23b904e0664ddb0d6a3742c163d9852eb82af66f Mon Sep 17 00:00:00 2001 From: DeSwa Date: Sat, 31 Aug 2024 12:12:09 +0300 Subject: [PATCH 2/2] [New Future] Remember Last Path --- Controller/ManagerController.php | 43 ++++++++++++++++++++- DependencyInjection/Configuration.php | 1 + Helpers/FileManager.php | 3 +- Resources/doc/book/1-basic-configuration.md | 17 ++++++++ composer.json | 3 +- 5 files changed, 64 insertions(+), 3 deletions(-) diff --git a/Controller/ManagerController.php b/Controller/ManagerController.php index 3da00fd..5b9dfab 100644 --- a/Controller/ManagerController.php +++ b/Controller/ManagerController.php @@ -35,6 +35,7 @@ use Symfony\Component\Routing\RouterInterface; use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Contracts\Translation\TranslatorInterface; +use Symfony\Component\HttpFoundation\Session\SessionInterface; use Exception; /** @@ -51,12 +52,20 @@ public function __construct(private FilemanagerService $filemanagerService, priv } #[Route('/', name: 'file_manager')] - public function indexAction(Request $request, FileTypeService $fileTypeService): JsonResponse|Response { + public function indexAction(Request $request, FileTypeService $fileTypeService, SessionInterface $session): JsonResponse|Response { $queryParameters = $request->query->all(); $isJson = $request->get('json'); if ($isJson) { unset($queryParameters['json']); } + + // Remember Last Path - 31.08.2024 + if(isset($this->getParameter('artgris_file_manager')['conf'][$queryParameters['conf']]['remember_last_path']) + && $this->getParameter('artgris_file_manager')['conf'][$queryParameters['conf']]['remember_last_path'] + ){ + $queryParameters = $this->rememberLastPath($queryParameters, $session); + } + $fileManager = $this->newFileManager($queryParameters); // Folder search @@ -458,4 +467,36 @@ protected function dispatch(string $eventName, array $arguments = []) { $event = new GenericEvent($subject, $arguments); $this->dispatcher->dispatch($event, $eventName); } + + private function rememberLastPath(array $queryParameters, $session): array + { + // GET Last Path + if ($session->has('file_manager_last_path') && empty($queryParameters['route'])) { + + $fileSystem = new Filesystem(); + $last_path = $this->getParameter('artgris_file_manager')['conf'][$queryParameters['conf']]['dir'].$session->get('file_manager_last_path'); + $exist = $fileSystem->exists($last_path); + + if (false === $exist) { + $queryParameters['route'] = '/'; // if directory not exist return home path and clear session + if ($session->has('file_manager_last_path')) { + $session->remove('file_manager_last_path'); + } + } else { + $queryParameters['route'] = $session->get('file_manager_last_path'); + } + } + + // SET Last Path + if(isset($queryParameters['route'])){ + if ($session->has('file_manager_last_path')) { + $session->remove('file_manager_last_path'); + } + $session->set('file_manager_last_path', $queryParameters['route']); + } else { + $queryParameters['route'] = '/'; + } + + return $queryParameters; + } } diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 9a20e15..900a210 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -32,6 +32,7 @@ public function getConfigTreeBuilder(): TreeBuilder { ->children() ->scalarNode('dir')->end() ->enumNode('type')->values(['file', 'image', 'media'])->end() + ->booleanNode('remember_last_path')->defaultValue(true)->end() ->booleanNode('tree')->end() ->booleanNode('show_file_count')->defaultValue(true)->end() ->scalarNode('root_name')->defaultValue(null)->end() diff --git a/Helpers/FileManager.php b/Helpers/FileManager.php index 26ffd3b..60887eb 100644 --- a/Helpers/FileManager.php +++ b/Helpers/FileManager.php @@ -74,7 +74,8 @@ public function getParent(): ?string if (\DIRECTORY_SEPARATOR !== $parentRoute) { $queryParentParameters['route'] = \dirname($this->getRoute()); } else { - unset($queryParentParameters['route']); +// unset($queryParentParameters['route']); + $queryParentParameters['route'] = '/'; } $parentRoute = $this->router->generate('file_manager', $queryParentParameters); diff --git a/Resources/doc/book/1-basic-configuration.md b/Resources/doc/book/1-basic-configuration.md index 7828cc6..05f958e 100644 --- a/Resources/doc/book/1-basic-configuration.md +++ b/Resources/doc/book/1-basic-configuration.md @@ -54,6 +54,23 @@ artgris_file_manager: >Browse the `/manager/?conf=private` URL to get access to this File Manager +## `remember_last_path` Last worked directory + +| Option | Type | Required | Default value | +| :--- |:---------:|:--------:|:-------------:| +| `remember_last_path` | `Boolean` | False | true | + +> Allows opening folders to the last working directory without clicking on them repeatedly +> +Example: + ```yml +artgris_file_manager: + conf: + default: + remember_last_path: true +``` + + ## `tree` Display Folder Tree | Option | Type | Required | Default value | | :--- |:--------:|:--------:|:--------:| diff --git a/composer.json b/composer.json index d1fb89a..9dee445 100644 --- a/composer.json +++ b/composer.json @@ -29,7 +29,8 @@ "symfony/translation": "^6.0||^7.0", "symfony/twig-bridge": "^6.0||^7.0", "symfony/twig-bundle": "^6.0||^7.0", - "symfony/validator": "^6.0||^7.0" + "symfony/validator": "^6.0||^7.0", + "symfony/http-foundation": "^6.0||^7.0" }, "require-dev": { "phpunit/phpunit": "^9.5",