From 2c9accf58eb4f1258208a0fefc354e1337d405eb Mon Sep 17 00:00:00 2001 From: Franck Allimant Date: Thu, 26 Jun 2014 19:52:28 +0200 Subject: [PATCH] Added pre and post processing event disatching --- core/lib/Thelia/Action/Image.php | 97 ++++--------------- .../Thelia/Core/Event/Image/ImageEvent.php | 23 +++++ core/lib/Thelia/Core/Event/TheliaEvents.php | 10 ++ 3 files changed, 53 insertions(+), 77 deletions(-) diff --git a/core/lib/Thelia/Action/Image.php b/core/lib/Thelia/Action/Image.php index 2f38775bc..eb338e219 100644 --- a/core/lib/Thelia/Action/Image.php +++ b/core/lib/Thelia/Action/Image.php @@ -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), ); } diff --git a/core/lib/Thelia/Core/Event/Image/ImageEvent.php b/core/lib/Thelia/Core/Event/Image/ImageEvent.php index e6f152708..318265c26 100644 --- a/core/lib/Thelia/Core/Event/Image/ImageEvent.php +++ b/core/lib/Thelia/Core/Event/Image/ImageEvent.php @@ -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; + } } diff --git a/core/lib/Thelia/Core/Event/TheliaEvents.php b/core/lib/Thelia/Core/Event/TheliaEvents.php index 82cac917a..9c2962801 100644 --- a/core/lib/Thelia/Core/Event/TheliaEvents.php +++ b/core/lib/Thelia/Core/Event/TheliaEvents.php @@ -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 */