Use render_block_* hooks for rendering changed blocks

[MAILPOET-5591]
This commit is contained in:
Jan Lysý
2023-10-24 08:52:11 +02:00
committed by Jan Lysý
parent 4f9e3723c9
commit c2cb18ef37
8 changed files with 41 additions and 34 deletions

View File

@@ -2,8 +2,6 @@
namespace MailPoet\EmailEditor\Engine\Renderer; namespace MailPoet\EmailEditor\Engine\Renderer;
use MailPoet\EmailEditor\Engine\SettingsController;
interface BlockRenderer { interface BlockRenderer {
public function render(array $parsedBlock, BlocksRenderer $blocksRenderer, SettingsController $settingsController): string; public function render(string $blockContent, array $parsedBlock): string;
} }

View File

@@ -9,6 +9,12 @@ class BlocksRegistry {
public function addBlockRenderer(string $blockName, BlockRenderer $renderer): void { public function addBlockRenderer(string $blockName, BlockRenderer $renderer): void {
$this->blockRenderersMap[$blockName] = $renderer; $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 { public function getBlockRenderer(string $blockName): ?BlockRenderer {

View File

@@ -2,25 +2,18 @@
namespace MailPoet\EmailEditor\Engine\Renderer; namespace MailPoet\EmailEditor\Engine\Renderer;
use MailPoet\EmailEditor\Engine\SettingsController;
class BlocksRenderer { class BlocksRenderer {
/** @var BlocksRegistry */ /** @var BlocksRegistry */
private $blockRenderersRegistry; private $blockRenderersRegistry;
/** @var SettingsController */
private $settingsController;
/** @var bool */ /** @var bool */
private $blocksInitialized = false; private $blocksInitialized = false;
public function __construct( public function __construct(
BlocksRegistry $blockRenderersRegistry, BlocksRegistry $blockRenderersRegistry
SettingsController $settingsController
) { ) {
$this->blockRenderersRegistry = $blockRenderersRegistry; $this->blockRenderersRegistry = $blockRenderersRegistry;
$this->settingsController = $settingsController;
} }
public function render(array $parsedBlocks): string { public function render(array $parsedBlocks): string {
@@ -31,12 +24,12 @@ class BlocksRenderer {
$content = ''; $content = '';
foreach ($parsedBlocks as $parsedBlock) { foreach ($parsedBlocks as $parsedBlock) {
$blockRenderer = $this->blockRenderersRegistry->getBlockRenderer($parsedBlock['blockName'] ?? ''); $content .= render_block($parsedBlock);
if (!$blockRenderer) {
continue;
}
$content .= $blockRenderer->render($parsedBlock, $this, $this->settingsController);
} }
do_action('mailpoet_blocks_renderer_uninitialized', $this->blockRenderersRegistry);
$this->blocksInitialized = false;
return $content; return $content;
} }
} }

View File

@@ -7,6 +7,7 @@ use MailPoet\EmailEditor\Engine\Renderer\BlocksRegistry;
class Initializer { class Initializer {
public function initialize(): void { public function initialize(): void {
add_action('mailpoet_blocks_renderer_initialized', [$this, 'registerCoreBlocksRenderers'], 10, 1); 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/column', new Renderer\Blocks\Column());
$blocksRegistry->addBlockRenderer('core/columns', new Renderer\Blocks\Columns()); $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());
}
} }

View File

@@ -3,14 +3,12 @@
namespace MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks; namespace MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks;
use MailPoet\EmailEditor\Engine\Renderer\BlockRenderer; use MailPoet\EmailEditor\Engine\Renderer\BlockRenderer;
use MailPoet\EmailEditor\Engine\Renderer\BlocksRenderer;
use MailPoet\EmailEditor\Engine\SettingsController;
class Column implements BlockRenderer { class Column implements BlockRenderer {
public function render($parsedBlock, BlocksRenderer $blocksRenderer, SettingsController $settingsController): string { public function render($blockContent, array $parsedBlock): string {
$content = ''; $content = '';
if (isset($parsedBlock['innerBlocks']) && !empty($parsedBlock['innerBlocks'])) { foreach ($parsedBlock['innerBlocks'] ?? [] as $block) {
$content = $blocksRenderer->render($parsedBlock['innerBlocks']); $content .= render_block($block);
} }
return str_replace( return str_replace(

View File

@@ -3,15 +3,14 @@
namespace MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks; namespace MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks;
use MailPoet\EmailEditor\Engine\Renderer\BlockRenderer; use MailPoet\EmailEditor\Engine\Renderer\BlockRenderer;
use MailPoet\EmailEditor\Engine\Renderer\BlocksRenderer;
use MailPoet\EmailEditor\Engine\SettingsController;
class Columns implements BlockRenderer { class Columns implements BlockRenderer {
public function render($parsedBlock, BlocksRenderer $blocksRenderer, SettingsController $settingsController): string { public function render($blockContent, array $parsedBlock): string {
$content = ''; $content = '';
if (isset($parsedBlock['innerBlocks']) && !empty($parsedBlock['innerBlocks'])) { foreach ($parsedBlock['innerBlocks'] ?? [] as $block) {
$content = $blocksRenderer->render($parsedBlock['innerBlocks']); $content .= render_block($block);
} }
return str_replace( return str_replace(
'{columns_content}', '{columns_content}',
$content, $content,

View File

@@ -3,11 +3,9 @@
namespace MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks; namespace MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks;
use MailPoet\EmailEditor\Engine\Renderer\BlockRenderer; use MailPoet\EmailEditor\Engine\Renderer\BlockRenderer;
use MailPoet\EmailEditor\Engine\Renderer\BlocksRenderer;
use MailPoet\EmailEditor\Engine\SettingsController;
class Heading implements BlockRenderer { class Heading implements BlockRenderer {
public function render($parsedBlock, BlocksRenderer $blocksRenderer, SettingsController $settingsController): string { public function render($blockContent, array $parsedBlock): string {
return $parsedBlock['innerHTML'] ?? ''; return $blockContent;
} }
} }

View File

@@ -2,14 +2,21 @@
namespace MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks; namespace MailPoet\EmailEditor\Integrations\Core\Renderer\Blocks;
use MailPoet\DI\ContainerWrapper;
use MailPoet\EmailEditor\Engine\Renderer\BlockRenderer; use MailPoet\EmailEditor\Engine\Renderer\BlockRenderer;
use MailPoet\EmailEditor\Engine\Renderer\BlocksRenderer;
use MailPoet\EmailEditor\Engine\SettingsController; use MailPoet\EmailEditor\Engine\SettingsController;
class Paragraph implements BlockRenderer { class Paragraph implements BlockRenderer {
public function render($parsedBlock, BlocksRenderer $blocksRenderer, SettingsController $settingsController): string {
$contentStyles = $settingsController->getEmailContentStyles(); private $settingsController;
return str_replace('{paragraph_content}', $parsedBlock['innerHTML'] ?? '', $this->prepareColumnTemplate($parsedBlock, $contentStyles));
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));
} }
/** /**