Use render_block_* hooks for rendering changed blocks
[MAILPOET-5591]
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
@@ -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 {
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
@@ -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());
|
||||
}
|
||||
}
|
||||
|
@@ -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(
|
||||
|
@@ -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,
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
@@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user