Use Di for newsletter renderer

[MAILPOET-2899]
This commit is contained in:
Pavel Dohnal
2020-05-26 13:05:49 +02:00
committed by Veljko V
parent fbc6786058
commit 7e0b536ff4
10 changed files with 116 additions and 62 deletions

View File

@ -279,6 +279,9 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Newsletter\Renderer\Blocks\Social::class); $container->autowire(\MailPoet\Newsletter\Renderer\Blocks\Social::class);
$container->autowire(\MailPoet\Newsletter\Renderer\Blocks\Spacer::class); $container->autowire(\MailPoet\Newsletter\Renderer\Blocks\Spacer::class);
$container->autowire(\MailPoet\Newsletter\Renderer\Blocks\Text::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\Segment\NewsletterSegmentRepository::class);
$container->autowire(\MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository::class); $container->autowire(\MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository::class);
$container->autowire(\MailPoet\Newsletter\Scheduler\WelcomeScheduler::class)->setPublic(true); $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\Emoji::class)->setPublic(true);
$container->autowire(\MailPoet\WP\Functions::class)->setPublic(true); $container->autowire(\MailPoet\WP\Functions::class)->setPublic(true);
// Third party classes // Third party classes
$container->autowire(\MailPoetVendor\CSS::class)->setClass(\MailPoetVendor\CSS::class);
$container->autowire(\MailPoetVendor\csstidy::class)->setClass(\MailPoetVendor\csstidy::class); $container->autowire(\MailPoetVendor\csstidy::class)->setClass(\MailPoetVendor\csstidy::class);
return $container; return $container;

View File

@ -6,6 +6,7 @@ use MailPoet\AutomaticEmails\WooCommerce\Events\AbandonedCart;
use MailPoet\AutomaticEmails\WooCommerce\Events\FirstPurchase; use MailPoet\AutomaticEmails\WooCommerce\Events\FirstPurchase;
use MailPoet\AutomaticEmails\WooCommerce\Events\PurchasedInCategory; use MailPoet\AutomaticEmails\WooCommerce\Events\PurchasedInCategory;
use MailPoet\AutomaticEmails\WooCommerce\Events\PurchasedProduct; use MailPoet\AutomaticEmails\WooCommerce\Events\PurchasedProduct;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\ScheduledTaskEntity; use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Newsletter\Renderer\Renderer;
@ -570,7 +571,7 @@ class Newsletter extends Model {
} }
public function render() { public function render() {
$renderer = new Renderer(); $renderer = ContainerWrapper::getInstance()->get(Renderer::class);
return $renderer->render($this); return $renderer->render($this);
} }

View File

