Files
domokits-NEW/domokits/local/modules/TheliaLibrary/Service/LibraryImageService.php

173 lines
4.9 KiB
PHP
Executable File

<?php
/*
* This file is part of the Thelia package.
* http://www.thelia.net
*
* (c) OpenStudio <info@thelia.net>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace TheliaLibrary\Service;
use Propel\Runtime\ActiveQuery\Criteria;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Thelia\Core\Translation\Translator;
use TheliaLibrary\Model\LibraryImage;
use TheliaLibrary\Model\LibraryImageI18nQuery;
use TheliaLibrary\Model\LibraryImageQuery;
use TheliaLibrary\TheliaLibrary;
class LibraryImageService
{
public const LIBRARY_IMAGE_DIR = THELIA_WEB_DIR.'library'.DS.'images'.DS;
public const LIBRARY_IMAGE_BASE_ROUTE = '/library/images/';
protected EventDispatcherInterface $eventDispatcher;
protected RequestStack $requestStack;
protected ImageService $imageService;
public function __construct(
EventDispatcherInterface $eventDispatcher,
RequestStack $requestStack,
ImageService $imageService
) {
$this->eventDispatcher = $eventDispatcher;
$this->requestStack = $requestStack;
$this->imageService = $imageService;
}
/**
* @throws \Exception
*/
public function createImage(
File $file,
string $title = null,
string $locale = null
): LibraryImage {
return $this->createOrUpdateImage($file, $title, $locale);
}
/**
* @throws \Exception
*/
public function updateImage(
$imageId,
File $file = null,
string $title = null,
string $locale = null
): LibraryImage {
return $this->createOrUpdateImage($file, $title, $locale, $imageId);
}
public function deleteImage(
$imageId
): bool {
$image = LibraryImageQuery::create()
->filterById($imageId)
->findOne();
if (null === $image) {
return false;
}
$imageFiles = LibraryImageI18nQuery::create()->filterById($imageId)
->find();
foreach ($imageFiles as $imageFile) {
if (null === $imageFile->getFileName()) {
continue;
}
$fileSystem = new Filesystem();
$fileSystem->remove(TheliaLibrary::getImageDirectory().$imageFile->getFileName());
}
$image->delete();
return true;
}
public function getImagePublicUrl(
LibraryImage $image = null,
$width = null,
$height = null,
$format = null
) {
if (null == $image) {
return null;
}
$fileName = $this->imageService->getImageFileName($image);
$format = $format ?? pathinfo($fileName, \PATHINFO_EXTENSION);
$size = 'max';
if ($width || $height) {
$size = $width.','.$height;
}
return $this->imageService->getUrlForImage($image->getId(), $format, 'full', $size);
}
protected function createOrUpdateImage(
File $file = null,
string $title = null,
string $locale = null,
int $imageId = null
) {
$image = null !== $imageId
? LibraryImageQuery::create()->filterById($imageId)->findOne()
: (new LibraryImage());
if (null === $image) {
throw new \Exception(Translator::getInstance()->trans("Can't update an image that doesn't exist"));
}
if (null == $locale) {
$locale = $this->requestStack->getCurrentRequest()->getSession()->getAdminEditionLang()->getLocale();
}
$image->setLocale($locale);
$imageName = null;
if (null !== $file) {
$fileName = method_exists($file, 'getClientOriginalName') ? $file->getClientOriginalName() : $file->getFilename();
// Remove old file if already exist for this locale
if (null !== $image->getFileName()) {
$fileSystem = new Filesystem();
$fileSystem->remove(TheliaLibrary::getImageDirectory().$image->getFileName());
}
$imageName = bin2hex(random_bytes(5)).'_'.$fileName;
$file->move(TheliaLibrary::getImageDirectory(), $imageName);
if (null === $title && null === $image->getTitle()) {
$title = $fileName;
}
}
if (null === $imageName && null !== $imageId) {
$i18nWithFilename = LibraryImageI18nQuery::create()
->filterById($imageId)
->filterByFileName(null, Criteria::ISNOTNULL)
->findOne();
$imageName = $i18nWithFilename?->getFileName();
}
if (null != $title) {
$image->setTitle($title);
}
$image->setFileName($imageName);
$image->save();
return $image;
}
}