Working : Image management set on Category

This commit is contained in:
gmorel
2013-09-22 20:50:42 +02:00
parent cf7e6d6952
commit b91a11536b
31 changed files with 3620 additions and 510 deletions

View File

@@ -23,20 +23,20 @@
namespace Thelia\Controller\Admin;
use Propel\Runtime\Exception\PropelException;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Router;
use Thelia\Core\Event\ImageCreateOrUpdateEvent;
use Thelia\Core\Event\ImagesCreateOrUpdateEvent;
use Thelia\Core\Event\ImageDeleteEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Core\Translation\Translator;
use Thelia\Form\CategoryImageCreationForm;
use Thelia\Form\Exception\FormValidationException;
use Thelia\Log\Tlog;
use Thelia\Model\CategoryImageQuery;
use Thelia\Model\ContentImageQuery;
use Thelia\Model\FolderImageQuery;
use Thelia\Model\ProductImageQuery;
use Thelia\Tools\FileManager;
use Thelia\Tools\Rest\ResponseRest;
/**
* Created by JetBrains PhpStorm.
@@ -57,13 +57,14 @@ class FileController extends BaseAdminController
*
* @param int $parentId Parent id owning files being saved
* @param string $parentType Parent Type owning files being saved
* @param string $successUrl Success URL to be redirected to
*
* @return Response
*/
public function saveFilesAction($parentId, $parentType, $successUrl)
public function saveFilesAction($parentId, $parentType)
{
}
/**
@@ -74,77 +75,165 @@ class FileController extends BaseAdminController
*
* @return Response
*/
public function saveImagesAction($parentId, $parentType)
public function saveImageAjaxAction($parentId, $parentType)
{
// Check current user authorization
if (null !== $response = $this->checkAuth("admin.image.save")) {
return $response;
}
$message = $this->getTranslator()
->trans(
'Images saved successfully',
array(),
'image'
);
$this->checkAuth('ADMIN', 'admin.image.save');
$this->checkXmlHttpRequest();
if ($this->isParentTypeValid($parentType)) {
if ($this->getRequest()->isMethod('POST')) {
// Create the form from the request
$creationForm = $this->getImageForm($parentType, $this->getRequest());
try {
// Check the form against constraints violations
$form = $this->validateForm($creationForm, 'POST');
/** @var UploadedFile $fileBeingUploaded */
$fileBeingUploaded = $this->getRequest()->files->get('file');
// Get the form field values
$data = $form->getData();
$fileManager = new FileManager($this->container);
$parentModel = $fileManager->getParentImageModel($parentType, $parentId);
$imageModel = $fileManager->getImageModel($parentType);
// Feed event
$imageCreateOrUpdateEvent = new ImageCreateOrUpdateEvent(
$parentType,
$parentId
);
if (isset($data) && isset($data['pictures'])) {
$imageCreateOrUpdateEvent->setModelImages($data['pictures']);
$imageCreateOrUpdateEvent->setUploadedFiles($this->getRequest()->files->get($creationForm->getName())['pictures']);
}
// Dispatch Event to the Action
$this->dispatch(
TheliaEvents::IMAGE_SAVE,
$imageCreateOrUpdateEvent
);
} catch (FormValidationException $e) {
// Invalid data entered
$message = 'Please check your input:';
$this->logError($parentType, 'image saving', $message, $e);
} catch (\Exception $e) {
// Any other error
$message = 'Sorry, an error occurred:';
$this->logError($parentType, 'image saving', $message, $e);
if ($parentModel === null || $imageModel === null || $fileBeingUploaded === null) {
return new Response('', 404);
}
if ($message !== false) {
// Mark the form as with error
$creationForm->setErrorMessage($message);
$defaultTitle = $parentModel->getTitle();
$imageModel->setParentId($parentId);
$imageModel->setTitle($defaultTitle);
// Send the form and the error to the parser
$this->getParserContext()
->addForm($creationForm)
->setGeneralError($message);
$imageCreateOrUpdateEvent = new ImageCreateOrUpdateEvent(
$parentType,
$parentId
);
$imageCreateOrUpdateEvent->setModelImage($imageModel);
$imageCreateOrUpdateEvent->setUploadedFile($fileBeingUploaded);
$imageCreateOrUpdateEvent->setParentName($parentModel->getTitle());
// Set flash message to be displayed
$flashMessage = $this->getSession()->get('flashMessage');
$flashMessage['imageMessage'] = $message;
$this->getSession()->set('flashMessage', $flashMessage);
}
// Dispatch Event to the Action
$this->dispatch(
TheliaEvents::IMAGE_SAVE,
$imageCreateOrUpdateEvent
);
return new ResponseRest(array('status' => true, 'message' => ''));
}
}
$this->redirectSuccess($creationForm);
return new Response('', 404);
}
/**
* Manage how a image list will be displayed in AJAX
*
* @param int $parentId Parent id owning images being saved
* @param string $parentType Parent Type owning images being saved
*
* @return Response
*/
public function getImageListAjaxAction($parentId, $parentType)
{
$this->checkAuth('ADMIN', 'admin.image.save');
$this->checkXmlHttpRequest();
$args = array('imageType' => $parentType, 'parentId' => $parentId);
return $this->render('includes/image-upload-list-ajax', $args);
}
/**
* Manage how an image is viewed
*
* @param int $imageId Parent id owning images being saved
* @param string $parentType Parent Type owning images being saved
*
* @return Response
*/
public function viewImageAction($imageId, $parentType)
{
if (null !== $response = $this->checkAuth('admin.image.view')) return $response;
try {
$fileManager = new FileManager($this->container);
$image = $fileManager->getImageModelQuery($parentType)->findPk($imageId);
$redirectUrl = $fileManager->getRedirectionUrl($parentType, $image->getParentId());
return $this->render('image-edit', array(
'imageId' => $imageId,
'imageType' => $parentType,
'redirectUrl' => $redirectUrl
));
} catch (Exception $e) {
$this->pageNotFound();
}
}
/**
* Manage how an image is updated
*
* @param int $imageId Parent id owning images being saved
* @param string $parentType Parent Type owning images being saved
*
* @return Response
*/
public function updateImageAction($imageId, $parentType)
{
if (null !== $response = $this->checkAuth('admin.image.update')) return $response;
$message = false;
$fileManager = new FileManager($this->container);
$imageModification = $fileManager->getImageForm($parentType, $this->getRequest());
try {
$image = $fileManager->getImageModelQuery($parentType)->findPk($imageId);
$oldImage = clone $image;
if(null === $image) {
throw new \InvalidArgumentException(sprintf('%d image id does not exists', $imageId));
}
$form = $this->validateForm($imageModification);
$event = $this->createEventInstance($parentType, $image, $form->getData());
$event->setOldModelImage($oldImage);
$files = $this->getRequest()->files;
$fileForm = $files->get($imageModification->getName());
if(isset($fileForm['file'])) {
$event->setUploadedFile($fileForm['file']);
}
$this->dispatch(TheliaEvents::IMAGE_UPDATE, $event);
$imageUpdated = $event->getModelImage();
$this->adminLogAppend(sprintf('Image with Ref %s (ID %d) modified', $imageUpdated->getTitle() , $imageUpdated->getId()));
if($this->getRequest()->get('save_mode') == 'close') {
$this->redirectToRoute('admin.images');
} else {
$this->redirectSuccess($imageModification);
}
} catch (FormValidationException $e) {
$message = sprintf('Please check your input: %s', $e->getMessage());
} catch (PropelException $e) {
$message = $e->getMessage();
} catch (\Exception $e) {
$message = sprintf('Sorry, an error occurred: %s', $e->getMessage().' '.$e->getFile());
}
if ($message !== false) {
Tlog::getInstance()->error(sprintf('Error during image editing : %s.', $message));
$imageModification->setErrorMessage($message);
$this->getParserContext()
->addForm($imageModification)
->setGeneralError($message)
;
}
return $this->render('image-edit', array(
'imageId' => $imageId,
'imageType' => $parentType
));
}
/**
@@ -160,14 +249,18 @@ class FileController extends BaseAdminController
$this->checkAuth('ADMIN', 'admin.image.delete');
$this->checkXmlHttpRequest();
$model = $this->getImageModel($parentType, $imageId);
$fileManager = new FileManager($this->container);
$imageModelQuery = $fileManager->getImageModelQuery($parentType);
$model = $imageModelQuery->findPk($imageId);
if ($model == null) {
return $this->pageNotFound();
}
// Feed event
$imageDeleteEvent = new ImageDeleteEvent(
$model
$model,
$parentType
);
// Dispatch Event to the Action
@@ -218,73 +311,42 @@ class FileController extends BaseAdminController
*/
public function isParentTypeValid($parentType)
{
return (in_array($parentType, ImageCreateOrUpdateEvent::getAvailableType()));
return (in_array($parentType, ImagesCreateOrUpdateEvent::getAvailableType()));
}
/**
* Get Image form
* Create Event instance
*
* @param string $parentType Parent type
* @param Request $request Request Service
* @param string $parentType Parent Type owning images being saved
* @param \Thelia\Model\CategoryImage|\Thelia\Model\ProductImage|\Thelia\Model\ContentImage|\Thelia\Model\FolderImage $model Image model
* @param array $data Post data
*
* @return null|CategoryImageCreationForm|ContentImageCreationForm|FolderImageCreationForm|ProductImageCreationForm
*
* @todo refactor make all pictures using propel inheritance and factorise image behaviour into one single clean action
* @return ImageCreateOrUpdateEvent
*/
public function getImageForm($parentType, Request $request)
private function createEventInstance($parentType, $model, $data)
{
// @todo implement other forms
switch ($parentType) {
// case ImageCreateOrUpdateEvent::TYPE_PRODUCT:
// $creationForm = new ProductImageCreationForm($request);
// break;
case ImageCreateOrUpdateEvent::TYPE_CATEGORY:
$creationForm = new CategoryImageCreationForm($request);
break;
// case ImageCreateOrUpdateEvent::TYPE_CONTENT:
// $creationForm = new ContentImageCreationForm($request);
// break;
// case ImageCreateOrUpdateEvent::TYPE_FOLDER:
// $creationForm = new FolderImageCreationForm($request);
// break;
default:
$creationForm = null;
$imageCreateEvent = new ImageCreateOrUpdateEvent($parentType, null);
if (isset($data['title'])) {
$model->setTitle($data['title']);
}
if (isset($data['chapo'])) {
$model->setChapo($data['chapo']);
}
if (isset($data['description'])) {
$model->setDescription($data['description']);
}
if (isset($data['file'])) {
$model->setFile($data['file']);
}
if (isset($data['postscriptum'])) {
$model->setPostscriptum($data['postscriptum']);
}
return $creationForm;
$imageCreateEvent->setModelImage($model);
return $imageCreateEvent;
}
/**
* Get image model from type
*
* @param string $parentType
* @param int $imageId
*
* @return null|\Thelia\Model\CategoryImage|\Thelia\Model\ContentImage|\Thelia\Model\FolderImage|\Thelia\Model\ProductImage
*
* @todo refactor make all pictures using propel inheritance and factorise image behaviour into one single clean action
*/
public function getImageModel($parentType, $imageId)
{
switch ($parentType) {
case ImageCreateOrUpdateEvent::TYPE_PRODUCT:
$model = ProductImageQuery::create()->findPk($imageId);
break;
case ImageCreateOrUpdateEvent::TYPE_CATEGORY:
$model = CategoryImageQuery::create()->findPk($imageId);
break;
case ImageCreateOrUpdateEvent::TYPE_CONTENT:
$model = ContentImageQuery::create()->findPk($imageId);
break;
case ImageCreateOrUpdateEvent::TYPE_FOLDER:
$model = FolderImageQuery::create()->findPk($imageId);
break;
default:
$model = null;
}
return $model;
}
}