diff --git a/packages/php/email-editor/src/Engine/Patterns/Library/class-abstract-pattern.php b/packages/php/email-editor/src/Engine/Patterns/class-abstract-pattern.php similarity index 78% rename from packages/php/email-editor/src/Engine/Patterns/Library/class-abstract-pattern.php rename to packages/php/email-editor/src/Engine/Patterns/class-abstract-pattern.php index 3550f75c64..94e55fbe11 100644 --- a/packages/php/email-editor/src/Engine/Patterns/Library/class-abstract-pattern.php +++ b/packages/php/email-editor/src/Engine/Patterns/class-abstract-pattern.php @@ -6,20 +6,24 @@ */ declare(strict_types = 1); -namespace MailPoet\EmailEditor\Engine\Patterns\Library; - -use MailPoet\EmailEditor\Utils\Cdn_Asset_Url; +namespace MailPoet\EmailEditor\Engine\Patterns; /** * Abstract class for block patterns. */ abstract class Abstract_Pattern { /** - * Cdn_Asset_Url instance. + * Name of the pattern. * - * @var Cdn_Asset_Url $cdn_asset_url + * @var string $name */ - protected $cdn_asset_url; + protected $name = ''; + /** + * Namespace of the pattern. + * + * @var string $namespace + */ + protected $namespace = ''; /** * List of block types. * @@ -58,14 +62,21 @@ abstract class Abstract_Pattern { protected $viewport_width = 620; /** - * Constructor. + * Get name of the pattern. * - * @param Cdn_Asset_Url $cdn_asset_url Cdn_Asset_Url instance. + * @return string */ - public function __construct( - Cdn_Asset_Url $cdn_asset_url - ) { - $this->cdn_asset_url = $cdn_asset_url; + public function get_name(): string { + return $this->name; + } + + /** + * Get namespace of the pattern. + * + * @return string + */ + public function get_namespace(): string { + return $this->namespace; } /** diff --git a/packages/php/email-editor/src/Engine/Patterns/class-patterns.php b/packages/php/email-editor/src/Engine/Patterns/class-patterns.php index 9c8e0c317c..21ce7fa398 100644 --- a/packages/php/email-editor/src/Engine/Patterns/class-patterns.php +++ b/packages/php/email-editor/src/Engine/Patterns/class-patterns.php @@ -1,6 +1,6 @@ cdn_asset_url = $cdn_asset_url; - } - /** * Initialize block patterns. * * @return void */ public function initialize(): void { - $this->register_block_pattern_category(); + $this->register_block_pattern_categories(); $this->register_patterns(); } @@ -53,14 +27,17 @@ class Patterns { * * @return void */ - private function register_block_pattern_category(): void { - register_block_pattern_category( - 'mailpoet', - array( - 'label' => _x( 'MailPoet', 'Block pattern category', 'mailpoet' ), - 'description' => __( 'A collection of email template layouts.', 'mailpoet' ), - ) - ); + private function register_block_pattern_categories(): void { + $categories = apply_filters( 'mailpoet_email_editor_block_pattern_categories', array() ); + foreach ( $categories as $category ) { + register_block_pattern_category( + $category['name'], + array( + 'label' => $category['label'], + 'description' => $category['description'] ?? '', + ) + ); + } } /** @@ -69,17 +46,9 @@ class Patterns { * @return void */ private function register_patterns() { - $this->register_pattern( 'default', new Library\Default_Content( $this->cdn_asset_url ) ); - $this->register_pattern( 'default-full', new Library\Default_Content_Full( $this->cdn_asset_url ) ); - } - - /** - * Register block pattern. - * - * @param string $name Name of the pattern. - * @param Library\Abstract_Pattern $pattern Pattern to register. - */ - private function register_pattern( $name, $pattern ) { - register_block_pattern( $this->namespace . '/' . $name, $pattern->get_properties() ); + $patterns = apply_filters( 'mailpoet_email_editor_block_patterns', array() ); + foreach ( $patterns as $pattern ) { + register_block_pattern( $pattern->get_namespace() . '/' . $pattern->get_name(), $pattern->get_properties() ); + } } } diff --git a/packages/php/email-editor/tests/integration/Engine/Patterns/Dummy_Test_Pattern.php b/packages/php/email-editor/tests/integration/Engine/Patterns/Dummy_Test_Pattern.php new file mode 100644 index 0000000000..09dc0f2ccd --- /dev/null +++ b/packages/php/email-editor/tests/integration/Engine/Patterns/Dummy_Test_Pattern.php @@ -0,0 +1,43 @@ +
Test pattern
'; + } + /** + * Get the pattern title + * + * @return string + */ + public function get_title(): string { + return 'Test pattern title'; + } +} diff --git a/packages/php/email-editor/tests/integration/Engine/Patterns/Patterns_Test.php b/packages/php/email-editor/tests/integration/Engine/Patterns/Patterns_Test.php new file mode 100644 index 0000000000..39f5bf6d88 --- /dev/null +++ b/packages/php/email-editor/tests/integration/Engine/Patterns/Patterns_Test.php @@ -0,0 +1,92 @@ +patterns = $this->di_container->get( Patterns::class ); + $this->cleanup_patterns(); + } + + /** + * 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'] ); + } + + /** + * Test that the pattern categories added via filter are registered in WP_Block_Patterns_Registry + */ + public function testItRegistersPatternCategories() { + add_filter( + 'mailpoet_email_editor_block_pattern_categories', + function ( $categories ) { + $pattern_category = array( + 'name' => 'mailpoet-test', + 'label' => 'MailPoet', + 'description' => 'A collection of email template layouts.', + ); + $categories[] = $pattern_category; + return $categories; + } + ); + $this->patterns->initialize(); + $categories = \WP_Block_Pattern_Categories_Registry::get_instance()->get_all_registered(); + $category = array_pop( $categories ); + $this->assertEquals( 'mailpoet-test', $category['name'] ); + $this->assertEquals( 'MailPoet', $category['label'] ); + $this->assertEquals( 'A collection of email template layouts.', $category['description'] ); + } + + /** + * 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 ) { + $categories_registry->unregister( $category['name'] ); + } + } +}