Use option filters instead of synchronization Woo email styles

With this change the Woo template editor will never overwrite Woo commerce settings,
but replace values of those settings using hooks.
[MAILPOET-3645]
This commit is contained in:
Rostislav Wolny
2021-06-10 09:57:59 +02:00
committed by Veljko V
parent 7158f879aa
commit d5f6f63ebe
4 changed files with 50 additions and 49 deletions

View File

@ -377,11 +377,9 @@ class Initializer {
private function setupWoocommerceTransactionalEmails() { private function setupWoocommerceTransactionalEmails() {
$wcEnabled = $this->wcHelper->isWooCommerceActive(); $wcEnabled = $this->wcHelper->isWooCommerceActive();
$optInEnabled = $this->settings->get('woocommerce.use_mailpoet_editor', false); $optInEnabled = $this->settings->get('woocommerce.use_mailpoet_editor', false);
if ($wcEnabled) { if ($wcEnabled && $optInEnabled) {
$this->wcTransactionalEmails->enableEmailSettingsSyncToWooCommerce(); $this->wcTransactionalEmails->overrideStylesForWooEmails();
if ($optInEnabled) { $this->wcTransactionalEmails->useTemplateForWoocommerceEmails();
$this->wcTransactionalEmails->useTemplateForWoocommerceEmails();
}
} }
} }
} }

View File

@ -459,4 +459,12 @@ class NewsletterEntity {
$criteria->where($expr->neq('countToProcess', 0)); $criteria->where($expr->neq('countToProcess', 0));
return $this->queues->matching($criteria); return $this->queues->matching($criteria);
} }
public function getGlobalStyle(string $category, string $style): ?string {
$body = $this->getBody();
if ($body === null) {
return null;
}
return $body['globalStyles'][$category][$style] ?? null;
}
} }

View File

