Files
aux-bieaux-legumes/local/modules/Selection/Controller/ImageUploadController.php

524 lines
18 KiB
PHP

<?php
namespace Selection\Controller;
use Selection\Model\SelectionContainer;
use Selection\Model\SelectionContainerImage;
use Selection\Model\SelectionContainerImageQuery;
use Selection\Model\SelectionImage;
use Selection\Model\SelectionImageQuery;
use Selection\Selection;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Thelia\Controller\Admin\FileController;
use Thelia\Core\Event\File\FileCreateOrUpdateEvent;
use Thelia\Core\Event\File\FileDeleteEvent;
use Thelia\Core\Event\File\FileToggleVisibilityEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Core\Event\UpdateFilePositionEvent;
use Thelia\Core\HttpFoundation\Response;
use Thelia\Core\Security\AccessManager;
use Thelia\Files\Exception\ProcessFileException;
use Thelia\Files\FileModelInterface;
use Thelia\Form\Exception\FormValidationException;
use Thelia\Log\Tlog;
use Thelia\Tools\Rest\ResponseRest;
use Thelia\Tools\URL;
class ImageUploadController extends FileController
{
protected $currentRouter = Selection::ROUTER;
/**
* @inheritdoc
* @throws \Exception
*/
public function getImageListAjaxAction($parentId, $parentType)
{
$this->addModuleResource($parentType);
$this->registerFileModel($parentType);
$this->checkAccessForType(AccessManager::UPDATE, $parentType);
$this->checkXmlHttpRequest();
$args = array('imageType' => $parentType, 'parentId' => $parentId);
return $this->render('image-upload-list-ajax', $args);
}
/**
* @inheritdoc
* @throws \Exception
*/
public function getImageFormAjaxAction($parentId, $parentType)
{
$this->addModuleResource($parentType);
$this->registerFileModel($parentType);
$this->checkAccessForType(AccessManager::UPDATE, $parentType);
$this->checkXmlHttpRequest();
$args = array('imageType' => $parentType, 'parentId' => $parentId);
return $this->render('selectionImageUpdate', $args);
}
/**
* @param $imageId
* @param $parentType
* @return mixed|\Symfony\Component\HttpFoundation\Response
* @throws \Exception
*/
public function updateImageTitleAction($imageId, $parentType)
{
$this->addModuleResource($parentType);
$parentId = $this->getRequest()->get('parentId');
$this->registerFileModel($parentType);
if (null !== $response = $this->checkAccessForType(AccessManager::UPDATE, $parentType)) {
return $response;
}
$fileManager = $this->getFileManager();
$fileModelInstance = $fileManager->getModelInstance('image', $parentType);
/** @var FileModelInterface $file */
$file = $fileModelInstance->getQueryInstance()->findPk($imageId);
$new_title = $this->getRequest()->request->get('title');
$locale = $this->getRequest()->request->get('locale');
if (!empty($new_title)) {
$file->setLocale($locale);
$file->setTitle($new_title);
$file->save();
}
return $this->getImagetTypeUpdateRedirectionUrl($parentType, $parentId);
}
/**
* @param int $fileId
* @param string $parentType
* @param string $objectType
* @param string $eventName
* @return \Symfony\Component\HttpFoundation\Response|Response
* @throws \Exception
*/
public function deleteFileAction($fileId, $parentType, $objectType, $eventName)
{
$message = null;
$this->addModuleResource($parentType);
$parentId = $this->getRequest()->get('parentId');
$this->registerFileModel($parentType);
$this->checkAccessForType(AccessManager::UPDATE, $parentType);
$this->checkXmlHttpRequest();
$fileManager = $this->getFileManager();
$modelInstance = $fileManager->getModelInstance($objectType, $parentType);
$model = $modelInstance->getQueryInstance()->findPk($fileId);
if ($model == null) {
return $this->pageNotFound();
}
// Feed event
$fileDeleteEvent = new FileDeleteEvent($model);
// Dispatch Event to the Action
try {
$this->dispatch($eventName, $fileDeleteEvent);
$this->adminUpadteLogAppend(
$parentType,
$this->getTranslator()->trans(
'Deleting %obj% for %id% with parent id %parentId%',
array(
'%obj%' => $objectType,
'%id%' => $fileDeleteEvent->getFileToDelete()->getId(),
'%parentId%' => $fileDeleteEvent->getFileToDelete()->getParentId(),
)
),
$fileDeleteEvent->getFileToDelete()->getId()
);
} catch (\Exception $e) {
$message = $this->getTranslator()->trans(
'Fail to delete %obj% for %id% with parent id %parentId% (Exception : %e%)',
array(
'%obj%' => $objectType,
'%id%' => $fileDeleteEvent->getFileToDelete()->getId(),
'%parentId%' => $fileDeleteEvent->getFileToDelete()->getParentId(),
'%e%' => $e->getMessage()
)
);
}
if (null === $message) {
$message = $this->getTranslator()->trans(
'%obj%s deleted successfully',
['%obj%' => ucfirst($objectType)],
Selection::DOMAIN_NAME
);
}
$this->adminUpadteLogAppend($parentType, $message, $fileDeleteEvent->getFileToDelete()->getId());
return $this->getImagetTypeUpdateRedirectionUrl($parentType, $parentId);
}
/*----------------- My parts */
/**
* @param int $parentId
* @param string $parentType
* @param string $objectType
* @param array $validMimeTypes
* @param array $extBlackList
* @return mixed|\Symfony\Component\HttpFoundation\Response|Response|ResponseRest
* @throws \Exception
*/
public function saveFileAjaxAction(
$parentId,
$parentType,
$objectType,
$validMimeTypes = array(),
$extBlackList = array()
) {
$this->addModuleResource($parentType);
$this->registerFileModel($parentType);
if (null !== $response = $this->checkAccessForType(AccessManager::UPDATE, $parentType)) {
return $response;
}
$this->checkXmlHttpRequest();
if ($this->getRequest()->isMethod('POST')) {
/** @var UploadedFile $fileBeingUploaded */
$fileBeingUploaded = $this->getRequest()->files->get('file');
try {
if (null !== $fileBeingUploaded) {
$this->processFile(
$fileBeingUploaded,
$parentId,
$parentType,
$objectType,
$validMimeTypes,
$extBlackList
);
}
} catch (ProcessFileException $e) {
return new ResponseRest($e->getMessage(), 'text', $e->getCode());
}
return $this->getImagetTypeUpdateRedirectionUrl($parentType, $parentId);
}
return new Response('', 404);
}
/**
* @param int $imageId
* @param string $parentType
* @return mixed|Response
* @throws \Exception
*/
public function viewImageAction($imageId, $parentType)
{
$this->addModuleResource($parentType);
$this->registerFileModel($parentType);
if (null !== $response = $this->checkAccessForType(AccessManager::UPDATE, $parentType)) {
return $response;
}
$fileManager = $this->getFileManager();
$imageModel = $fileManager->getModelInstance('image', $parentType);
$image = null;
$parentId = null;
if (SelectionContainer::IMAGE_TYPE_LABEL === $parentType) {
$image = SelectionContainerImageQuery::create()->findPk($imageId);
if ($image !== null) {
$parentId = $image->getSelectionContainerId();
}
} else {
$image = SelectionImageQuery::create()->findPk($imageId);
if ($image !== null) {
$parentId = $image->getSelectionId();
}
}
if ($image === null) {
return $this->pageNotFound();
}
$redirectUrl = $this->getImagetTypeUpdateRedirectionUrl($parentType, $parentId);
return $this->render('selection-image-edit', array(
'imageId' => $imageId,
'imageType' => $parentType,
'redirectUrl' => $redirectUrl,
'formId' => $imageModel->getUpdateFormId(),
'breadcrumb' => $image->getBreadcrumb(
$this->getRouter($this->getCurrentRouter()),
$this->container,
'images',
$this->getCurrentEditionLocale()
)
));
}
/**
* @param int $fileId
* @param string $parentType
* @param string $objectType
* @param string $eventName
* @return \Symfony\Component\HttpFoundation\Response
*/
protected function updateFileAction($fileId, $parentType, $objectType, $eventName)
{
$message = false;
$fileManager = $this->getFileManager();
$fileModelInstance = $fileManager->getModelInstance($objectType, $parentType);
$fileUpdateForm = $this->createForm($fileModelInstance->getUpdateFormId());
/** @var FileModelInterface $file */
$file = $fileModelInstance->getQueryInstance()->findPk($fileId);
try {
$oldFile = clone $file;
if (null === $file) {
throw new \InvalidArgumentException(sprintf('%d %s id does not exist', $fileId, $objectType));
}
$data = $this->validateForm($fileUpdateForm)->getData();
$event = new FileCreateOrUpdateEvent(null);
if (array_key_exists('visible', $data)) {
$file->setVisible($data['visible'] ? 1 : 0);
}
$file->setLocale($data['locale']);
if (array_key_exists('title', $data)) {
$file->setTitle($data['title']);
}
if (array_key_exists('chapo', $data)) {
$file->setChapo($data['chapo']);
}
if (array_key_exists('description', $data)) {
$file->setDescription($data['description']);
}
if (array_key_exists('postscriptum', $data)) {
$file->setPostscriptum($data['postscriptum']);
}
if (isset($data['file'])) {
$file->setFile($data['file']);
}
$event->setModel($file);
$event->setOldModel($oldFile);
$files = $this->getRequest()->files;
$fileForm = $files->get($fileUpdateForm->getName());
if (isset($fileForm['file'])) {
$event->setUploadedFile($fileForm['file']);
}
$this->dispatch($eventName, $event);
$fileUpdated = $event->getModel();
$this->adminUpadteLogAppend(
$parentType,
sprintf(
'%s with Ref %s (ID %d) modified',
ucfirst($objectType),
$fileUpdated->getTitle(),
$fileUpdated->getId()
),
$fileUpdated->getId()
);
} catch (FormValidationException $e) {
$message = sprintf('Please check your input: %s', $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 %s editing : %s.', $objectType, $message));
$fileUpdateForm->setErrorMessage($message);
$this->getParserContext()
->addForm($fileUpdateForm)
->setGeneralError($message);
}
if ($this->getRequest()->get('save_mode') === 'close') {
return $this->generateRedirect(
URL::getInstance()->absoluteUrl($file->getRedirectionUrl(), ['current_tab' => 'images'])
);
}
return $this->generateSuccessRedirect($fileUpdateForm);
}
/**
* @param int $imageId
* @param string $parentType
* @return mixed|Response|FileModelInterface
* @throws \Exception
*/
public function updateImageAction($imageId, $parentType)
{
$this->addModuleResource($parentType);
if (null !== $response = $this->checkAccessForType(AccessManager::UPDATE, $parentType)) {
return $response;
}
$this->registerFileModel($parentType);
return $this->updateFileAction($imageId, $parentType, 'image', TheliaEvents::IMAGE_UPDATE);
}
/**
* @param $documentId
* @param string $parentType
* @param string $objectType
* @param string $eventName
* @return \Symfony\Component\HttpFoundation\Response|Response
* @throws \Exception
*/
public function toggleVisibilityFileAction($documentId, $parentType, $objectType, $eventName)
{
$message = null;
$this->addModuleResource($parentType);
$parentId = $this->getRequest()->get('parentId');
$this->registerFileModel($parentType);
$this->checkAccessForType(AccessManager::UPDATE, $parentType);
$this->checkXmlHttpRequest();
$fileManager = $this->getFileManager();
$modelInstance = $fileManager->getModelInstance($objectType, $parentType);
$model = $modelInstance->getQueryInstance()->findPk($documentId);
if ($model === null) {
return $this->pageNotFound();
}
// Feed event
$event = new FileToggleVisibilityEvent(
$modelInstance->getQueryInstance(),
$documentId
);
// Dispatch Event to the Action
try {
$this->dispatch($eventName, $event);
} catch (\Exception $e) {
$message = $this->getTranslator()->trans(
'Fail to update %type% visibility: %err%',
['%type%' => $objectType, '%err%' => $e->getMessage()]
);
}
if (null === $message) {
$message = $this->getTranslator()->trans(
'%type% visibility updated',
['%type%' => ucfirst($objectType)]
);
}
$this->adminUpadteLogAppend($parentType, $message, $documentId);
return $this->generateRedirectFromRoute('selection.update', [], ['selectionId' => $parentId], null);
}
/**
* @param $parentType
* @param $parentId
* @param $objectType
* @param $eventName
* @return Response
* @throws \Exception
*/
public function updateFilePositionAction($parentType, $parentId, $objectType, $eventName)
{
$message = null;
$this->addModuleResource($parentType);
$this->registerFileModel($parentType);
$position = $this->getRequest()->request->get('position');
$this->checkAccessForType(AccessManager::UPDATE, $parentType);
$this->checkXmlHttpRequest();
$fileManager = $this->getFileManager();
$modelInstance = $fileManager->getModelInstance($objectType, $parentType);
$model = $modelInstance->getQueryInstance()->findPk($parentId);
if ($model === null || $position === null) {
return $this->pageNotFound();
}
// Feed event
$event = new UpdateFilePositionEvent(
$modelInstance->getQueryInstance(),
$parentId,
UpdateFilePositionEvent::POSITION_ABSOLUTE,
$position
);
// Dispatch Event to the Action
try {
$this->dispatch($eventName, $event);
} catch (\Exception $e) {
$message = $this->getTranslator()->trans(
'Fail to update %type% position: %err%',
['%type%' => $objectType, '%err%' => $e->getMessage()]
);
}
if (null === $message) {
$message = $this->getTranslator()->trans(
'%type% position updated',
['%type%' => ucfirst($objectType)]
);
}
return new Response($message);
}
/**
* @param string $type
* @param $message string
* @param string|null $resourceId
*/
protected function adminUpadteLogAppend($type, $message, $resourceId = null)
{
$this->adminLogAppend(
$this->getAdminResources()->getResource($type, ucfirst(Selection::DOMAIN_NAME)),
AccessManager::UPDATE,
$message,
$resourceId
);
}
/**
* @param string $type
* @throws \Exception
*/
protected function addModuleResource($type)
{
$data = [strtoupper($type) => "admin.selection"];
$module = ucfirst(Selection::DOMAIN_NAME);
/** @noinspection PhpParamsInspection */
$this->getAdminResources()->addModuleResources($data, $module);
}
/**
* @param string $access
* @param string $type
* @return mixed null if authorization is granted, or a Response object which contains the error page otherwise
*/
protected function checkAccessForType($access, $type)
{
return $this->checkAuth(
$this->getAdminResources()->getResource($type, ucfirst(Selection::DOMAIN_NAME)),
array(),
$access
);
}
/**
* @param string $type
*/
private function registerFileModel($type)
{
$this->getFileManager()->addFileModel(
'image',
$type,
$type === 'SelectionContainer' ? SelectionContainerImage::class : SelectionImage::class
);
}
private function getImagetTypeUpdateRedirectionUrl($parentType, $parentId)
{
if ($parentType === SelectionContainer::IMAGE_TYPE_LABEL) {
return $this->generateRedirectFromRoute('admin.selection.container.update', [], ['selectionContainerId' => $parentId, 'current_tab' => 'images'], null);
}
return $this->generateRedirectFromRoute('selection.update', [], ['selectionId' => $parentId, 'current_tab' => 'images'], null);
}
}