Added pre and post processing event disatching
This commit is contained in:
@@ -18,6 +18,7 @@ use Imagine\Image\ImageInterface;
|
||||
use Imagine\Image\ImagineInterface;
|
||||
use Imagine\Image\Point;
|
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||
use Thelia\Core\Event\File\FileCreateOrUpdateEvent;
|
||||
use Thelia\Core\Event\Image\ImageCreateOrUpdateEvent;
|
||||
use Thelia\Core\Event\Image\ImageDeleteEvent;
|
||||
use Thelia\Core\Event\Image\ImageEvent;
|
||||
@@ -85,8 +86,10 @@ class Image extends BaseCachedFile implements EventSubscriberInterface
|
||||
*
|
||||
* This method updates the cache_file_path and file_url attributes of the event
|
||||
*
|
||||
* @param \Thelia\Core\Event\Image\ImageEvent $event
|
||||
* @throws \InvalidArgumentException, ImageException
|
||||
* @param ImageEvent $event
|
||||
*
|
||||
* @throws \Thelia\Exception\ImageException
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function processImage(ImageEvent $event)
|
||||
{
|
||||
@@ -136,6 +139,11 @@ class Image extends BaseCachedFile implements EventSubscriberInterface
|
||||
|
||||
if ($image) {
|
||||
|
||||
// Allow image pre-processing (watermarging, or other stuff...)
|
||||
$event->setImageObject($image);
|
||||
$event->getDispatcher()->dispatch(TheliaEvents::IMAGE_PREPROCESSING, $event);
|
||||
$image = $event->getImageObject();
|
||||
|
||||
$background_color = $event->getBackgroundColor();
|
||||
|
||||
if ($background_color != null) {
|
||||
@@ -205,6 +213,11 @@ class Image extends BaseCachedFile implements EventSubscriberInterface
|
||||
|
||||
if (is_null($quality)) $quality = ConfigQuery::read('default_image_quality_percent', 75);
|
||||
|
||||
// Allow image post-processing (watermarging, or other stuff...)
|
||||
$event->setImageObject($image);
|
||||
$event->getDispatcher()->dispatch(TheliaEvents::IMAGE_POSTPROCESSING, $event);
|
||||
$image = $event->getImageObject();
|
||||
|
||||
$image->save(
|
||||
$cacheFilePath,
|
||||
array('quality' => $quality)
|
||||
@@ -229,78 +242,6 @@ class Image extends BaseCachedFile implements EventSubscriberInterface
|
||||
$event->setOriginalFileUrl(URL::getInstance()->absoluteUrl($original_image_url, null, URL::PATH_TO_FILE));
|
||||
}
|
||||
|
||||
/**
|
||||
* Take care of saving image in the database and file storage
|
||||
*
|
||||
* @param \Thelia\Core\Event\Image\ImageCreateOrUpdateEvent $event Image event
|
||||
*
|
||||
* @throws \Thelia\Exception\ImageException
|
||||
* @todo refactor make all pictures using propel inheritance and factorise image behaviour into one single clean action
|
||||
*/
|
||||
public function saveImage(ImageCreateOrUpdateEvent $event)
|
||||
{
|
||||
$model = $event->getModelImage();
|
||||
|
||||
$nbModifiedLines = $model->save();
|
||||
$event->setModelImage($model);
|
||||
|
||||
if (!$nbModifiedLines) {
|
||||
throw new ImageException(
|
||||
sprintf(
|
||||
'Image "%s" with parent id %s failed to be saved',
|
||||
$event->getParentName(),
|
||||
$event->getParentId()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
$newUploadedFile = $this->fileManager->copyUploadedFile($event->getModelImage(), $event->getUploadedFile());
|
||||
$event->setUploadedFile($newUploadedFile);
|
||||
}
|
||||
|
||||
/**
|
||||
* Take care of updating image in the database and file storage
|
||||
*
|
||||
* @param ImageCreateOrUpdateEvent $event Image event
|
||||
*
|
||||
* @throws \Thelia\Exception\ImageException
|
||||
* @todo refactor make all pictures using propel inheritance and factorise image behaviour into one single clean action
|
||||
*/
|
||||
public function updateImage(ImageCreateOrUpdateEvent $event)
|
||||
{
|
||||
// Copy and save file
|
||||
if ($event->getUploadedFile()) {
|
||||
// Remove old picture file from file storage
|
||||
$url = $event->getModelImage()->getUploadDir() . '/' . $event->getOldModelImage()->getFile();
|
||||
unlink(str_replace('..', '', $url));
|
||||
|
||||
$newUploadedFile = $this->fileManager->copyUploadedFile($event->getModelImage(), $event->getUploadedFile());
|
||||
$event->setUploadedFile($newUploadedFile);
|
||||
}
|
||||
|
||||
// Update image modifications
|
||||
$event->getModelImage()->save();
|
||||
$event->setModelImage($event->getModelImage());
|
||||
}
|
||||
|
||||
public function updatePosition(UpdateFilePositionEvent $event)
|
||||
{
|
||||
$this->genericUpdatePosition($event->getQuery(), $event);
|
||||
}
|
||||
|
||||
/**
|
||||
* Take care of deleting image in the database and file storage
|
||||
*
|
||||
* @param ImageDeleteEvent $event Image event
|
||||
*
|
||||
* @throws \Exception
|
||||
* @todo refactor make all pictures using propel inheritance and factorise image behaviour into one single clean action
|
||||
*/
|
||||
public function deleteImage(ImageDeleteEvent $event)
|
||||
{
|
||||
$this->fileManager->deleteFile($event->getImageToDelete());
|
||||
}
|
||||
|
||||
/**
|
||||
* Process image resizing, with borders or cropping. If $dest_width and $dest_height
|
||||
* are both null, no resize is performed.
|
||||
@@ -420,10 +361,12 @@ class Image extends BaseCachedFile implements EventSubscriberInterface
|
||||
{
|
||||
return array(
|
||||
TheliaEvents::IMAGE_PROCESS => array("processImage", 128),
|
||||
|
||||
// Implemented in parent class BaseCachedFile
|
||||
TheliaEvents::IMAGE_CLEAR_CACHE => array("clearCache", 128),
|
||||
TheliaEvents::IMAGE_DELETE => array("deleteImage", 128),
|
||||
TheliaEvents::IMAGE_SAVE => array("saveImage", 128),
|
||||
TheliaEvents::IMAGE_UPDATE => array("updateImage", 128),
|
||||
TheliaEvents::IMAGE_DELETE => array("deleteFile", 128),
|
||||
TheliaEvents::IMAGE_SAVE => array("saveFile", 128),
|
||||
TheliaEvents::IMAGE_UPDATE => array("updateFile", 128),
|
||||
TheliaEvents::IMAGE_UPDATE_POSITION => array("updatePosition", 128),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
namespace Thelia\Core\Event\Image;
|
||||
|
||||
use Imagine\Image\ImageInterface;
|
||||
use Thelia\Core\Event\CachedFileEvent;
|
||||
|
||||
class ImageEvent extends CachedFileEvent
|
||||
@@ -71,6 +72,11 @@ class ImageEvent extends CachedFileEvent
|
||||
*/
|
||||
protected $quality = null;
|
||||
|
||||
/**
|
||||
* @var ImageInterface
|
||||
*/
|
||||
protected $imageObject;
|
||||
|
||||
/**
|
||||
* @return boolean true if the required image is the original image (resize_mode and background_color are not significant)
|
||||
*/
|
||||
@@ -209,4 +215,21 @@ class ImageEvent extends CachedFileEvent
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ImageInterface $imageObject
|
||||
* @return $this
|
||||
*/
|
||||
public function setImageObject($imageObject)
|
||||
{
|
||||
$this->imageObject = $imageObject;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ImageInterface
|
||||
*/
|
||||
public function getImageObject() {
|
||||
return $this->imageObject;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -382,6 +382,16 @@ final class TheliaEvents
|
||||
*/
|
||||
const IMAGE_PROCESS = "action.processImage";
|
||||
|
||||
/**
|
||||
* Sent just after creating the image object from the image file
|
||||
*/
|
||||
const IMAGE_PREPROCESSING = "action.preProcessImage";
|
||||
|
||||
/**
|
||||
* Sent just before saving the processed image object on disk
|
||||
*/
|
||||
const IMAGE_POSTPROCESSING = "action.postProcessImage";
|
||||
|
||||
/**
|
||||
* Sent on document processing
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user