From e3bcf4c8b3ddeb3d35048e6297a4f6e72671b919 Mon Sep 17 00:00:00 2001 From: christianbeeznst Date: Fri, 1 Mar 2024 13:36:48 -0500 Subject: [PATCH 1/3] System template: Improve asset file naming and directory structure - refs #3804 --- config/packages/vich_uploader.yaml | 2 +- .../Component/Utils/AssetDirectoryNamer.php | 14 +++++- .../Component/Utils/AssetFileNameNamer.php | 48 +++++++++++++++++++ src/CoreBundle/Resources/config/services.yml | 14 +++++- 4 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 src/CoreBundle/Component/Utils/AssetFileNameNamer.php diff --git a/config/packages/vich_uploader.yaml b/config/packages/vich_uploader.yaml index c883003a0d..bb815c2cfe 100644 --- a/config/packages/vich_uploader.yaml +++ b/config/packages/vich_uploader.yaml @@ -16,7 +16,7 @@ vich_uploader: assets: uri_prefix: '' upload_destination: oneup_flysystem.asset_filesystem - namer: Vich\UploaderBundle\Naming\SmartUniqueNamer + namer: Chamilo\CoreBundle\Component\Utils\AssetFileNameNamer directory_namer: service: Chamilo\CoreBundle\Component\Utils\AssetDirectoryNamer options: {property: 'category'} diff --git a/src/CoreBundle/Component/Utils/AssetDirectoryNamer.php b/src/CoreBundle/Component/Utils/AssetDirectoryNamer.php index aa869d8cbd..4e89df784a 100644 --- a/src/CoreBundle/Component/Utils/AssetDirectoryNamer.php +++ b/src/CoreBundle/Component/Utils/AssetDirectoryNamer.php @@ -7,7 +7,9 @@ declare(strict_types=1); namespace Chamilo\CoreBundle\Component\Utils; use Chamilo\CoreBundle\Entity\Asset; +use Chamilo\CoreBundle\Repository\AssetRepository; use InvalidArgumentException; +use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\PropertyAccess\PropertyAccess; use Symfony\Component\PropertyAccess\PropertyAccessorInterface; use Vich\UploaderBundle\Mapping\PropertyMapping; @@ -17,13 +19,17 @@ use Vich\UploaderBundle\Naming\DirectoryNamerInterface; class AssetDirectoryNamer implements DirectoryNamerInterface, ConfigurableInterface { protected PropertyAccessorInterface $propertyAccessor; + private ?AssetRepository $assetRepository = null; + private ?RequestStack $requestStack = null; private string $propertyPath; private int $charsPerDir = 2; private int $dirs = 1; - public function __construct(?PropertyAccessorInterface $propertyAccessor) + public function __construct(?PropertyAccessorInterface $propertyAccessor, ?AssetRepository $assetRepository = null, ?RequestStack $requestStack= null) { $this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor(); + $this->assetRepository = $assetRepository; + $this->requestStack = $requestStack; } /** @@ -53,6 +59,12 @@ class AssetDirectoryNamer implements DirectoryNamerInterface, ConfigurableInterf $fileName = $mapping->getFileName($object); $category = $this->propertyAccessor->getValue($object, $this->propertyPath); + if ($object->getCategory() === Asset::SYSTEM_TEMPLATE) { + return 'system_templates'; + } elseif ($object->getCategory() === Asset::TEMPLATE) { + return 'doc_templates'; + } + $parts[] = $category; if (Asset::EXTRA_FIELD === $category) { diff --git a/src/CoreBundle/Component/Utils/AssetFileNameNamer.php b/src/CoreBundle/Component/Utils/AssetFileNameNamer.php new file mode 100644 index 0000000000..0762fc4676 --- /dev/null +++ b/src/CoreBundle/Component/Utils/AssetFileNameNamer.php @@ -0,0 +1,48 @@ +requestStack = $requestStack; + $this->translator = $translator; + } + + public function name($object, PropertyMapping $mapping): string + { + $category = $object->getCategory(); + + if (in_array($category, [Asset::TEMPLATE, Asset::SYSTEM_TEMPLATE])) { + $request = $this->requestStack->getCurrentRequest(); + if ($request) { + $templateId = $object->getId(); + $templateTitle = $request->get('title', 'default-title'); + $titleSlug = $this->slugify($templateTitle); + $extension = pathinfo($mapping->getFileName($object), PATHINFO_EXTENSION); + return sprintf('%s-%s.%s', $templateId, $titleSlug, $extension); + } + } + + return $mapping->getFileName($object); + } + + private function slugify(string $text): string + { + return strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $text), '-')); + } +} diff --git a/src/CoreBundle/Resources/config/services.yml b/src/CoreBundle/Resources/config/services.yml index c7a97f8ffe..5527af0a51 100644 --- a/src/CoreBundle/Resources/config/services.yml +++ b/src/CoreBundle/Resources/config/services.yml @@ -45,7 +45,19 @@ services: Chamilo\CoreBundle\Component\Editor\CkEditor\CkEditor: arguments: ['@translator', '@router'] - Chamilo\CoreBundle\Component\Utils\AssetDirectoryNamer: ~ + Chamilo\CoreBundle\Component\Utils\AssetDirectoryNamer: + arguments: + - '@property_accessor' + - '@Chamilo\CoreBundle\Repository\AssetRepository' + - '@request_stack' + + Chamilo\CoreBundle\Component\Utils\AssetFileNameNamer: + arguments: + - '@request_stack' + - '@translator' + tags: + - { name: vich_uploader.namer, mapping: assets } + Chamilo\CoreBundle\Component\Utils\CreateDefaultPages: ~ Chamilo\CoreBundle\Component\Utils\NameConvention: ~ Chamilo\CoreBundle\Component\Utils\Glide: From 16309d661f6548ee4af7a10e2c5ab228e5063982 Mon Sep 17 00:00:00 2001 From: christianbeeznst Date: Sat, 2 Mar 2024 22:10:35 -0500 Subject: [PATCH 2/3] Minor: Code Cleanup: Template param and styling fixes --- .../Component/Utils/AssetDirectoryNamer.php | 6 +++--- .../Component/Utils/AssetFileNameNamer.php | 12 +++++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/CoreBundle/Component/Utils/AssetDirectoryNamer.php b/src/CoreBundle/Component/Utils/AssetDirectoryNamer.php index 4e89df784a..6df33c9855 100644 --- a/src/CoreBundle/Component/Utils/AssetDirectoryNamer.php +++ b/src/CoreBundle/Component/Utils/AssetDirectoryNamer.php @@ -25,7 +25,7 @@ class AssetDirectoryNamer implements DirectoryNamerInterface, ConfigurableInterf private int $charsPerDir = 2; private int $dirs = 1; - public function __construct(?PropertyAccessorInterface $propertyAccessor, ?AssetRepository $assetRepository = null, ?RequestStack $requestStack= null) + public function __construct(?PropertyAccessorInterface $propertyAccessor, ?AssetRepository $assetRepository = null, ?RequestStack $requestStack = null) { $this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor(); $this->assetRepository = $assetRepository; @@ -59,9 +59,9 @@ class AssetDirectoryNamer implements DirectoryNamerInterface, ConfigurableInterf $fileName = $mapping->getFileName($object); $category = $this->propertyAccessor->getValue($object, $this->propertyPath); - if ($object->getCategory() === Asset::SYSTEM_TEMPLATE) { + if (Asset::SYSTEM_TEMPLATE === $object->getCategory()) { return 'system_templates'; - } elseif ($object->getCategory() === Asset::TEMPLATE) { + } elseif (Asset::TEMPLATE === $object->getCategory()) { return 'doc_templates'; } diff --git a/src/CoreBundle/Component/Utils/AssetFileNameNamer.php b/src/CoreBundle/Component/Utils/AssetFileNameNamer.php index 0762fc4676..f8853a3be1 100644 --- a/src/CoreBundle/Component/Utils/AssetFileNameNamer.php +++ b/src/CoreBundle/Component/Utils/AssetFileNameNamer.php @@ -12,6 +12,11 @@ use Symfony\Contracts\Translation\TranslatorInterface; use Vich\UploaderBundle\Mapping\PropertyMapping; use Vich\UploaderBundle\Naming\NamerInterface; +use const PATHINFO_EXTENSION; + +/** + * @implements NamerInterface + */ class AssetFileNameNamer implements NamerInterface { private RequestStack $requestStack; @@ -25,15 +30,20 @@ class AssetFileNameNamer implements NamerInterface public function name($object, PropertyMapping $mapping): string { + if (!$object instanceof Asset) { + throw new \InvalidArgumentException('Expected object of type Asset.'); + } + $category = $object->getCategory(); - if (in_array($category, [Asset::TEMPLATE, Asset::SYSTEM_TEMPLATE])) { + if (\in_array($category, [Asset::TEMPLATE, Asset::SYSTEM_TEMPLATE])) { $request = $this->requestStack->getCurrentRequest(); if ($request) { $templateId = $object->getId(); $templateTitle = $request->get('title', 'default-title'); $titleSlug = $this->slugify($templateTitle); $extension = pathinfo($mapping->getFileName($object), PATHINFO_EXTENSION); + return sprintf('%s-%s.%s', $templateId, $titleSlug, $extension); } } From b97bdf4b665576076c9d255c5494e57bdfde1a84 Mon Sep 17 00:00:00 2001 From: christianbeeznst Date: Sat, 2 Mar 2024 22:24:27 -0500 Subject: [PATCH 3/3] Minor: Code Cleanup: Template param and styling fixes --- src/CoreBundle/Component/Utils/AssetDirectoryNamer.php | 3 ++- src/CoreBundle/Component/Utils/AssetFileNameNamer.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/CoreBundle/Component/Utils/AssetDirectoryNamer.php b/src/CoreBundle/Component/Utils/AssetDirectoryNamer.php index 6df33c9855..a8bf1c0958 100644 --- a/src/CoreBundle/Component/Utils/AssetDirectoryNamer.php +++ b/src/CoreBundle/Component/Utils/AssetDirectoryNamer.php @@ -61,7 +61,8 @@ class AssetDirectoryNamer implements DirectoryNamerInterface, ConfigurableInterf if (Asset::SYSTEM_TEMPLATE === $object->getCategory()) { return 'system_templates'; - } elseif (Asset::TEMPLATE === $object->getCategory()) { + } + if (Asset::TEMPLATE === $object->getCategory()) { return 'doc_templates'; } diff --git a/src/CoreBundle/Component/Utils/AssetFileNameNamer.php b/src/CoreBundle/Component/Utils/AssetFileNameNamer.php index f8853a3be1..ff456e7c59 100644 --- a/src/CoreBundle/Component/Utils/AssetFileNameNamer.php +++ b/src/CoreBundle/Component/Utils/AssetFileNameNamer.php @@ -7,6 +7,7 @@ declare(strict_types=1); namespace Chamilo\CoreBundle\Component\Utils; use Chamilo\CoreBundle\Entity\Asset; +use InvalidArgumentException; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Contracts\Translation\TranslatorInterface; use Vich\UploaderBundle\Mapping\PropertyMapping; @@ -31,7 +32,7 @@ class AssetFileNameNamer implements NamerInterface public function name($object, PropertyMapping $mapping): string { if (!$object instanceof Asset) { - throw new \InvalidArgumentException('Expected object of type Asset.'); + throw new InvalidArgumentException('Expected object of type Asset.'); } $category = $object->getCategory();