Added pre and post processing event disatching

This commit is contained in:
Franck Allimant
2014-06-26 19:52:28 +02:00
parent ca862b07e4
commit 2c9accf58e
3 changed files with 53 additions and 77 deletions

View File

@@ -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),
);
}

View File

@@ -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;
}
}

View File

@@ -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
*/