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..a8bf1c0958 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,13 @@ class AssetDirectoryNamer implements DirectoryNamerInterface, ConfigurableInterf $fileName = $mapping->getFileName($object); $category = $this->propertyAccessor->getValue($object, $this->propertyPath); + if (Asset::SYSTEM_TEMPLATE === $object->getCategory()) { + return 'system_templates'; + } + if (Asset::TEMPLATE === $object->getCategory()) { + 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..ff456e7c59 --- /dev/null +++ b/src/CoreBundle/Component/Utils/AssetFileNameNamer.php @@ -0,0 +1,59 @@ + + */ +class AssetFileNameNamer implements NamerInterface +{ + private RequestStack $requestStack; + private TranslatorInterface $translator; + + public function __construct(RequestStack $requestStack, TranslatorInterface $translator) + { + $this->requestStack = $requestStack; + $this->translator = $translator; + } + + 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])) { + $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: