Keine Beschreibung

Renderer.php 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. namespace MailPoet\Newsletter\Renderer\Blocks;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Entities\NewsletterEntity;
  5. use MailPoet\Newsletter\Renderer\Columns\ColumnsHelper;
  6. use MailPoet\Newsletter\Renderer\StylesHelper;
  7. class Renderer {
  8. /** @var AutomatedLatestContentBlock */
  9. private $ALC;
  10. /** @var Button */
  11. private $button;
  12. /** @var Divider */
  13. private $divider;
  14. /** @var Footer */
  15. private $footer;
  16. /** @var Header */
  17. private $header;
  18. /** @var Image */
  19. private $image;
  20. /** @var Social */
  21. private $social;
  22. /** @var Spacer */
  23. private $spacer;
  24. /** @var Text */
  25. private $text;
  26. /** @var Placeholder */
  27. private $placeholder;
  28. public function __construct(
  29. AutomatedLatestContentBlock $ALC,
  30. Button $button,
  31. Divider $divider,
  32. Footer $footer,
  33. Header $header,
  34. Image $image,
  35. Social $social,
  36. Spacer $spacer,
  37. Text $text,
  38. Placeholder $placeholder
  39. ) {
  40. $this->ALC = $ALC;
  41. $this->button = $button;
  42. $this->divider = $divider;
  43. $this->footer = $footer;
  44. $this->header = $header;
  45. $this->image = $image;
  46. $this->social = $social;
  47. $this->spacer = $spacer;
  48. $this->text = $text;
  49. $this->placeholder = $placeholder;
  50. }
  51. public function render(NewsletterEntity $newsletter, $data) {
  52. if (is_null($data['blocks']) && isset($data['type'])) {
  53. return null;
  54. }
  55. $columnCount = count($data['blocks']);
  56. $columnsLayout = isset($data['columnLayout']) ? $data['columnLayout'] : null;
  57. $columnWidths = ColumnsHelper::columnWidth($columnCount, $columnsLayout);
  58. $columnContent = [];
  59. foreach ($data['blocks'] as $index => $columnBlocks) {
  60. $renderedBlockElement = $this->renderBlocksInColumn($newsletter, $columnBlocks, $columnWidths[$index]);
  61. $columnContent[] = $renderedBlockElement;
  62. }
  63. return $columnContent;
  64. }
  65. private function renderBlocksInColumn(NewsletterEntity $newsletter, $block, $columnBaseWidth) {
  66. $blockContent = '';
  67. $_this = $this;
  68. array_map(function($block) use (&$blockContent, $columnBaseWidth, $newsletter, $_this) {
  69. $renderedBlockElement = $_this->createElementFromBlockType($newsletter, $block, $columnBaseWidth);
  70. if (isset($block['blocks'])) {
  71. $renderedBlockElement = $_this->renderBlocksInColumn($newsletter, $block, $columnBaseWidth);
  72. // nested vertical column container is rendered as an array
  73. if (is_array($renderedBlockElement)) {
  74. $renderedBlockElement = implode('', $renderedBlockElement);
  75. }
  76. }
  77. $blockContent .= $renderedBlockElement;
  78. }, $block['blocks']);
  79. return $blockContent;
  80. }
  81. public function createElementFromBlockType(NewsletterEntity $newsletter, $block, $columnBaseWidth) {
  82. if ($block['type'] === 'automatedLatestContent') {
  83. return $this->processAutomatedLatestContent($newsletter, $block, $columnBaseWidth);
  84. }
  85. $block = StylesHelper::applyTextAlignment($block);
  86. switch ($block['type']) {
  87. case 'button':
  88. return $this->button->render($block, $columnBaseWidth);
  89. case 'divider':
  90. return $this->divider->render($block);
  91. case 'footer':
  92. return $this->footer->render($block);
  93. case 'header':
  94. return $this->header->render($block);
  95. case 'image':
  96. return $this->image->render($block, $columnBaseWidth);
  97. case 'social':
  98. return $this->social->render($block);
  99. case 'spacer':
  100. return $this->spacer->render($block);
  101. case 'text':
  102. return $this->text->render($block);
  103. case 'placeholder':
  104. return $this->placeholder->render($block);
  105. }
  106. return "<!-- Skipped unsupported block type: {$block['type']} -->";
  107. }
  108. public function processAutomatedLatestContent(NewsletterEntity $newsletter, $args, $columnBaseWidth) {
  109. $transformedPosts = [
  110. 'blocks' => $this->ALC->render($newsletter, $args),
  111. ];
  112. $transformedPosts = StylesHelper::applyTextAlignment($transformedPosts);
  113. return $this->renderBlocksInColumn($newsletter, $transformedPosts, $columnBaseWidth);
  114. }
  115. }