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(); } } $slots = []; $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'); $slots = $themeHelper->getTheme($template)->getSlots($objectType); // merge any existing changes $newContent = $request->getSession()->get('mautic.'.$objectType.'builder.'.$objectId.'.content', []); if (is_array($newContent)) { $content = array_merge($content, $newContent); // Update the content for processSlots $entity->setContent($content); } if ('page' === $objectType) { $this->processPageSlots($assetsHelper, $slotsHelper, $formFactory, $slots, $entity); } else { $this->processEmailSlots($slotsHelper, $slots, $entity); } } // Replace short codes to emoji $content = array_map(fn ($text) => EmojiHelper::toEmoji($text, 'short'), $content); $renderedTemplate = $this->renderView( $logicalName, [ 'isNew' => $isNew, 'slots' => $slots, 'content' => $content, $objectType => $entity, 'template' => $template, 'basePath' => $request->getBasePath(), ] ); if (str_contains($renderedTemplate, '')) { $type = 'mjml'; } $renderedTemplateHtml = ('html' === $type) ? $renderedTemplate : ''; $renderedTemplateMjml = ('mjml' === $type) ? $renderedTemplate : ''; return $this->render( '@GrapesJsBuilder/Builder/template.html.twig', [ 'templateHtml' => $renderedTemplateHtml, 'templateMjml' => $renderedTemplateMjml, ] ); } /** * PreProcess email slots for public view. * * @param array $slots * @param Email $entity */ private function processEmailSlots(SlotsHelper $slotsHelper, $slots, $entity): void { $content = $entity->getContent(); // Set the slots foreach ($slots as $slot => $slotConfig) { // support previous format where email slots are not defined with config array if (is_numeric($slot)) { $slot = $slotConfig; $slotConfig = []; } $value = $content[$slot] ?? ''; $slotsHelper->set($slot, "
{$value}
"); } // add builder toolbar $slotsHelper->start('builder'); ?> stop(); } /** * PreProcess page slots for public view. * * @param array $slots * @param Page $entity */ private function processPageSlots(AssetsHelper $assetsHelper, SlotsHelper $slotsHelper, FormFactoryInterface $formFactory, $slots, $entity): void { $slotsHelper->inBuilder(true); $content = $entity->getContent(); foreach ($slots as $slot => $slotConfig) { // backward compatibility - if slotConfig array does not exist if (is_numeric($slot)) { $slot = $slotConfig; $slotConfig = []; } // define default config if does not exist if (!isset($slotConfig['type'])) { $slotConfig['type'] = 'html'; } if (!isset($slotConfig['placeholder'])) { $slotConfig['placeholder'] = 'mautic.page.builder.addcontent'; } $value = $content[$slot] ?? ''; if ('slideshow' == $slotConfig['type']) { if (isset($content[$slot])) { $options = json_decode($content[$slot], true); } else { $options = [ 'width' => '100%', 'height' => '250px', 'background_color' => 'transparent', 'arrow_navigation' => false, 'dot_navigation' => true, 'interval' => 5000, 'pause' => 'hover', 'wrap' => true, 'keyboard' => true, ]; } // Create sample slides for first time or if all slides were deleted if (empty($options['slides'])) { $options['slides'] = [ [ 'order' => 0, 'background-image' => $assetsHelper->getOverridableUrl('images/mautic_logo_lb200.png'), 'captionheader' => 'Caption 1', ], [ 'order' => 1, 'background-image' => $assetsHelper->getOverridableUrl('images/mautic_logo_db200.png'), 'captionheader' => 'Caption 2', ], ]; } // Order slides usort( $options['slides'], fn ($a, $b): int => strcmp($a['order'], $b['order']) ); $options['slot'] = $slot; $options['public'] = false; // create config form $options['configForm'] = $formFactory->createNamedBuilder( '', 'slideshow_config', [], ['data' => $options] )->getForm()->createView(); // create slide config forms foreach ($options['slides'] as $key => &$slide) { $slide['key'] = $key; $slide['slot'] = $slot; $slide['form'] = $formFactory->createNamedBuilder( '', 'slideshow_slide_config', [], ['data' => $slide] )->getForm()->createView(); } } else { $slotsHelper->set($slot, "
{$value}
"); } } $slotsHelper->start('builder'); ?> stop(); } /** * @deprecated deprecated since version 5.0 - use mjml directly in email.html.twig */ private function checkForMjmlTemplate($template) { $twig = $this->get('twig'); if ($twig->getLoader()->exists($template)) { return $template; } return null; } }