From c2cb18ef37c799027e7a1d1fe0788ff9e60a76b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lys=C3=BD?= Date: Tue, 24 Oct 2023 08:52:11 +0200 Subject: [PATCH] Use render_block_* hooks for rendering changed blocks [MAILPOET-5591] --- .../Engine/Renderer/BlockRenderer.php | 4 +--- .../Engine/Renderer/BlocksRegistry.php | 6 ++++++ .../Engine/Renderer/BlocksRenderer.php | 19 ++++++------------- .../Integrations/Core/Initializer.php | 8 ++++++++ .../Core/Renderer/Blocks/Column.php | 8 +++----- .../Core/Renderer/Blocks/Columns.php | 9 ++++----- .../Core/Renderer/Blocks/Heading.php | 6 ++---- .../Core/Renderer/Blocks/Paragraph.php | 15 +++++++++++---- 8 files changed, 41 insertions(+), 34 deletions(-) diff --git a/mailpoet/lib/EmailEditor/Engine/Renderer/BlockRenderer.php b/mailpoet/lib/EmailEditor/Engine/Renderer/BlockRenderer.php index e758fd613c..e072aec166 100644 --- a/mailpoet/lib/EmailEditor/Engine/Renderer/BlockRenderer.php +++ b/mailpoet/lib/EmailEditor/Engine/Renderer/BlockRenderer.php @@ -2,8 +2,6 @@ namespace MailPoet\EmailEditor\Engine\Renderer; -use MailPoet\EmailEditor\Engine\SettingsController; - interface BlockRenderer { - public function render(array $parsedBlock, BlocksRenderer $blocksRenderer, SettingsController $settingsController): string; + public function render(string $blockContent, array $parsedBlock): string; } diff --git a/mailpoet/lib/EmailEditor/Engine/Renderer/BlocksRegistry.php b/mailpoet/lib/EmailEditor/Engine/Renderer/BlocksRegistry.php index b53926c093..b76d947be2 100644 --- a/mailpoet/lib/EmailEditor/Engine/Renderer/BlocksRegistry.php +++ b/mailpoet/lib/EmailEditor/Engine/Renderer/BlocksRegistry.php @@ -9,6 +9,12 @@ class BlocksRegistry { public function addBlockRenderer(string $blockName, BlockRenderer $renderer): void { $this->blockRenderersMap[$blockName] = $renderer; + add_filter('render_block_' . $blockName, [$renderer, 'render'], 10, 2); + } + + public function removeBlockRenderer(string $blockName, BlockRenderer $renderer): void { + unset($this->blockRenderersMap[$blockName]); + remove_filter('render_block_' . $blockName, [$renderer, 'render']); } public function getBlockRenderer(string $blockName): ?BlockRenderer { diff --git a/mailpoet/lib/EmailEditor/Engine/Renderer/BlocksRenderer.php b/mailpoet/lib/EmailEditor/Engine/Renderer/BlocksRenderer.php index 00448368ad..8d19854cd0 100644 --- a/mailpoet/lib/EmailEditor/Engine/Renderer/BlocksRenderer.php +++ b/mailpoet/lib/EmailEditor/Engine/Renderer/BlocksRenderer.php @@ -2,25 +2,18 @@ namespace MailPoet\EmailEditor\Engine\Renderer; -use MailPoet\EmailEditor\Engine\SettingsController; - class BlocksRenderer { /** @var BlocksRegistry */ private $blockRenderersRegistry; - /** @var SettingsController */ - private $settingsController; - /** @var bool */ private $blocksInitialized = false; public function __construct( - BlocksRegistry $blockRenderersRegistry, - SettingsController $settingsController + BlocksRegistry $blockRenderersRegistry ) { $this->blockRenderersRegistry = $blockRenderersRegistry; - $this->settingsController = $settingsController; } public function render(array $parsedBlocks): string { @@ -31,12 +24,12 @@ class BlocksRenderer { $content = ''; foreach ($parsedBlocks as $parsedBlock) { - $blockRenderer = $this->blockRenderersRegistry->getBlockRenderer($parsedBlock['blockName'] ?? ''); - if (!$blockRenderer) { - continue; - } - $content .= $blockRenderer->render($parsedBlock, $this, $this->settingsController); + $content .= render_block($parsedBlock); } + + do_action('mailpoet_blocks_renderer_uninitialized', $this->blockRenderersRegistry); + $this->blocksInitialized = false; + return $content; } } diff --git a/mailpoet/lib/EmailEditor/Integrations/Core/Initializer.php b/mailpoet/lib/EmailEditor/Integrations/Core/Initializer.php index 2296760e23..61cc71f48d 100644 --- a/mailpoet/lib/EmailEditor/Integrations/Core/Initializer.php +++ b/mailpoet/lib/EmailEditor/Integrations/Core/Initializer.php @@ -7,6 +7,7 @@ use MailPoet\EmailEditor\Engine\Renderer\BlocksRegistry; class Initializer { public function initialize(): void { add_action('mailpoet_blocks_renderer_initialized', [$this, 'registerCoreBlocksRenderers'], 10, 1); + add_action('mailpoet_blocks_renderer_uninitialized', [$this, 'unregisterCoreBlocksRenderers'], 10, 1); } /** @@ -18,4 +19,11 @@ class Initializer { $blocksRegistry->addBlockRenderer('core/column', new Renderer\Blocks\Column()); $blocksRegistry->addBlockRenderer('core/columns', new Renderer\Blocks\Columns()); } + + public function unregisterCoreBlocksRenderers(BlocksRegistry $blocksRegistry): void { + $blocksRegistry->removeBlockRenderer('core/paragraph', new Renderer\Blocks\Paragraph()); + $blocksRegistry->removeBlockRenderer('core/heading', new Renderer\Blocks\Heading()); + $blocksRegistry->removeBlockRenderer('core/column', new Renderer\Blocks\Column()); + $blocksRegistry->removeBlockRenderer('core/columns', new Renderer\Blocks\Columns()); + } } diff --git a/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Column.php b/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Column.php index 3ce59d8af9..324d680b22 100644 --- a/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Column.php +++ b/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Column.php @@ -3,14 +3,12 @@ namespace MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks; use MailPoet\EmailEditor\Engine\Renderer\BlockRenderer; -use MailPoet\EmailEditor\Engine\Renderer\BlocksRenderer; -use MailPoet\EmailEditor\Engine\SettingsController; class Column implements BlockRenderer { - public function render($parsedBlock, BlocksRenderer $blocksRenderer, SettingsController $settingsController): string { + public function render($blockContent, array $parsedBlock): string { $content = ''; - if (isset($parsedBlock['innerBlocks']) && !empty($parsedBlock['innerBlocks'])) { - $content = $blocksRenderer->render($parsedBlock['innerBlocks']); + foreach ($parsedBlock['innerBlocks'] ?? [] as $block) { + $content .= render_block($block); } return str_replace( diff --git a/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Columns.php b/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Columns.php index 456d69ce3f..cda7f11db1 100644 --- a/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Columns.php +++ b/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Columns.php @@ -3,15 +3,14 @@ namespace MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks; use MailPoet\EmailEditor\Engine\Renderer\BlockRenderer; -use MailPoet\EmailEditor\Engine\Renderer\BlocksRenderer; -use MailPoet\EmailEditor\Engine\SettingsController; class Columns implements BlockRenderer { - public function render($parsedBlock, BlocksRenderer $blocksRenderer, SettingsController $settingsController): string { + public function render($blockContent, array $parsedBlock): string { $content = ''; - if (isset($parsedBlock['innerBlocks']) && !empty($parsedBlock['innerBlocks'])) { - $content = $blocksRenderer->render($parsedBlock['innerBlocks']); + foreach ($parsedBlock['innerBlocks'] ?? [] as $block) { + $content .= render_block($block); } + return str_replace( '{columns_content}', $content, diff --git a/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Heading.php b/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Heading.php index e14f7a9181..564f5b2cf1 100644 --- a/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Heading.php +++ b/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Heading.php @@ -3,11 +3,9 @@ namespace MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks; use MailPoet\EmailEditor\Engine\Renderer\BlockRenderer; -use MailPoet\EmailEditor\Engine\Renderer\BlocksRenderer; -use MailPoet\EmailEditor\Engine\SettingsController; class Heading implements BlockRenderer { - public function render($parsedBlock, BlocksRenderer $blocksRenderer, SettingsController $settingsController): string { - return $parsedBlock['innerHTML'] ?? ''; + public function render($blockContent, array $parsedBlock): string { + return $blockContent; } } diff --git a/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Paragraph.php b/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Paragraph.php index a380674d27..c2b704390a 100644 --- a/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Paragraph.php +++ b/mailpoet/lib/EmailEditor/Integrations/Core/Renderer/Blocks/Paragraph.php @@ -2,14 +2,21 @@ namespace MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks; +use MailPoet\DI\ContainerWrapper; use MailPoet\EmailEditor\Engine\Renderer\BlockRenderer; -use MailPoet\EmailEditor\Engine\Renderer\BlocksRenderer; use MailPoet\EmailEditor\Engine\SettingsController; class Paragraph implements BlockRenderer { - public function render($parsedBlock, BlocksRenderer $blocksRenderer, SettingsController $settingsController): string { - $contentStyles = $settingsController->getEmailContentStyles(); - return str_replace('{paragraph_content}', $parsedBlock['innerHTML'] ?? '', $this->prepareColumnTemplate($parsedBlock, $contentStyles)); + + private $settingsController; + + public function __construct() { + $this->settingsController = ContainerWrapper::getInstance()->get(SettingsController::class); + } + + public function render($blockContent, array $parsedBlock): string { + $contentStyles = $this->settingsController->getEmailContentStyles(); + return str_replace('{paragraph_content}', $blockContent, $this->prepareColumnTemplate($parsedBlock, $contentStyles)); } /**