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\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;

View File

@ -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);
}

View File

@ -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()],

View File

@ -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);
}

View File

@ -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,

View File

@ -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');
}
}

View File

@ -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();
}

View File

@ -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,

View File

@ -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}

View File

@ -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;