Files
CloudOps/docker-compose/mautic-setup/mautic-backup-files/docroot/plugins/GrapesJsBuilderBundle/Controller/GrapesJsController.php

137 lines
4.1 KiB
PHP
Executable File

<?php
declare(strict_types=1);
namespace MauticPlugin\GrapesJsBuilderBundle\Controller;
use Mautic\CoreBundle\Controller\CommonController;
use Mautic\CoreBundle\Helper\EmojiHelper;
use Mautic\CoreBundle\Helper\InputHelper;
use Mautic\CoreBundle\Helper\ThemeHelper;
use Mautic\EmailBundle\Entity\Email;
use Mautic\PageBundle\Entity\Page;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class GrapesJsController extends CommonController
{
public const OBJECT_TYPE = ['email', 'page'];
/**
* Activate the custom builder.
*
* @param string $objectType
* @param int $objectId
*
* @return Response
*/
public function builderAction(
Request $request,
LoggerInterface $mauticLogger,
ThemeHelper $themeHelper,
$objectType,
$objectId,
) {
if (!in_array($objectType, self::OBJECT_TYPE)) {
throw new \Exception('Object not authorized to load custom builder', Response::HTTP_CONFLICT);
}
/** @var \Mautic\EmailBundle\Model\EmailModel|\Mautic\PageBundle\Model\PageModel $model */
$model = $this->getModel($objectType);
$aclToCheck = 'email:emails:';
if ('page' === $objectType) {
$aclToCheck = 'page:pages:';
}
// permission check
if (str_contains((string) $objectId, 'new')) {
$isNew = true;
if (!$this->security->isGranted($aclToCheck.'create')) {
return $this->accessDenied();
}
/** @var Email|Page $entity */
$entity = $model->getEntity();
$entity->setSessionId($objectId);
} else {
/** @var Email|Page $entity */
$entity = $model->getEntity($objectId);
$isNew = false;
if (null == $entity
|| !$this->security->hasEntityAccess(
$aclToCheck.'viewown',
$aclToCheck.'viewother',
$entity->getCreatedBy()
)
) {
return $this->accessDenied();
}
}
$type = 'html';
$template = InputHelper::clean($request->query->get('template'));
if (!$template) {
$mauticLogger->warning('Grapesjs: no template in query');
return $this->json(false);
}
$templateName = '@themes/'.$template.'/html/'.$objectType;
$content = $entity->getContent();
// Check for MJML template
// @deprecated - use mjml directly in email.html.twig
if ($logicalName = $this->checkForMjmlTemplate($templateName.'.mjml.twig')) {
$type = 'mjml';
} else {
$logicalName = $themeHelper->checkForTwigTemplate($templateName.'.html.twig');
}
// Replace short codes to emoji
$content = array_map(fn ($text) => EmojiHelper::toEmoji($text, 'short'), $content);
$renderedTemplate = $this->renderView(
$logicalName,
[
'isNew' => $isNew,
'content' => $content,
$objectType => $entity,
'template' => $template,
'basePath' => $request->getBasePath(),
]
);
if (str_contains($renderedTemplate, '<mjml>')) {
$type = 'mjml';
}
$renderedTemplateHtml = ('html' === $type) ? $renderedTemplate : '';
$renderedTemplateMjml = ('mjml' === $type) ? $renderedTemplate : '';
return $this->render(
'@GrapesJsBuilder/Builder/template.html.twig',
[
'templateHtml' => $renderedTemplateHtml,
'templateMjml' => $renderedTemplateMjml,
]
);
}
/**
* @deprecated deprecated since version 5.0 - use mjml directly in email.html.twig
*/
private function checkForMjmlTemplate($template)
{
$twig = $this->container->get('twig');
if ($twig->getLoader()->exists($template)) {
return $template;
}
return null;
}
}