143 lines
4.0 KiB
PHP
143 lines
4.0 KiB
PHP
<?php
|
|
|
|
namespace OpenApi\Service;
|
|
|
|
use Symfony\Component\EventDispatcher\EventDispatcher;
|
|
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
|
|
use Thelia\Core\Event\Image\ImageEvent;
|
|
use Thelia\Core\Event\TheliaEvents;
|
|
use Thelia\Model\BrandImage;
|
|
use Thelia\Model\CategoryImage;
|
|
use Thelia\Model\ConfigQuery;
|
|
use Thelia\Model\ContentImage;
|
|
use Thelia\Model\FolderImage;
|
|
use Thelia\Model\ModuleImage;
|
|
use Thelia\Model\ProductImage;
|
|
|
|
class ImageService
|
|
{
|
|
/**
|
|
* @var EventDispatcher
|
|
*/
|
|
private $dispatcher;
|
|
|
|
public function __construct(EventDispatcherInterface $dispatcher)
|
|
{
|
|
$this->dispatcher = $dispatcher;
|
|
}
|
|
|
|
/**
|
|
* Returns an image URL.
|
|
*
|
|
* @param $imageModel
|
|
* @param $imageType
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getImageUrl($imageModel, $imageType = null)
|
|
{
|
|
return $this->transformImage($imageModel, $imageType);
|
|
}
|
|
|
|
/**
|
|
* Transform an image according to the parameters, and returns the
|
|
* transformed image URL.
|
|
*
|
|
* imageFile can be of type Thelia\Model\ProductImage, ContentImage etc
|
|
*
|
|
* @param ProductImage|ContentImage|BrandImage|CategoryImage|FolderImage|ModuleImage $imageModel
|
|
* @param $imageType
|
|
* @param bool $allowZoom
|
|
* @param string $resize
|
|
* @param null $width
|
|
* @param null $height
|
|
* @param null $rotation
|
|
* @param null $backgroundColor
|
|
* @param null $quality
|
|
* @param null $effects
|
|
*
|
|
* @return string The transformed Image URL
|
|
*/
|
|
public function transformImage(
|
|
$imageModel,
|
|
$imageType = null,
|
|
$allowZoom = false,
|
|
$resize = 'none',
|
|
$width = null,
|
|
$height = null,
|
|
$rotation = null,
|
|
$backgroundColor = null,
|
|
$quality = null,
|
|
$effects = null
|
|
) {
|
|
switch ($resize) {
|
|
case 'crop':
|
|
$resizeMode = \Thelia\Action\Image::EXACT_RATIO_WITH_CROP;
|
|
break;
|
|
|
|
case 'borders':
|
|
$resizeMode = \Thelia\Action\Image::EXACT_RATIO_WITH_BORDERS;
|
|
break;
|
|
|
|
case 'none':
|
|
default:
|
|
$resizeMode = \Thelia\Action\Image::KEEP_IMAGE_RATIO;
|
|
}
|
|
|
|
$event = $this->createImageEvent($imageModel, $imageType);
|
|
$event
|
|
->setAllowZoom($allowZoom)
|
|
->setResizeMode($resizeMode)
|
|
->setWidth($width)
|
|
->setHeight($height)
|
|
->setRotation($rotation)
|
|
->setBackgroundColor($backgroundColor)
|
|
->setQuality($quality)
|
|
;
|
|
|
|
/* Needed as setting effects as null will throw an exception during dispatch */
|
|
if ($effects) {
|
|
$event->setEffects($effects);
|
|
}
|
|
|
|
$this->dispatcher->dispatch($event, TheliaEvents::IMAGE_PROCESS);
|
|
|
|
return $event->getFileUrl();
|
|
}
|
|
|
|
/**
|
|
* @param ProductImage|ContentImage|BrandImage|CategoryImage|FolderImage|ModuleImage $imageModel
|
|
* @param null $imageType
|
|
*
|
|
* @return ImageEvent
|
|
*/
|
|
protected function createImageEvent($imageModel, $imageType = null)
|
|
{
|
|
$imageEvent = new ImageEvent();
|
|
$baseSourceFilePath = ConfigQuery::read('images_library_path');
|
|
|
|
if (null === $imageType) {
|
|
$imageType = str_replace(['image', 'thelia\\model\\'], '', strtolower(\get_class($imageModel)));
|
|
}
|
|
|
|
if ($baseSourceFilePath === null) {
|
|
$baseSourceFilePath = THELIA_LOCAL_DIR.'media'.DS.'images';
|
|
} else {
|
|
$baseSourceFilePath = THELIA_ROOT.$baseSourceFilePath;
|
|
}
|
|
|
|
/** Put source image file path */
|
|
$sourceFilePath = sprintf(
|
|
'%s/%s/%s',
|
|
$baseSourceFilePath,
|
|
$imageType,
|
|
$imageModel->getFile()
|
|
);
|
|
|
|
$imageEvent->setSourceFilepath($sourceFilePath);
|
|
$imageEvent->setCacheSubdirectory($imageType);
|
|
|
|
return $imageEvent;
|
|
}
|
|
}
|