diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index 2cb79b2abb..608735aa79 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -279,6 +279,9 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\Newsletter\Renderer\Blocks\Social::class); $container->autowire(\MailPoet\Newsletter\Renderer\Blocks\Spacer::class); $container->autowire(\MailPoet\Newsletter\Renderer\Blocks\Text::class); + $container->autowire(\MailPoet\Newsletter\Renderer\Columns\Renderer::class); + $container->autowire(\MailPoet\Newsletter\Renderer\Preprocessor::class); + $container->autowire(\MailPoet\Newsletter\Renderer\Renderer::class); $container->autowire(\MailPoet\Newsletter\Segment\NewsletterSegmentRepository::class); $container->autowire(\MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository::class); $container->autowire(\MailPoet\Newsletter\Scheduler\WelcomeScheduler::class)->setPublic(true); @@ -306,6 +309,7 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\WP\Emoji::class)->setPublic(true); $container->autowire(\MailPoet\WP\Functions::class)->setPublic(true); // Third party classes + $container->autowire(\MailPoetVendor\CSS::class)->setClass(\MailPoetVendor\CSS::class); $container->autowire(\MailPoetVendor\csstidy::class)->setClass(\MailPoetVendor\csstidy::class); return $container; diff --git a/lib/Models/Newsletter.php b/lib/Models/Newsletter.php index f9c4ac81b8..e472bf7a16 100644 --- a/lib/Models/Newsletter.php +++ b/lib/Models/Newsletter.php @@ -6,6 +6,7 @@ use MailPoet\AutomaticEmails\WooCommerce\Events\AbandonedCart; use MailPoet\AutomaticEmails\WooCommerce\Events\FirstPurchase; use MailPoet\AutomaticEmails\WooCommerce\Events\PurchasedInCategory; use MailPoet\AutomaticEmails\WooCommerce\Events\PurchasedProduct; +use MailPoet\DI\ContainerWrapper; use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\ScheduledTaskEntity; use MailPoet\Newsletter\Renderer\Renderer; @@ -570,7 +571,7 @@ class Newsletter extends Model { } public function render() { - $renderer = new Renderer(); + $renderer = ContainerWrapper::getInstance()->get(Renderer::class); return $renderer->render($this); } diff --git a/lib/Newsletter/Preview/SendPreviewController.php b/lib/Newsletter/Preview/SendPreviewController.php index 446b426603..1240ec197f 100644 --- a/lib/Newsletter/Preview/SendPreviewController.php +++ b/lib/Newsletter/Preview/SendPreviewController.php @@ -21,14 +21,19 @@ class SendPreviewController { /** @var WPFunctions */ private $wp; + /** @var Renderer */ + private $renderer; + public function __construct( Mailer $mailer, MetaInfo $mailerMetaInfo, + Renderer $renderer, WPFunctions $wp ) { $this->mailer = $mailer; $this->mailerMetaInfo = $mailerMetaInfo; $this->wp = $wp; + $this->renderer = $renderer; } public function sendPreview(NewsletterEntity $newsletter, string $emailAddress) { @@ -38,8 +43,7 @@ class SendPreviewController { throw new SendPreviewException("Newsletter with ID '{$newsletter->getId()}' not found"); } - $renderer = new Renderer(); - $renderedNewsletter = $renderer->render($newsletterModel, $preview = true); + $renderedNewsletter = $this->renderer->render($newsletterModel, $preview = true); $divider = '***MailPoet***'; $dataForShortcodes = array_merge( [$newsletter->getSubject()], diff --git a/lib/Newsletter/Renderer/Renderer.php b/lib/Newsletter/Renderer/Renderer.php index 6245135323..71622f6504 100644 --- a/lib/Newsletter/Renderer/Renderer.php +++ b/lib/Newsletter/Renderer/Renderer.php @@ -3,38 +3,50 @@ namespace MailPoet\Newsletter\Renderer; use MailPoet\Config\Env; -use MailPoet\DI\ContainerWrapper; use MailPoet\Models\Newsletter; use MailPoet\Newsletter\Renderer\EscapeHelper as EHelper; use MailPoet\Services\Bridge; use MailPoet\Util\License\License; use MailPoet\Util\pQuery\DomNode; -use MailPoet\WooCommerce\TransactionalEmails; use MailPoet\WP\Functions as WPFunctions; class Renderer { - public $blocksRenderer; - public $columnsRenderer; - public $preprocessor; - public $cSSInliner; + /** @var Blocks\Renderer */ + private $blocksRenderer; + + /** @var Columns\Renderer */ + private $columnsRenderer; + + /** @var Preprocessor */ + private $preprocessor; + + /** @var \MailPoetVendor\CSS */ + private $cSSInliner; + + /** @var Bridge */ + private $bridge; + public $premiumActivated; public $mssActivated; private $template; const NEWSLETTER_TEMPLATE = 'Template.html'; const FILTER_POST_PROCESS = 'mailpoet_rendering_post_process'; - public function __construct() { - $this->blocksRenderer = ContainerWrapper::getInstance()->get(Blocks\Renderer::class); - $this->columnsRenderer = new Columns\Renderer(); - $this->preprocessor = new Preprocessor( - $this->blocksRenderer, - ContainerWrapper::getInstance()->get(TransactionalEmails::class) - ); - $this->cSSInliner = new \MailPoetVendor\CSS(); + public function __construct( + Blocks\Renderer $blocksRenderer, + Columns\Renderer $columnsRenderer, + Preprocessor $preprocessor, + \MailPoetVendor\CSS $cSSInliner, + Bridge $bridge + ) { + $this->blocksRenderer = $blocksRenderer; + $this->columnsRenderer = $columnsRenderer; + $this->preprocessor = $preprocessor; + $this->cSSInliner = $cSSInliner; + $this->bridge = $bridge; $this->template = file_get_contents(dirname(__FILE__) . '/' . self::NEWSLETTER_TEMPLATE); $this->premiumActivated = License::getLicense(); - $bridge = new Bridge(); - $this->mssActivated = $bridge->isMPSendingServiceEnabled(); + $this->mssActivated = $this->bridge->isMPSendingServiceEnabled(); } /** @@ -94,16 +106,15 @@ class Renderer { ? $content['blocks'] : []; - $_this = $this; - $renderedContent = array_map(function($contentBlock) use($_this, $newsletter) { + $renderedContent = []; + foreach ($blocks as $contentBlock) { + $columnsData = $this->blocksRenderer->render($newsletter, $contentBlock); - $columnsData = $_this->blocksRenderer->render($newsletter, $contentBlock); - - return $_this->columnsRenderer->render( + $renderedContent[] = $this->columnsRenderer->render( $contentBlock, $columnsData ); - }, $blocks); + } return implode('', $renderedContent); } diff --git a/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php b/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php index 59795899f8..5f749cad76 100644 --- a/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php +++ b/lib/Newsletter/ViewInBrowser/ViewInBrowserRenderer.php @@ -18,9 +18,17 @@ class ViewInBrowserRenderer { /** @var bool */ private $isTrackingEnabled; - public function __construct(Emoji $emoji, SettingsController $settings) { + /** @var Renderer */ + private $renderer; + + public function __construct( + Emoji $emoji, + SettingsController $settings, + Renderer $renderer + ) { $this->emoji = $emoji; $this->isTrackingEnabled = $settings->get('tracking.enabled'); + $this->renderer = $renderer; } public function render( @@ -47,8 +55,7 @@ class ViewInBrowserRenderer { $newsletterBody = str_replace(Links::DATA_TAG_OPEN, '', $newsletterBody); } } else { - $renderer = new Renderer(); - $newsletterBody = $renderer->render($newsletter, $wpUserPreview, 'html'); + $newsletterBody = $this->renderer->render($newsletter, $wpUserPreview, 'html'); } $shortcodes = new Shortcodes( $newsletter, diff --git a/tests/integration/Newsletter/Preview/SendPreviewControllerTest.php b/tests/integration/Newsletter/Preview/SendPreviewControllerTest.php index 0a3d5ed748..b5eb217dd9 100644 --- a/tests/integration/Newsletter/Preview/SendPreviewControllerTest.php +++ b/tests/integration/Newsletter/Preview/SendPreviewControllerTest.php @@ -8,6 +8,7 @@ use MailPoet\Entities\NewsletterEntity; use MailPoet\Mailer\Mailer; use MailPoet\Mailer\MailerError; use MailPoet\Mailer\MetaInfo; +use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Newsletter\Url; use MailPoet\Subscription\SubscriptionUrlFactory; use MailPoet\Util\Security; @@ -63,7 +64,12 @@ class SendPreviewControllerTest extends \MailPoetTest { ), ]); - $sendPreviewController = new SendPreviewController($mailer, new MetaInfo(), new WPFunctions()); + $sendPreviewController = new SendPreviewController( + $mailer, + new MetaInfo(), + $this->diContainer->get(Renderer::class), + new WPFunctions() + ); $sendPreviewController->sendPreview($this->newsletter, 'test@subscriber.com'); } @@ -85,7 +91,12 @@ class SendPreviewControllerTest extends \MailPoetTest { $this->expectException(SendPreviewException::class); $this->expectExceptionMessage('The email could not be sent: failed'); - $sendPreviewController = new SendPreviewController($mailer, new MetaInfo(), new WPFunctions()); + $sendPreviewController = new SendPreviewController( + $mailer, + new MetaInfo(), + $this->diContainer->get(Renderer::class), + new WPFunctions() + ); $sendPreviewController->sendPreview($this->newsletter, 'test@subscriber.com'); } } diff --git a/tests/integration/Newsletter/RendererTest.php b/tests/integration/Newsletter/RendererTest.php index 59b6a9c3ae..4c429e4719 100644 --- a/tests/integration/Newsletter/RendererTest.php +++ b/tests/integration/Newsletter/RendererTest.php @@ -21,8 +21,8 @@ class RendererTest extends \MailPoetTest { public $newsletter; const COLUMN_BASE_WIDTH = 660; - public function __construct() { - parent::__construct(); + public function _before() { + parent::_before(); $this->newsletter = [ 'body' => json_decode( (string)file_get_contents(dirname(__FILE__) . '/RendererTestData.json'), true @@ -33,7 +33,7 @@ class RendererTest extends \MailPoetTest { 'type' => 'standard', 'status' => 'active', ]; - $this->renderer = new Renderer(); + $this->renderer = $this->diContainer->get(Renderer::class); $this->columnRenderer = new ColumnRenderer(); $this->dOMParser = new \pQuery(); } diff --git a/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserRendererTest.php b/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserRendererTest.php index d626c6bde6..b41ae2c670 100644 --- a/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserRendererTest.php +++ b/tests/integration/Newsletter/ViewInBrowser/ViewInBrowserRendererTest.php @@ -9,6 +9,7 @@ use MailPoet\Models\ScheduledTask; use MailPoet\Models\SendingQueue; use MailPoet\Models\Subscriber; use MailPoet\Newsletter\Links\Links; +use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Router\Router; use MailPoet\Settings\SettingsController; use MailPoet\Tasks\Sending as SendingTask; @@ -149,7 +150,11 @@ class ViewInBrowserRendererTest extends \MailPoetTest { }), ]); $this->settings->set('tracking.enabled', false); - $viewInBrowser = new ViewInBrowserRenderer($emoji, $this->diContainer->get(SettingsController::class)); + $viewInBrowser = new ViewInBrowserRenderer( + $emoji, + $this->diContainer->get(SettingsController::class), + $this->diContainer->get(Renderer::class) + ); $renderedBody = $viewInBrowser->render( $preview = false, $this->newsletter, diff --git a/tests/integration/WooCommerce/TransactionalEmails/RendererTest.php b/tests/integration/WooCommerce/TransactionalEmails/RendererTest.php index c5efea08f3..821242a9b2 100644 --- a/tests/integration/WooCommerce/TransactionalEmails/RendererTest.php +++ b/tests/integration/WooCommerce/TransactionalEmails/RendererTest.php @@ -7,6 +7,7 @@ use MailPoet\Models\Newsletter; use MailPoet\Newsletter\Editor\LayoutHelper as L; use MailPoet\Newsletter\Renderer\Preprocessor; use MailPoet\Newsletter\Renderer\Renderer as NewsletterRenderer; +use MailPoet\Services\Bridge; use MailPoetVendor\csstidy; class RendererTest extends \MailPoetTest { @@ -36,20 +37,26 @@ class RendererTest extends \MailPoetTest { } public function testGetHTMLBeforeContent() { - $renderer = new Renderer(new csstidy); - $newsletterRenderer = new NewsletterRenderer(); - $newsletterRenderer->preprocessor = new Preprocessor( - $newsletterRenderer->blocksRenderer, - Stub::make( - \MailPoet\WooCommerce\TransactionalEmails::class, - [ - 'getWCEmailSettings' => [ - 'base_text_color' => '', - 'base_color' => '', - ], - ] - ) + $newsletterRenderer = new NewsletterRenderer( + $this->diContainer->get(\MailPoet\Newsletter\Renderer\Blocks\Renderer::class), + $this->diContainer->get(\MailPoet\Newsletter\Renderer\Columns\Renderer::class), + new Preprocessor( + $this->diContainer->get(\MailPoet\Newsletter\Renderer\Blocks\Renderer::class), + Stub::make( + \MailPoet\WooCommerce\TransactionalEmails::class, + [ + 'getWCEmailSettings' => [ + 'base_text_color' => '', + 'base_color' => '', + ], + ] + ) + ), + $this->diContainer->get(\MailPoetVendor\CSS::class), + $this->diContainer->get(Bridge::class) ); + + $renderer = new Renderer(new csstidy, $newsletterRenderer); $renderer->render($this->newsletter); $html = $renderer->getHTMLBeforeContent('Heading Text'); expect($html)->contains('Some text before heading'); @@ -59,20 +66,25 @@ class RendererTest extends \MailPoetTest { } public function testGetHTMLAfterContent() { - $newsletterRenderer = new NewsletterRenderer(); - $renderer = new Renderer(new csstidy, $newsletterRenderer); - $newsletterRenderer->preprocessor = new Preprocessor( - $newsletterRenderer->blocksRenderer, - Stub::make( - \MailPoet\WooCommerce\TransactionalEmails::class, - [ - 'getWCEmailSettings' => [ - 'base_text_color' => '', - 'base_color' => '', - ], - ] - ) + $newsletterRenderer = new NewsletterRenderer( + $this->diContainer->get(\MailPoet\Newsletter\Renderer\Blocks\Renderer::class), + $this->diContainer->get(\MailPoet\Newsletter\Renderer\Columns\Renderer::class), + new Preprocessor( + $this->diContainer->get(\MailPoet\Newsletter\Renderer\Blocks\Renderer::class), + Stub::make( + \MailPoet\WooCommerce\TransactionalEmails::class, + [ + 'getWCEmailSettings' => [ + 'base_text_color' => '', + 'base_color' => '', + ], + ] + ) + ), + $this->diContainer->get(\MailPoetVendor\CSS::class), + $this->diContainer->get(Bridge::class) ); + $renderer = new Renderer(new csstidy, $newsletterRenderer); $renderer->render($this->newsletter); $html = $renderer->getHTMLAfterContent(); expect($html)->notContains('Some text before heading'); @@ -82,7 +94,7 @@ class RendererTest extends \MailPoetTest { } public function testPrefixCss() { - $renderer = new Renderer(new csstidy); + $renderer = new Renderer(new csstidy, $this->diContainer->get(NewsletterRenderer::class)); $css = $renderer->prefixCss(' #some_id {color: black} .some-class {height: 50px; width: 30px} diff --git a/tests/unit/WooCommerce/TransactionalEmailsUnitTest.php b/tests/unit/WooCommerce/TransactionalEmailsUnitTest.php index 91a13af1a3..838995d365 100644 --- a/tests/unit/WooCommerce/TransactionalEmailsUnitTest.php +++ b/tests/unit/WooCommerce/TransactionalEmailsUnitTest.php @@ -6,7 +6,6 @@ use Codeception\Stub; use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Settings\SettingsController; use MailPoet\WooCommerce\Helper as WooCommerceHelper; -use MailPoet\WooCommerce\TransactionalEmails\Renderer; use MailPoet\WooCommerce\TransactionalEmails\Template; use MailPoet\WP\Functions as WPFunctions;