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

View File

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

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 {
$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;
});
}
}

View File

@ -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() {