Spaces:
No application file
No application file
| namespace Mautic\CoreBundle\Controller\Api; | |
| use Doctrine\Persistence\ManagerRegistry; | |
| use Mautic\ApiBundle\Controller\CommonApiController; | |
| use Mautic\ApiBundle\Helper\EntityResultHelper; | |
| use Mautic\CoreBundle\Factory\MauticFactory; | |
| use Mautic\CoreBundle\Factory\ModelFactory; | |
| use Mautic\CoreBundle\Helper\AppVersion; | |
| use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
| use Mautic\CoreBundle\Helper\InputHelper; | |
| use Mautic\CoreBundle\Helper\PathsHelper; | |
| use Mautic\CoreBundle\Helper\ThemeHelper; | |
| use Mautic\CoreBundle\Security\Permissions\CorePermissions; | |
| use Mautic\CoreBundle\Translation\Translator; | |
| use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
| use Symfony\Component\Form\FormFactoryInterface; | |
| use Symfony\Component\HttpFoundation\BinaryFileResponse; | |
| use Symfony\Component\HttpFoundation\Request; | |
| use Symfony\Component\HttpFoundation\RequestStack; | |
| use Symfony\Component\HttpFoundation\Response; | |
| use Symfony\Component\HttpFoundation\ResponseHeaderBag; | |
| use Symfony\Component\Routing\RouterInterface; | |
| /** | |
| * @extends CommonApiController<object> | |
| */ | |
| class ThemeApiController extends CommonApiController | |
| { | |
| public function __construct( | |
| CorePermissions $security, | |
| Translator $translator, | |
| EntityResultHelper $entityResultHelper, | |
| RouterInterface $router, | |
| FormFactoryInterface $formFactory, | |
| AppVersion $appVersion, | |
| protected ThemeHelper $themeHelper, | |
| RequestStack $requestStack, | |
| ManagerRegistry $doctrine, | |
| ModelFactory $modelFactory, | |
| EventDispatcherInterface $dispatcher, | |
| CoreParametersHelper $coreParametersHelper, | |
| MauticFactory $factory | |
| ) { | |
| parent::__construct($security, $translator, $entityResultHelper, $router, $formFactory, $appVersion, $requestStack, $doctrine, $modelFactory, $dispatcher, $coreParametersHelper, $factory); | |
| } | |
| /** | |
| * Accepts the zip file and installs the theme from it. | |
| * | |
| * @return Response | |
| */ | |
| public function newAction(Request $request, PathsHelper $pathsHelper) | |
| { | |
| if (!$this->security->isGranted('core:themes:create')) { | |
| return $this->accessDenied(); | |
| } | |
| $response = ['success' => false]; | |
| $themeZip = $request->files->get('file'); | |
| $extension = $themeZip->getClientOriginalExtension(); | |
| if (!$themeZip) { | |
| return $this->returnError( | |
| $this->translator->trans('mautic.core.theme.upload.empty', [], 'validators'), | |
| Response::HTTP_BAD_REQUEST | |
| ); | |
| } elseif ('zip' !== $extension) { | |
| return $this->returnError( | |
| $this->translator->trans('mautic.core.not.allowed.file.extension', ['%extension%' => $extension], 'validators'), | |
| Response::HTTP_BAD_REQUEST | |
| ); | |
| } else { | |
| $fileName = InputHelper::filename($themeZip->getClientOriginalName()); | |
| $themeName = basename($fileName, '.zip'); | |
| $dir = $pathsHelper->getSystemPath('themes', true); | |
| if (!empty($themeZip)) { | |
| try { | |
| $themeZip->move($dir, $fileName); | |
| $response['success'] = $this->themeHelper->install($dir.'/'.$fileName); | |
| } catch (\Exception $e) { | |
| return $this->returnError( | |
| $this->translator->trans($e->getMessage(), [], 'validators') | |
| ); | |
| } | |
| } else { | |
| return $this->returnError( | |
| $this->translator->trans('mautic.dashboard.upload.filenotfound', [], 'validators') | |
| ); | |
| } | |
| } | |
| $view = $this->view($response); | |
| return $this->handleView($view); | |
| } | |
| /** | |
| * Get zip file of a theme. | |
| * | |
| * @param string $theme dir name | |
| * | |
| * @return Response | |
| */ | |
| public function getAction($theme) | |
| { | |
| if (!$this->security->isGranted('core:themes:view')) { | |
| return $this->accessDenied(); | |
| } | |
| try { | |
| $themeZip = $this->themeHelper->zip($theme); | |
| } catch (\Exception $e) { | |
| return $this->returnError($e->getMessage()); | |
| } | |
| if (!$themeZip) { | |
| return $this->returnError( | |
| $this->translator->trans( | |
| 'mautic.core.dir.not.accesssible', | |
| ['%dir%' => $theme] | |
| ) | |
| ); | |
| } | |
| $response = new BinaryFileResponse($themeZip); | |
| $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT); | |
| return $response; | |
| } | |
| /** | |
| * List the folders (themes) in the /themes directory. | |
| * | |
| * @return Response | |
| */ | |
| public function listAction() | |
| { | |
| if (!$this->security->isGranted('core:themes:view')) { | |
| return $this->accessDenied(); | |
| } | |
| try { | |
| $themes = $this->themeHelper->getInstalledThemes('all', true, false, false); | |
| } catch (\Exception $e) { | |
| return $this->returnError($e->getMessage()); | |
| } | |
| $view = $this->view(['themes' => $themes]); | |
| return $this->handleView($view); | |
| } | |
| /** | |
| * Delete a theme. | |
| * | |
| * @param string $theme | |
| * | |
| * @return Response | |
| */ | |
| public function deleteAction($theme) | |
| { | |
| if (!$this->security->isGranted('core:themes:delete')) { | |
| return $this->accessDenied(); | |
| } | |
| try { | |
| $this->themeHelper->delete($theme); | |
| $response = ['success' => true]; | |
| } catch (\Exception $e) { | |
| return $this->returnError($e->getMessage()); | |
| } | |
| $view = $this->view($response); | |
| return $this->handleView($view); | |
| } | |
| } | |