@ -21,14 +21,19 @@ class SendPreviewController {
/** @var WPFunctions */ /** @var WPFunctions */
private $wp; private $wp;
/** @var Renderer */
private $renderer;
public function __construct( public function __construct(
Mailer $mailer, Mailer $mailer,
MetaInfo $mailerMetaInfo, MetaInfo $mailerMetaInfo,
Renderer $renderer,
WPFunctions $wp WPFunctions $wp
) { ) {
$this->mailer = $mailer; $this->mailer = $mailer;
$this->mailerMetaInfo = $mailerMetaInfo; $this->mailerMetaInfo = $mailerMetaInfo;
$this->wp = $wp; $this->wp = $wp;
$this->renderer = $renderer;
} }
public function sendPreview(NewsletterEntity $newsletter, string $emailAddress) { public function sendPreview(NewsletterEntity $newsletter, string $emailAddress) {
@ -38,8 +43,7 @@ class SendPreviewController {
throw new SendPreviewException("Newsletter with ID '{$newsletter->getId()}' not found"); throw new SendPreviewException("Newsletter with ID '{$newsletter->getId()}' not found");
} }
$renderer = new Renderer(); $renderedNewsletter = $this->renderer->render($newsletterModel, $preview = true);
$renderedNewsletter = $renderer->render($newsletterModel, $preview = true);
$divider = '***MailPoet***'; $divider = '***MailPoet***';
$dataForShortcodes = array_merge( $dataForShortcodes = array_merge(
[$newsletter->getSubject()], [$newsletter->getSubject()],

View File

@ -3,38 +3,50 @@
namespace MailPoet\Newsletter\Renderer; namespace MailPoet\Newsletter\Renderer;
use MailPoet\Config\Env; use MailPoet\Config\Env;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Newsletter\Renderer\EscapeHelper as EHelper; use MailPoet\Newsletter\Renderer\EscapeHelper as EHelper;
use MailPoet\Services\Bridge; use MailPoet\Services\Bridge;
use MailPoet\Util\License\License; use MailPoet\Util\License\License;
use MailPoet\Util\pQuery\DomNode; use MailPoet\Util\pQuery\DomNode;
use MailPoet\WooCommerce\TransactionalEmails;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
class Renderer { class Renderer {
public $blocksRenderer; /** @var Blocks\Renderer */
public $columnsRenderer; private $blocksRenderer;
public $preprocessor;
public $cSSInliner; /** @var Columns\Renderer */
private $columnsRenderer;
/** @var Preprocessor */
private $preprocessor;
/** @var \MailPoetVendor\CSS */
private $cSSInliner;
/** @var Bridge */
private $bridge;
public $premiumActivated; public $premiumActivated;
public $mssActivated; public $mssActivated;
private $template; private $template;
const NEWSLETTER_TEMPLATE = 'Template.html'; const NEWSLETTER_TEMPLATE = 'Template.html';
const FILTER_POST_PROCESS = 'mailpoet_rendering_post_process'; const FILTER_POST_PROCESS = 'mailpoet_rendering_post_process';
public function __construct() { public function __construct(
$this->blocksRenderer = ContainerWrapper::getInstance()->get(Blocks\Renderer::class); Blocks\Renderer $blocksRenderer,
$this->columnsRenderer = new Columns\Renderer(); Columns\Renderer $columnsRenderer,
$this->preprocessor = new Preprocessor( Preprocessor $preprocessor,
$this->blocksRenderer, \MailPoetVendor\CSS $cSSInliner,
ContainerWrapper::getInstance()->get(TransactionalEmails::class) Bridge $bridge
); ) {
$this->cSSInliner = new \MailPoetVendor\CSS(); $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->template = file_get_contents(dirname(__FILE__) . '/' . self::NEWSLETTER_TEMPLATE);
$this->premiumActivated = License::getLicense(); $this->premiumActivated = License::getLicense();
$bridge = new Bridge(); $this->mssActivated = $this->bridge->isMPSendingServiceEnabled();
$this->mssActivated = $bridge->isMPSendingServiceEnabled();
} }
/** /**
@ -94,16 +106,15 @@ class Renderer {
? $content['blocks'] ? $content['blocks']
: []; : [];
$_this = $this; $renderedContent = [];
$renderedContent = array_map(function($contentBlock) use($_this, $newsletter) { foreach ($blocks as $contentBlock) {
$columnsData = $this->blocksRenderer->render($newsletter, $contentBlock);
$columnsData = $_this->blocksRenderer->render($newsletter, $contentBlock); $renderedContent[] = $this->columnsRenderer->render(
return $_this->columnsRenderer->render(
$contentBlock, $contentBlock,
$columnsData $columnsData
); );
}, $blocks); }
return implode('', $renderedContent); return implode('', $renderedContent);
} }

View File

@ -18,9 +18,17 @@ class ViewInBrowserRenderer {
/** @var bool */ /** @var bool */
private $isTrackingEnabled; 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->emoji = $emoji;
$this->isTrackingEnabled = $settings->get('tracking.enabled'); $this->isTrackingEnabled = $settings->get('tracking.enabled');
$this->renderer = $renderer;
} }
public function render( public function render(
@ -47,8 +55,7 @@ class ViewInBrowserRenderer {
$newsletterBody = str_replace(Links::DATA_TAG_OPEN, '', $newsletterBody); $newsletterBody = str_replace(Links::DATA_TAG_OPEN, '', $newsletterBody);
} }
} else { } else {
$renderer = new Renderer(); $newsletterBody = $this->renderer->render($newsletter, $wpUserPreview, 'html');
$newsletterBody = $renderer->render($newsletter, $wpUserPreview, 'html');
} }
$shortcodes = new Shortcodes( $shortcodes = new Shortcodes(
$newsletter, $newsletter,

View File

@ -8,6 +8,7 @@ use MailPoet\Entities\NewsletterEntity;
use MailPoet\Mailer\Mailer; use MailPoet\Mailer\Mailer;
use MailPoet\Mailer\MailerError; use MailPoet\Mailer\MailerError;
use MailPoet\Mailer\MetaInfo; use MailPoet\Mailer\MetaInfo;
use MailPoet\Newsletter\Renderer\Renderer;
use MailPoet\Newsletter\Url; use MailPoet\Newsletter\Url;
use MailPoet\Subscription\SubscriptionUrlFactory; use MailPoet\Subscription\SubscriptionUrlFactory;
use MailPoet\Util\Security; 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'); $sendPreviewController->sendPreview($this->newsletter, 'test@subscriber.com');
} }
@ -85,7 +91,12 @@ class SendPreviewControllerTest extends \MailPoetTest {
$this->expectException(SendPreviewException::class); $this->expectException(SendPreviewException::class);
$this->expectExceptionMessage('The email could not be sent: failed'); $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'); $sendPreviewController->sendPreview($this->newsletter, 'test@subscriber.com');
} }
} }

