diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index 961c8a6806..b12a0616e8 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -192,6 +192,7 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\Form\Block\Text::class); $container->autowire(\MailPoet\Form\Block\Textarea::class); $container->autowire(\MailPoet\Form\FormFactory::class); + $container->autowire(\MailPoet\Form\PreviewPage::class); $container->autowire(\MailPoet\Form\Util\Styles::class); // Helpscout $container->autowire(\MailPoet\Helpscout\Beacon::class); diff --git a/lib/Form/PreviewPage.php b/lib/Form/PreviewPage.php new file mode 100644 index 0000000000..cf69811872 --- /dev/null +++ b/lib/Form/PreviewPage.php @@ -0,0 +1,107 @@ +wp = $wp; + $this->formRenderer = $formRenderer; + $this->templateRenderer = $templateRenderer; + $this->formRepository = $formRepository; + $this->assetsController = $assetsController; + } + + public function renderPage(int $formId, string $formType): string { + $this->assetsController->setupFrontEndDependencies(); + $formData = $this->fetchFormData($formId); + if (!is_array($formData)) { + return ''; + } + return $this->getPostContent() . $this->getFormContent($formData, $formId, $formType); + } + + public function renderTitle() { + return __('Sample page to preview your form', 'mailpoet'); + } + + /** + * @return array|null + */ + private function fetchFormData(int $id) { + $form = $this->formRepository->findOneById($id); + if ($form) { + return [ + 'body' => $form->getBody(), + 'styles' => $form->getStyles(), + 'settings' => $form->getSettings(), + ]; + } + return null; + } + + private function getFormContent(array $formData, int $formId, string $formType): string { + $htmlId = 'mailpoet_form_preview_' . $formId; + $templateData = [ + 'is_preview' => true, + 'form_html_id' => $htmlId, + 'form_id' => $formId, + 'form_success_message' => $formData['settings']['success_message'] ?? null, + 'form_type' => $formType, + 'styles' => $this->formRenderer->renderStyles($formData, '#' . $htmlId), + 'html' => $this->formRenderer->renderHTML($formData), + 'form_element_styles' => $this->formRenderer->renderFormElementStyles($formData), + 'success' => true, + 'error' => true, + 'delay' => 1, + 'position' => $formData['settings'][$formType . '_form_position'] ?? '', + 'backgroundColor' => $formData['settings']['backgroundColor'] ?? '', + ]; + $formPosition = $formData['settings'][$formType . '_form_position'] ?? ''; + if (!$formPosition && $formType === 'fixed_bar') { + $formPosition = 'top'; + } + if (!$formPosition && $formType === 'slide_in') { + $formPosition = 'left'; + } + $templateData['position'] = $formPosition; + return $this->templateRenderer->render('form/front_end_form.html', $templateData); + } + + private function getPostContent(): string { + $posts = $this->wp->getPosts([ + 'numberposts' => 1, + 'orderby' => 'date', + 'order' => 'DESC', + 'post_status' => 'publish', + 'post_type' => 'post', + ]); + if (!isset($posts[0])) { + return ''; + } + return $posts[0]->post_content; + } +} diff --git a/lib/Router/Endpoints/FormPreview.php b/lib/Router/Endpoints/FormPreview.php index 48e7d8818d..790ae47a39 100644 --- a/lib/Router/Endpoints/FormPreview.php +++ b/lib/Router/Endpoints/FormPreview.php @@ -3,6 +3,7 @@ namespace MailPoet\Router\Endpoints; use MailPoet\Config\AccessControl; +use MailPoet\Form\PreviewPage; use MailPoet\WP\Functions as WPFunctions; class FormPreview { @@ -15,31 +16,35 @@ class FormPreview { /** @var array|null */ private $data; + /** @var PreviewPage */ + private $formPreviewPage; + public $allowedActions = [self::ACTION_VIEW]; public $permissions = [ 'global' => AccessControl::NO_ACCESS_RESTRICTION, ]; public function __construct( - WPFunctions $wp + WPFunctions $wp, + PreviewPage $formPreviewPage ) { $this->wp = $wp; + $this->formPreviewPage = $formPreviewPage; } public function view(array $data) { $this->data = $data; $this->wp->addFilter('the_content', [$this,'renderContent'], 10); - $this->wp->addFilter('the_title', [$this,'renderTitle'], 10); + $this->wp->addFilter('the_title', [$this->formPreviewPage,'renderTitle'], 10); $this->wp->addFilter('show_admin_bar', function () { return false; }); } public function renderContent(): string { - return '