@ -60,10 +60,6 @@ class TransactionalEmailHooks {
}); });
} }
public function enableEmailSettingsSyncToWooCommerce() {
$this->wp->addFilter('mailpoet_api_newsletters_save_after', [$this, 'syncEmailSettingsToWooCommerce']);
}
private function getNewsletter(): NewsletterEntity { private function getNewsletter(): NewsletterEntity {
$newsletter = $this->newsletterRepository->findOneById($this->settings->get(TransactionalEmails::SETTING_EMAIL_ID)); $newsletter = $this->newsletterRepository->findOneById($this->settings->get(TransactionalEmails::SETTING_EMAIL_ID));
if (!$newsletter instanceof NewsletterEntity) { if (!$newsletter instanceof NewsletterEntity) {
@ -72,21 +68,22 @@ class TransactionalEmailHooks {
return $newsletter; return $newsletter;
} }
public function syncEmailSettingsToWooCommerce(array $newsletterData) { public function overrideStylesForWooEmails() {
if ($newsletterData['type'] !== NewsletterEntity::TYPE_WC_TRANSACTIONAL_EMAIL) { $this->wp->addAction('option_woocommerce_email_background_color', function($value) {
return $newsletterData; $newsletter = $this->getNewsletter();
} return $newsletter->getGlobalStyle('body', 'backgroundColor') ?? $value;
});
$styles = $newsletterData['body']['globalStyles']; $this->wp->addAction('option_woocommerce_email_base_color', function($value) {
$optionsToSync = [ $newsletter = $this->getNewsletter();
'woocommerce_email_background_color' => $styles['body']['backgroundColor'], return $newsletter->getGlobalStyle('woocommerce', 'brandingColor') ?? $value;
'woocommerce_email_base_color' => $styles['woocommerce']['brandingColor'], });
'woocommerce_email_body_background_color' => $styles['wrapper']['backgroundColor'], $this->wp->addAction('option_woocommerce_email_body_background_color', function($value) {
'woocommerce_email_text_color' => $styles['text']['fontColor'], $newsletter = $this->getNewsletter();
]; return $newsletter->getGlobalStyle('wrapper', 'backgroundColor') ?? $value;
foreach ($optionsToSync as $wcName => $value) { });
$this->wp->updateOption($wcName, $value); $this->wp->addAction('option_woocommerce_email_text_color', function($value) {
} $newsletter = $this->getNewsletter();
return $newsletterData; return $newsletter->getGlobalStyle('text', 'fontColor') ?? $value;
});
} }
} }

View File

@ -3,8 +3,6 @@
namespace MailPoet\WooCommerce; namespace MailPoet\WooCommerce;
use Codeception\Stub; use Codeception\Stub;
use MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\NewsletterEntity;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Newsletter\Editor\LayoutHelper as L; use MailPoet\Newsletter\Editor\LayoutHelper as L;
@ -24,12 +22,17 @@ class TransactionalEmailHooksTest extends \MailPoetTest {
/** @var NewslettersRepository */ /** @var NewslettersRepository */
private $newslettersRepository; private $newslettersRepository;
/** @var WPFunctions */
private $wp;
public function _before() { public function _before() {
$this->settings = $this->diContainer->get(SettingsController::class); $this->settings = $this->diContainer->get(SettingsController::class);
$this->originalWcSettings = $this->settings->get('woocommerce'); $this->originalWcSettings = $this->settings->get('woocommerce');
$this->newslettersRepository = $this->diContainer->get(NewslettersRepository::class);
$this->wp = $this->diContainer->get(WPFunctions::class);
} }
public function testItSynchronizesEmailSettingsToWooCommerce() { public function testItCanReplaceWoocommerceEmailStyles() {
$newsletter = new NewsletterEntity; $newsletter = new NewsletterEntity;
$newsletter->setType(Newsletter::TYPE_WC_TRANSACTIONAL_EMAIL); $newsletter->setType(Newsletter::TYPE_WC_TRANSACTIONAL_EMAIL);
$newsletter->setSubject('WooCommerce Transactional Email'); $newsletter->setSubject('WooCommerce Transactional Email');
@ -85,31 +88,26 @@ class TransactionalEmailHooksTest extends \MailPoetTest {
]); ]);
$this->newslettersRepository->persist($newsletter); $this->newslettersRepository->persist($newsletter);
$this->newslettersRepository->flush(); $this->newslettersRepository->flush();
$this->settings->set(TransactionalEmails::SETTING_EMAIL_ID, $newsletter->getId());
$options = []; // Set woo options
$wp = Stub::make(new WPFunctions, [ $this->wp->updateOption('woocommerce_email_background_color', 'white');
'updateOption' => function($name, $value) use (&$options) { $this->wp->updateOption('woocommerce_email_base_color', 'red');
$options[$name] = $value; $this->wp->updateOption('woocommerce_email_body_background_color', 'blue');
}, $this->wp->updateOption('woocommerce_email_text_color', 'black');
'getOption' => function($name) use (&$options) {
return $options[$name];
},
]);
$transactionalEmails = new TransactionalEmailHooks( expect($this->wp->getOption('woocommerce_email_background_color'))->equals('white');
$wp, expect($this->wp->getOption('woocommerce_email_base_color'))->equals('red');
$this->settings, expect($this->wp->getOption('woocommerce_email_body_background_color'))->equals('blue');
ContainerWrapper::getInstance()->get(Renderer::class) expect($this->wp->getOption('woocommerce_email_text_color'))->equals('black');
);
$transactionalEmails->enableEmailSettingsSyncToWooCommerce();
$newsletterData = $this->diContainer->get(NewslettersResponseBuilder::class)->build($newsletter); $transactionalEmails = $this->diContainer->get(TransactionalEmailHooks::class);
$wp->applyFilters('mailpoet_api_newsletters_save_after', $newsletterData); $transactionalEmails->overrideStylesForWooEmails();
expect($wp->getOption('woocommerce_email_background_color'))->equals('#777777'); expect($this->wp->getOption('woocommerce_email_background_color'))->equals('#777777');
expect($wp->getOption('woocommerce_email_base_color'))->equals('#888888'); expect($this->wp->getOption('woocommerce_email_base_color'))->equals('#888888');
expect($wp->getOption('woocommerce_email_body_background_color'))->equals('#666666'); expect($this->wp->getOption('woocommerce_email_body_background_color'))->equals('#666666');
expect($wp->getOption('woocommerce_email_text_color'))->equals('#111111'); expect($this->wp->getOption('woocommerce_email_text_color'))->equals('#111111');
} }
public function testUseTemplateForWCEmails() { public function testUseTemplateForWCEmails() {