View File

@ -21,8 +21,8 @@ class RendererTest extends \MailPoetTest {
public $newsletter; public $newsletter;
const COLUMN_BASE_WIDTH = 660; const COLUMN_BASE_WIDTH = 660;
public function __construct() { public function _before() {
parent::__construct(); parent::_before();
$this->newsletter = [ $this->newsletter = [
'body' => json_decode( 'body' => json_decode(
(string)file_get_contents(dirname(__FILE__) . '/RendererTestData.json'), true (string)file_get_contents(dirname(__FILE__) . '/RendererTestData.json'), true
@ -33,7 +33,7 @@ class RendererTest extends \MailPoetTest {
'type' => 'standard', 'type' => 'standard',
'status' => 'active', 'status' => 'active',
]; ];
$this->renderer = new Renderer(); $this->renderer = $this->diContainer->get(Renderer::class);
$this->columnRenderer = new ColumnRenderer(); $this->columnRenderer = new ColumnRenderer();
$this->dOMParser = new \pQuery(); $this->dOMParser = new \pQuery();
} }

View File

@ -9,6 +9,7 @@ use MailPoet\Models\ScheduledTask;
use MailPoet\Models\SendingQueue; use MailPoet\Models\SendingQueue;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Links\Links; use MailPoet\Newsletter\Links\Links;
use MailPoet\Newsletter\Renderer\Renderer;
use MailPoet\Router\Router; use MailPoet\Router\Router;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Tasks\Sending as SendingTask; use MailPoet\Tasks\Sending as SendingTask;
@ -149,7 +150,11 @@ class ViewInBrowserRendererTest extends \MailPoetTest {
}), }),
]); ]);
$this->settings->set('tracking.enabled', false); $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( $renderedBody = $viewInBrowser->render(
$preview = false, $preview = false,
$this->newsletter, $this->newsletter,

View File

@ -7,6 +7,7 @@ use MailPoet\Models\Newsletter;
use MailPoet\Newsletter\Editor\LayoutHelper as L; use MailPoet\Newsletter\Editor\LayoutHelper as L;
use MailPoet\Newsletter\Renderer\Preprocessor; use MailPoet\Newsletter\Renderer\Preprocessor;
use MailPoet\Newsletter\Renderer\Renderer as NewsletterRenderer; use MailPoet\Newsletter\Renderer\Renderer as NewsletterRenderer;
use MailPoet\Services\Bridge;
use MailPoetVendor\csstidy; use MailPoetVendor\csstidy;
class RendererTest extends \MailPoetTest { class RendererTest extends \MailPoetTest {
@ -36,10 +37,11 @@ class RendererTest extends \MailPoetTest {
} }
public function testGetHTMLBeforeContent() { public function testGetHTMLBeforeContent() {
$renderer = new Renderer(new csstidy); $newsletterRenderer = new NewsletterRenderer(
$newsletterRenderer = new NewsletterRenderer(); $this->diContainer->get(\MailPoet\Newsletter\Renderer\Blocks\Renderer::class),
$newsletterRenderer->preprocessor = new Preprocessor( $this->diContainer->get(\MailPoet\Newsletter\Renderer\Columns\Renderer::class),
$newsletterRenderer->blocksRenderer, new Preprocessor(
$this->diContainer->get(\MailPoet\Newsletter\Renderer\Blocks\Renderer::class),
Stub::make( Stub::make(
\MailPoet\WooCommerce\TransactionalEmails::class, \MailPoet\WooCommerce\TransactionalEmails::class,
[ [
@ -49,7 +51,12 @@ class RendererTest extends \MailPoetTest {
], ],
] ]
) )
),
$this->diContainer->get(\MailPoetVendor\CSS::class),
$this->diContainer->get(Bridge::class)
); );
$renderer = new Renderer(new csstidy, $newsletterRenderer);
$renderer->render($this->newsletter); $renderer->render($this->newsletter);
$html = $renderer->getHTMLBeforeContent('Heading Text'); $html = $renderer->getHTMLBeforeContent('Heading Text');
expect($html)->contains('Some text before heading'); expect($html)->contains('Some text before heading');
@ -59,10 +66,11 @@ class RendererTest extends \MailPoetTest {
} }
public function testGetHTMLAfterContent() { public function testGetHTMLAfterContent() {
$newsletterRenderer = new NewsletterRenderer(); $newsletterRenderer = new NewsletterRenderer(
$renderer = new Renderer(new csstidy, $newsletterRenderer); $this->diContainer->get(\MailPoet\Newsletter\Renderer\Blocks\Renderer::class),
$newsletterRenderer->preprocessor = new Preprocessor( $this->diContainer->get(\MailPoet\Newsletter\Renderer\Columns\Renderer::class),
$newsletterRenderer->blocksRenderer, new Preprocessor(
$this->diContainer->get(\MailPoet\Newsletter\Renderer\Blocks\Renderer::class),
Stub::make( Stub::make(
\MailPoet\WooCommerce\TransactionalEmails::class, \MailPoet\WooCommerce\TransactionalEmails::class,
[ [
@ -72,7 +80,11 @@ class RendererTest extends \MailPoetTest {
], ],
] ]
) )
),
$this->diContainer->get(\MailPoetVendor\CSS::class),
$this->diContainer->get(Bridge::class)
); );
$renderer = new Renderer(new csstidy, $newsletterRenderer);
$renderer->render($this->newsletter); $renderer->render($this->newsletter);
$html = $renderer->getHTMLAfterContent(); $html = $renderer->getHTMLAfterContent();
expect($html)->notContains('Some text before heading'); expect($html)->notContains('Some text before heading');
@ -82,7 +94,7 @@ class RendererTest extends \MailPoetTest {
} }
public function testPrefixCss() { public function testPrefixCss() {
$renderer = new Renderer(new csstidy); $renderer = new Renderer(new csstidy, $this->diContainer->get(NewsletterRenderer::class));
$css = $renderer->prefixCss(' $css = $renderer->prefixCss('
#some_id {color: black} #some_id {color: black}
.some-class {height: 50px; width: 30px} .some-class {height: 50px; width: 30px}

View File

@ -6,7 +6,6 @@ use Codeception\Stub;
use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\WooCommerce\Helper as WooCommerceHelper; use MailPoet\WooCommerce\Helper as WooCommerceHelper;
use MailPoet\WooCommerce\TransactionalEmails\Renderer;
use MailPoet\WooCommerce\TransactionalEmails\Template; use MailPoet\WooCommerce\TransactionalEmails\Template;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;