Нет описания

PreviewPage.php 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. namespace MailPoet\Form;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Config\Renderer as TemplateRenderer;
  5. use MailPoet\Entities\FormEntity;
  6. use MailPoet\WP\Functions as WPFunctions;
  7. class PreviewPage {
  8. const PREVIEW_DATA_TRANSIENT_PREFIX = 'mailpoet_form_preview_';
  9. const PREVIEW_DATA_EXPIRATION = 84600; // 1 DAY
  10. /** @var WPFunctions */
  11. private $wp;
  12. /** @var Renderer */
  13. private $formRenderer;
  14. /** @var TemplateRenderer */
  15. private $templateRenderer;
  16. /** @var FormsRepository */
  17. private $formRepository;
  18. /** @var AssetsController */
  19. private $assetsController;
  20. public function __construct(
  21. WPFunctions $wp,
  22. Renderer $formRenderer,
  23. TemplateRenderer $templateRenderer,
  24. FormsRepository $formRepository,
  25. AssetsController $assetsController
  26. ) {
  27. $this->wp = $wp;
  28. $this->formRenderer = $formRenderer;
  29. $this->templateRenderer = $templateRenderer;
  30. $this->formRepository = $formRepository;
  31. $this->assetsController = $assetsController;
  32. }
  33. public function renderPage(int $formId, string $formType, string $editorUrl): string {
  34. $this->assetsController->setupFormPreviewDependencies();
  35. $formData = $this->fetchFormData($formId);
  36. if (!$formData instanceof FormEntity) {
  37. return '';
  38. }
  39. return $this->templateRenderer->render(
  40. 'form/form_preview.html',
  41. [
  42. 'post' => $this->getPostContent(),
  43. 'form' => $this->getFormContent($formData, $formId, $formType, $editorUrl),
  44. 'formType' => $formType,
  45. ]
  46. );
  47. }
  48. public function renderTitle($title = null, $id = null) {
  49. if ($id !== $this->wp->getTheId()) {
  50. return $title;
  51. }
  52. return __('Sample page to preview your form', 'mailpoet');
  53. }
  54. private function fetchFormData(int $id): ?FormEntity {
  55. $formData = $this->wp->getTransient(self::PREVIEW_DATA_TRANSIENT_PREFIX . $id);
  56. if (is_array($formData)) {
  57. $form = new FormEntity($formData['name']);
  58. $form->setId($formData['id'] ?? 0);
  59. $form->setBody($formData['body']);
  60. $form->setSettings($formData['settings']);
  61. $form->setStyles($formData['styles']);
  62. $form->setStatus($formData['status']);
  63. return $form;
  64. }
  65. return $this->formRepository->findOneById($id);
  66. }
  67. private function getFormContent(FormEntity $form, int $formId, string $formDisplayType, string $editorUrl): string {
  68. $settings = $form->getSettings();
  69. $htmlId = 'mailpoet_form_preview_' . $formId;
  70. $templateData = [
  71. 'is_preview' => true,
  72. 'editor_url' => $editorUrl,
  73. 'form_html_id' => $htmlId,
  74. 'form_id' => $formId,
  75. 'form_success_message' => $settings['success_message'] ?? null,
  76. 'form_type' => $formDisplayType,
  77. 'close_button_icon' => $settings['close_button'] ?? 'classic',
  78. 'styles' => $this->formRenderer->renderStyles($form, '#' . $htmlId, $formDisplayType),
  79. 'html' => $this->formRenderer->renderHTML($form),
  80. 'success' => false,
  81. 'error' => false,
  82. 'delay' => 1,
  83. 'position' => $settings['form_placement'][$formDisplayType]['position'] ?? '',
  84. 'animation' => $settings['form_placement'][$formDisplayType]['animation'] ?? '',
  85. 'fontFamily' => $settings['font_family'] ?? '',
  86. ];
  87. $formPosition = $settings['form_placement'][$formDisplayType]['position'] ?? '';
  88. if (!$formPosition && $formDisplayType === FormEntity::DISPLAY_TYPE_FIXED_BAR) {
  89. $formPosition = 'top';
  90. }
  91. if (!$formPosition && $formDisplayType === FormEntity::DISPLAY_TYPE_SLIDE_IN) {
  92. $formPosition = 'right';
  93. }
  94. $templateData['position'] = $formPosition;
  95. return $this->templateRenderer->render('form/front_end_form.html', $templateData);
  96. }
  97. private function getPostContent(): string {
  98. $posts = $this->wp->getPosts([
  99. 'numberposts' => 1,
  100. 'orderby' => 'date',
  101. 'order' => 'DESC',
  102. 'post_status' => 'publish',
  103. 'post_type' => 'post',
  104. ]);
  105. if (!isset($posts[0])) {
  106. return '';
  107. }
  108. return $posts[0]->post_content;
  109. }
  110. }