暫無描述

Renderer.php 2.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <?php
  2. namespace MailPoet\WooCommerce\TransactionalEmails;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Models\Newsletter;
  5. use MailPoet\Newsletter\Renderer\Renderer as NewsletterRenderer;
  6. use MailPoetVendor\csstidy;
  7. use MailPoetVendor\csstidy_print;
  8. class Renderer {
  9. const CONTENT_CONTAINER_ID = 'mailpoet_woocommerce_container';
  10. /** @var csstidy */
  11. private $cssParser;
  12. /** @var NewsletterRenderer */
  13. private $renderer;
  14. /** @var string */
  15. private $htmlBeforeContent;
  16. /** @var string */
  17. private $htmlAfterContent;
  18. public function __construct(
  19. csstidy $cssParser,
  20. NewsletterRenderer $renderer
  21. ) {
  22. $this->cssParser = $cssParser;
  23. $this->htmlBeforeContent = '';
  24. $this->htmlAfterContent = '';
  25. $this->renderer = $renderer;
  26. }
  27. public function render(Newsletter $newsletter, ?string $subject = null) {
  28. $renderedHtml = $this->renderer->renderAsPreview($newsletter, 'html', $subject);
  29. $headingText = $subject ?? '';
  30. $renderedHtml = str_replace(ContentPreprocessor::WC_HEADING_PLACEHOLDER, $headingText, $renderedHtml);
  31. $html = explode(ContentPreprocessor::WC_CONTENT_PLACEHOLDER, $renderedHtml);
  32. $this->htmlBeforeContent = $html[0];
  33. $this->htmlAfterContent = $html[1];
  34. }
  35. public function getHTMLBeforeContent() {
  36. if (empty($this->htmlBeforeContent)) {
  37. throw new \Exception("You should call 'render' before 'getHTMLBeforeContent'");
  38. }
  39. return $this->htmlBeforeContent . '<div id="' . self::CONTENT_CONTAINER_ID . '"><div id="body_content"><div id="body_content_inner"><table style="width: 100%"><tr><td style="padding: 10px 20px">';
  40. }
  41. public function getHTMLAfterContent() {
  42. if (empty($this->htmlAfterContent)) {
  43. throw new \Exception("You should call 'render' before 'getHTMLAfterContent'");
  44. }
  45. return '</td></tr></table></div></div></div>' . $this->htmlAfterContent;
  46. }
  47. public function prefixCss($css) {
  48. $this->cssParser->settings['compress_colors'] = false;
  49. $this->cssParser->parse($css);
  50. foreach ($this->cssParser->css as $index => $rules) {
  51. $this->cssParser->css[$index] = [];
  52. foreach ($rules as $selectors => $properties) {
  53. $selectors = explode(',', $selectors);
  54. $selectors = array_map(function($selector) {
  55. return '#' . self::CONTENT_CONTAINER_ID . ' ' . $selector;
  56. }, $selectors);
  57. $selectors = implode(',', $selectors);
  58. $this->cssParser->css[$index][$selectors] = $properties;
  59. }
  60. }
  61. /** @var csstidy_print */
  62. $print = $this->cssParser->print;
  63. return $print->plain();
  64. }
  65. }