diff --git a/lib/Config/Initializer.php b/lib/Config/Initializer.php index 42282d317d..d7b8abb442 100644 --- a/lib/Config/Initializer.php +++ b/lib/Config/Initializer.php @@ -377,11 +377,9 @@ class Initializer { private function setupWoocommerceTransactionalEmails() { $wcEnabled = $this->wcHelper->isWooCommerceActive(); $optInEnabled = $this->settings->get('woocommerce.use_mailpoet_editor', false); - if ($wcEnabled) { - $this->wcTransactionalEmails->enableEmailSettingsSyncToWooCommerce(); - if ($optInEnabled) { - $this->wcTransactionalEmails->useTemplateForWoocommerceEmails(); - } + if ($wcEnabled && $optInEnabled) { + $this->wcTransactionalEmails->overrideStylesForWooEmails(); + $this->wcTransactionalEmails->useTemplateForWoocommerceEmails(); } } } diff --git a/lib/Entities/NewsletterEntity.php b/lib/Entities/NewsletterEntity.php index fbf0b270e6..35c101d118 100644 --- a/lib/Entities/NewsletterEntity.php +++ b/lib/Entities/NewsletterEntity.php @@ -459,4 +459,12 @@ class NewsletterEntity { $criteria->where($expr->neq('countToProcess', 0)); 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; + } } diff --git a/lib/WooCommerce/TransactionalEmailHooks.php b/lib/WooCommerce/TransactionalEmailHooks.php index 95b268b950..1912de4bff 100644 --- a/lib/WooCommerce/TransactionalEmailHooks.php +++ b/lib/WooCommerce/TransactionalEmailHooks.php @@ -60,10 +60,6 @@ class TransactionalEmailHooks { }); } - public function enableEmailSettingsSyncToWooCommerce() { - $this->wp->addFilter('mailpoet_api_newsletters_save_after', [$this, 'syncEmailSettingsToWooCommerce']); - } - private function getNewsletter(): NewsletterEntity { $newsletter = $this->newsletterRepository->findOneById($this->settings->get(TransactionalEmails::SETTING_EMAIL_ID)); if (!$newsletter instanceof NewsletterEntity) { @@ -72,21 +68,22 @@ class TransactionalEmailHooks { return $newsletter; } - public function syncEmailSettingsToWooCommerce(array $newsletterData) { - if ($newsletterData['type'] !== NewsletterEntity::TYPE_WC_TRANSACTIONAL_EMAIL) { - return $newsletterData; - } - - $styles = $newsletterData['body']['globalStyles']; - $optionsToSync = [ - 'woocommerce_email_background_color' => $styles['body']['backgroundColor'], - 'woocommerce_email_base_color' => $styles['woocommerce']['brandingColor'], - 'woocommerce_email_body_background_color' => $styles['wrapper']['backgroundColor'], - 'woocommerce_email_text_color' => $styles['text']['fontColor'], - ]; - foreach ($optionsToSync as $wcName => $value) { - $this->wp->updateOption($wcName, $value); - } - return $newsletterData; + public function overrideStylesForWooEmails() { + $this->wp->addAction('option_woocommerce_email_background_color', function($value) { + $newsletter = $this->getNewsletter(); + return $newsletter->getGlobalStyle('body', 'backgroundColor') ?? $value; + }); + $this->wp->addAction('option_woocommerce_email_base_color', function($value) { + $newsletter = $this->getNewsletter(); + return $newsletter->getGlobalStyle('woocommerce', 'brandingColor') ?? $value; + }); + $this->wp->addAction('option_woocommerce_email_body_background_color', function($value) { + $newsletter = $this->getNewsletter(); + return $newsletter->getGlobalStyle('wrapper', 'backgroundColor') ?? $value; + }); + $this->wp->addAction('option_woocommerce_email_text_color', function($value) { + $newsletter = $this->getNewsletter(); + return $newsletter->getGlobalStyle('text', 'fontColor') ?? $value; + }); } } diff --git a/tests/integration/WooCommerce/TransactionalEmailHooksTest.php b/tests/integration/WooCommerce/TransactionalEmailHooksTest.php index 559685e24b..0b0ad6d05b 100644 --- a/tests/integration/WooCommerce/TransactionalEmailHooksTest.php +++ b/tests/integration/WooCommerce/TransactionalEmailHooksTest.php @@ -3,8 +3,6 @@ namespace MailPoet\WooCommerce; use Codeception\Stub; -use MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder; -use MailPoet\DI\ContainerWrapper; use MailPoet\Entities\NewsletterEntity; use MailPoet\Models\Newsletter; use MailPoet\Newsletter\Editor\LayoutHelper as L; @@ -24,12 +22,17 @@ class TransactionalEmailHooksTest extends \MailPoetTest { /** @var NewslettersRepository */ private $newslettersRepository; + /** @var WPFunctions */ + private $wp; + public function _before() { $this->settings = $this->diContainer->get(SettingsController::class); $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->setType(Newsletter::TYPE_WC_TRANSACTIONAL_EMAIL); $newsletter->setSubject('WooCommerce Transactional Email'); @@ -85,31 +88,26 @@ class TransactionalEmailHooksTest extends \MailPoetTest { ]); $this->newslettersRepository->persist($newsletter); $this->newslettersRepository->flush(); + $this->settings->set(TransactionalEmails::SETTING_EMAIL_ID, $newsletter->getId()); - $options = []; - $wp = Stub::make(new WPFunctions, [ - 'updateOption' => function($name, $value) use (&$options) { - $options[$name] = $value; - }, - 'getOption' => function($name) use (&$options) { - return $options[$name]; - }, - ]); + // Set woo options + $this->wp->updateOption('woocommerce_email_background_color', 'white'); + $this->wp->updateOption('woocommerce_email_base_color', 'red'); + $this->wp->updateOption('woocommerce_email_body_background_color', 'blue'); + $this->wp->updateOption('woocommerce_email_text_color', 'black'); - $transactionalEmails = new TransactionalEmailHooks( - $wp, - $this->settings, - ContainerWrapper::getInstance()->get(Renderer::class) - ); - $transactionalEmails->enableEmailSettingsSyncToWooCommerce(); + expect($this->wp->getOption('woocommerce_email_background_color'))->equals('white'); + expect($this->wp->getOption('woocommerce_email_base_color'))->equals('red'); + expect($this->wp->getOption('woocommerce_email_body_background_color'))->equals('blue'); + expect($this->wp->getOption('woocommerce_email_text_color'))->equals('black'); - $newsletterData = $this->diContainer->get(NewslettersResponseBuilder::class)->build($newsletter); - $wp->applyFilters('mailpoet_api_newsletters_save_after', $newsletterData); + $transactionalEmails = $this->diContainer->get(TransactionalEmailHooks::class); + $transactionalEmails->overrideStylesForWooEmails(); - expect($wp->getOption('woocommerce_email_background_color'))->equals('#777777'); - expect($wp->getOption('woocommerce_email_base_color'))->equals('#888888'); - expect($wp->getOption('woocommerce_email_body_background_color'))->equals('#666666'); - expect($wp->getOption('woocommerce_email_text_color'))->equals('#111111'); + expect($this->wp->getOption('woocommerce_email_background_color'))->equals('#777777'); + expect($this->wp->getOption('woocommerce_email_base_color'))->equals('#888888'); + expect($this->wp->getOption('woocommerce_email_body_background_color'))->equals('#666666'); + expect($this->wp->getOption('woocommerce_email_text_color'))->equals('#111111'); } public function testUseTemplateForWCEmails() {