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