Register email patterns directly in plugin

[MAILPOET-6243]
This commit is contained in:
Rostislav Wolny
2024-11-21 15:48:41 +01:00
committed by Oluwaseun Olorunsola
parent 5885077838
commit e74e1ef2a2
7 changed files with 56 additions and 99 deletions

View File

@ -46,12 +46,12 @@ class EmailEditor {
return;
}
$this->cli->initialize();
$this->patternsController->initialize();
$this->wp->addFilter('mailpoet_email_editor_post_types', [$this, 'addEmailPostType']);
$this->wp->addAction('rest_delete_mailpoet_email', [$this->emailApiController, 'trashEmail'], 10, 1);
$this->wp->addFilter('mailpoet_is_email_editor_page', [$this, 'isEditorPage'], 10, 1);
$this->wp->addFilter('replace_editor', [$this, 'replaceEditor'], 10, 2);
$this->wp->addFilter('mailpoet_email_editor_send_preview_email', [$this->emailEditorPreviewEmail, 'sendPreviewEmail'], 10, 1);
$this->patternsController->registerPatterns();
$this->extendEmailPostApi();
}

View File

@ -32,6 +32,6 @@ class DefaultContent extends Pattern {
}
protected function get_title(): string { // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps
return __('Default Email Content with Header and Footer', 'mailpoet');
return __('Default Email Content', 'mailpoet');
}
}

View File

