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;
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;
}

View File

@@ -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 {

View File

@@ -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;
}
}

View File

@@ -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());
}
}

View File

@@ -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(

View File

@@ -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,

View File

@@ -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;
}
}

View File

@@ -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));
}
/**