No Description

ViewInBrowserRenderer.php 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. namespace MailPoet\Newsletter\ViewInBrowser;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Entities\NewsletterEntity;
  5. use MailPoet\Entities\SendingQueueEntity;
  6. use MailPoet\Entities\SubscriberEntity;
  7. use MailPoet\Newsletter\Links\Links;
  8. use MailPoet\Newsletter\Renderer\Renderer;
  9. use MailPoet\Newsletter\Shortcodes\Shortcodes;
  10. use MailPoet\Settings\SettingsController;
  11. use MailPoet\WP\Emoji;
  12. class ViewInBrowserRenderer {
  13. /** @var Emoji */
  14. private $emoji;
  15. /** @var bool */
  16. private $isTrackingEnabled;
  17. /** @var Renderer */
  18. private $renderer;
  19. /** @var Shortcodes */
  20. private $shortcodes;
  21. /** @var Links */
  22. private $links;
  23. public function __construct(
  24. Emoji $emoji,
  25. SettingsController $settings,
  26. Shortcodes $shortcodes,
  27. Renderer $renderer,
  28. Links $links
  29. ) {
  30. $this->emoji = $emoji;
  31. $this->isTrackingEnabled = $settings->get('tracking.enabled');
  32. $this->renderer = $renderer;
  33. $this->shortcodes = $shortcodes;
  34. $this->links = $links;
  35. }
  36. public function render(
  37. bool $isPreview,
  38. NewsletterEntity $newsletter,
  39. SubscriberEntity $subscriber = null,
  40. SendingQueueEntity $queue = null
  41. ) {
  42. $wpUserPreview = $isPreview;
  43. if ($queue && $queue->getNewsletterRenderedBody()) {
  44. $body = $queue->getNewsletterRenderedBody();
  45. if (is_array($body)) {
  46. $newsletterBody = $body['html'];
  47. } else {
  48. $newsletterBody = '';
  49. }
  50. $newsletterBody = $this->emoji->decodeEmojisInBody($newsletterBody);
  51. // rendered newsletter body has shortcodes converted to links; we need to
  52. // isolate "view in browser", "unsubscribe" and "manage subscription" links
  53. // and convert them to shortcodes, which later will be replaced with "#" when
  54. // newsletter is previewed
  55. if ($wpUserPreview && preg_match($this->links->getLinkRegex(), $newsletterBody)) {
  56. $newsletterBody = $this->links->convertHashedLinksToShortcodesAndUrls(
  57. $newsletterBody,
  58. $queue->getId(),
  59. $convertAll = true
  60. );
  61. // remove open tracking link
  62. $newsletterBody = str_replace(Links::DATA_TAG_OPEN, '', $newsletterBody);
  63. }
  64. } else {
  65. if ($wpUserPreview) {
  66. $newsletterBody = $this->renderer->renderAsPreview($newsletter, 'html');
  67. } else {
  68. $newsletterBody = $this->renderer->render($newsletter, $sendingTask = null, 'html');
  69. }
  70. }
  71. $this->prepareShortcodes(
  72. $newsletter,
  73. $subscriber ?: false,
  74. $queue ?: false,
  75. $wpUserPreview
  76. );
  77. $renderedNewsletter = $this->shortcodes->replace($newsletterBody);
  78. if (!$wpUserPreview && $queue && $subscriber && $this->isTrackingEnabled) {
  79. $renderedNewsletter = $this->links->replaceSubscriberData(
  80. $subscriber->getId(),
  81. $queue->getId(),
  82. $renderedNewsletter
  83. );
  84. }
  85. return $renderedNewsletter;
  86. }
  87. private function prepareShortcodes($newsletter, $subscriber, $queue, $wpUserPreview) {
  88. if ($queue instanceof SendingQueueEntity) {
  89. $this->shortcodes->setQueue($queue);
  90. }
  91. if ($newsletter instanceof NewsletterEntity) {
  92. $this->shortcodes->setNewsletter($newsletter);
  93. }
  94. $this->shortcodes->setWpUserPreview($wpUserPreview);
  95. if ($subscriber instanceof SubscriberEntity) {
  96. $this->shortcodes->setSubscriber($subscriber);
  97. }
  98. }
  99. }