Files
piratepoet/mailpoet/lib/EmailEditor/Engine/EmailEditor.php
Rostislav Wolny b70ad064c7 Refactor initialization of the email editor
This changes how the editor is initialized. The integration initialization class
doesn't get the engine class anymore, but integration is initialized via
mailpoet_email_editor_initialized action triggered from the engine.

This allows multiple integrations to hook into the engine.
[MAILPOET-5540]
2023-09-21 14:20:35 +02:00

98 lines
3.3 KiB
PHP

<?php declare(strict_types = 1);
namespace MailPoet\EmailEditor\Engine;
/**
* @phpstan-type EmailPostType array{name: string, args: array}
* See register_post_type for details about EmailPostType args.
*/
class EmailEditor {
private const ALLOWED_BLOCK_TYPES = ['core/paragraph', 'core/heading', 'core/column', 'core/columns'];
/** @var AssetsCleaner */
private $assetsCleaner;
/**
* @param AssetsCleaner $assetsCleaner
*/
public function __construct(
AssetsCleaner $assetsCleaner
) {
$this->assetsCleaner = $assetsCleaner;
}
public function initialize(): void {
add_filter('allowed_block_types_all', [$this, 'setAllowedBlocksInEmails'], 100, 2);
add_filter('enqueue_block_editor_assets', [$this, 'cleanupBlockEditorAssets'], ~PHP_INT_MAX);
add_filter('block_editor_settings_all', [$this, 'updateBlockEditorSettings'], 100, 2);
do_action('mailpoet_email_editor_initialized');
$this->registerEmailPostTypes();
}
/**
* Register all custom post types that should be edited via the email editor
* The post types are added via mailpoet_email_editor_post_types filter.
*/
private function registerEmailPostTypes(): void {
foreach ($this->getPostTypes() as $postType) {
register_post_type(
$postType['name'],
array_merge($this->getDefaultEmailPostArgs(), $postType['args'])
);
}
}
/**
* @phpstan-return EmailPostType[]
*/
private function getPostTypes(): array {
$postTypes = [];
return apply_filters('mailpoet_email_editor_post_types', $postTypes);
}
private function getDefaultEmailPostArgs(): array {
return [
'public' => false,
'hierarchical' => false,
'show_ui' => true,
'show_in_menu' => false,
'show_in_nav_menus' => false,
'supports' => ['editor'],
'has_archive' => true,
'show_in_rest' => true, // Important to enable Gutenberg editor
];
}
/**
* @param string[]|bool $allowedBlockTypes
* @param \WP_Block_Editor_Context $blockEditorContext
* @return array|bool
*/
public function setAllowedBlocksInEmails($allowedBlockTypes, \WP_Block_Editor_Context $blockEditorContext) {
$emailPostTypes = array_column($this->getPostTypes(), 'name');
if (!$blockEditorContext->post || !in_array($blockEditorContext->post->post_type, $emailPostTypes, true)) {
return $allowedBlockTypes;
}
return self::ALLOWED_BLOCK_TYPES;
}
public function cleanupBlockEditorAssets() {
$emailPostTypes = array_column($this->getPostTypes(), 'name');
if (!in_array(get_post_type(), $emailPostTypes, true)) {
return;
}
$this->assetsCleaner->cleanupBlockEditorAssets();
}
public function updateBlockEditorSettings(array $settings, \WP_Block_Editor_Context $blockEditorContext): array {
$emailPostTypes = array_column($this->getPostTypes(), 'name');
if (!$blockEditorContext->post || !in_array($blockEditorContext->post->post_type, $emailPostTypes, true)) {
return $settings;
}
$settings['enableCustomUnits'] = ['px', '%']; // Allow only units we can support in email renderer
$settings['__experimentalAdditionalBlockPatterns'] = [];
$settings['__experimentalAdditionalBlockPatternCategories'] = [];
return array_merge($settings, apply_filters('mailpoet_email_editor_settings_all', []));
}
}