@ -5,27 +5,22 @@ namespace MailPoet\EmailEditor\Integrations\MailPoet\Patterns;
use MailPoet\EmailEditor\Integrations\MailPoet\Patterns\Library\DefaultContent;
use MailPoet\EmailEditor\Integrations\MailPoet\Patterns\Library\DefaultContentFull;
use MailPoet\Util\CdnAssetUrl;
use MailPoet\WP\Functions as WPFunctions;
class PatternsController {
private CdnAssetUrl $cdnAssetUrl;
private WPFunctions $wp;
public function __construct(
CdnAssetUrl $cdnAssetUrl,
WPFunctions $wpFunctions
CdnAssetUrl $cdnAssetUrl
) {
$this->cdnAssetUrl = $cdnAssetUrl;
$this->wp = $wpFunctions;
}
public function initialize(): void {
$this->wp->addFilter('mailpoet_email_editor_block_patterns', [$this, 'registerPatterns']);
}
public function registerPatterns($patterns): array {
public function registerPatterns(): void {
$patterns = [];
$patterns[] = new DefaultContentFull($this->cdnAssetUrl);
$patterns[] = new DefaultContent($this->cdnAssetUrl);
return $patterns;
foreach ($patterns as $pattern) {
register_block_pattern($pattern->get_namespace() . '/' . $pattern->get_name(), $pattern->get_properties());
}
}
}

View File

@ -0,0 +1,48 @@
<?php declare(strict_types = 1);
namespace MailPoet\EmailEditor\Integrations\MailPoet\Patterns;
class PatternsControllerTest extends \MailPoetTest {
private PatternsController $patterns;
public function _before(): void {
parent::_before();
$this->patterns = $this->diContainer->get(PatternsController::class);
$this->cleanupPatterns();
}
public function testItRegistersPatterns(): void {
$this->patterns->registerPatterns();
$blockPatterns = \WP_Block_Patterns_Registry::get_instance()->get_all_registered();
$blockPatternContent = array_pop($blockPatterns);
$this->assertIsArray($blockPatternContent);
$this->assertArrayHasKey('name', $blockPatternContent);
$this->assertArrayHasKey('content', $blockPatternContent);
$this->assertArrayHasKey('title', $blockPatternContent);
$this->assertArrayHasKey('categories', $blockPatternContent);
$this->assertEquals('mailpoet/default-content', $blockPatternContent['name']);
$this->assertStringContainsString('A one-column layout is great for simplified and concise content', $blockPatternContent['content']);
$this->assertEquals('Default Email Content', $blockPatternContent['title']);
$this->assertEquals(['email-contents'], $blockPatternContent['categories']);
$blockPatternContentFull = array_pop($blockPatterns);
$this->assertIsArray($blockPatternContentFull);
$this->assertArrayHasKey('name', $blockPatternContentFull);
$this->assertArrayHasKey('content', $blockPatternContentFull);
$this->assertArrayHasKey('title', $blockPatternContentFull);
$this->assertArrayHasKey('categories', $blockPatternContentFull);
$this->assertEquals('mailpoet/default-content-full', $blockPatternContentFull['name']);
$this->assertStringContainsString('A one-column layout is great for simplified and concise content', $blockPatternContentFull['content']);
$this->assertEquals('Default Email Content with Header and Footer', $blockPatternContentFull['title']);
$this->assertEquals(['email-contents'], $blockPatternContentFull['categories']);
}
private function cleanupPatterns() {
$registry = \WP_Block_Patterns_Registry::get_instance();
$blockPatterns = $registry->get_all_registered();
foreach ($blockPatterns as $pattern) {
$registry->unregister($pattern['name']);
}
}
}

View File

@ -19,7 +19,6 @@ class Patterns {
*/
public function initialize(): void {
$this->register_block_pattern_categories();
$this->register_patterns();
}
/**
@ -45,18 +44,4 @@ class Patterns {
);
}
}
/**
* Register block patterns.
*
* @return void
*/
private function register_patterns() {
$patterns = apply_filters( 'mailpoet_email_editor_block_patterns', array() );
foreach ( $patterns as $pattern ) {
if ( ! $pattern instanceof Abstract_Pattern ) {
continue;
}
register_block_pattern( $pattern->get_namespace() . '/' . $pattern->get_name(), $pattern->get_properties() );
}
}
}

View File

@ -1,43 +0,0 @@
<?php
/**
* This file is part of the MailPoet plugin.
*
* @package MailPoet\EmailEditor
*/
declare(strict_types = 1);
namespace MailPoet\EmailEditor\Engine\Patterns;
/**
* Dummy test pattern
*/
class Dummy_Test_Pattern extends Abstract_Pattern {
/**
* Name of the pattern
*
* @var string
*/
protected $name = 'dummy-test-pattern';
/**
* Namespace of the pattern
*
* @var string
*/
protected $namespace = 'dummy';
/**
* Get the pattern content
*
* @return string
*/
public function get_content(): string {
return '<!-- wp:paragraph --><p>Test pattern</p><!-- /wp:paragraph -->';
}
/**
* Get the pattern title
*
* @return string
*/
public function get_title(): string {
return 'Test pattern title';
}
}

View File

@ -8,8 +8,6 @@
declare(strict_types = 1);
namespace MailPoet\EmailEditor\Engine\Patterns;
require_once 'Dummy_Test_Pattern.php';
/**
* Integration test for Patterns class
*/
@ -41,36 +39,10 @@ class Patterns_Test extends \MailPoetTest {
$this->assertEquals( 'A collection of email content layouts.', $category['description'] );
}
/**
* Test that the patterns added via filter are registered in WP_Block_Patterns_Registry
*/
public function testItRegistersPatterns() {
$pattern = new Dummy_Test_Pattern();
add_filter(
'mailpoet_email_editor_block_patterns',
function ( $patterns ) use ( $pattern ) {
$patterns[] = $pattern;
return $patterns;
}
);
$this->patterns->initialize();
$block_patterns = \WP_Block_Patterns_Registry::get_instance()->get_all_registered();
$block_pattern = array_pop( $block_patterns );
$this->assertEquals( 'dummy/dummy-test-pattern', $block_pattern['name'] );
$this->assertEquals( $pattern->get_content(), $block_pattern['content'] );
$this->assertEquals( $pattern->get_title(), $block_pattern['title'] );
}
/**
* Clean registered patterns and categories
*/
private function cleanup_patterns() {
$registry = \WP_Block_Patterns_Registry::get_instance();
$block_patterns = $registry->get_all_registered();
foreach ( $block_patterns as $pattern ) {
$registry->unregister( $pattern['name'] );
}
$categories_registry = \WP_Block_Pattern_Categories_Registry::get_instance();
$categories = $categories_registry->get_all_registered();
foreach ( $categories as $category ) {