Extract usage of emoji encoding from the sending queue model [MAILPOET-2460]

This commit is contained in:
wxa
2019-10-23 14:46:02 +03:00
committed by Jack Kitterhing
parent ef79b7efbb
commit 8fb18e7c2e
6 changed files with 50 additions and 33 deletions

View File

@ -15,6 +15,7 @@ use MailPoet\Newsletter\Renderer\PostProcess\OpenTracking;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Statistics\GATracking; use MailPoet\Statistics\GATracking;
use MailPoet\Util\Helpers; use MailPoet\Util\Helpers;
use MailPoet\WP\Emoji;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
class Newsletter { class Newsletter {
@ -33,7 +34,10 @@ class Newsletter {
/** @var LoggerFactory */ /** @var LoggerFactory */
private $logger_factory; private $logger_factory;
function __construct(WPFunctions $wp = null, PostsTask $posts_task = null, GATracking $ga_tracking = null) { /** @var Emoji */
private $emoji;
function __construct(WPFunctions $wp = null, PostsTask $posts_task = null, GATracking $ga_tracking = null, Emoji $emoji = null) {
$settings = new SettingsController(); $settings = new SettingsController();
$this->tracking_enabled = (boolean)$settings->get('tracking.enabled'); $this->tracking_enabled = (boolean)$settings->get('tracking.enabled');
if ($wp === null) { if ($wp === null) {
@ -49,6 +53,10 @@ class Newsletter {
} }
$this->ga_tracking = $ga_tracking; $this->ga_tracking = $ga_tracking;
$this->logger_factory = LoggerFactory::getInstance(); $this->logger_factory = LoggerFactory::getInstance();
if ($emoji === null) {
$emoji = new Emoji();
}
$this->emoji = $emoji;
} }
function getNewsletterFromQueue($queue) { function getNewsletterFromQueue($queue) {
@ -141,6 +149,7 @@ class Newsletter {
if (empty(trim($sending_task->newsletter_rendered_subject))) { if (empty(trim($sending_task->newsletter_rendered_subject))) {
$sending_task->newsletter_rendered_subject = WPFunctions::get()->__('No subject', 'mailpoet'); $sending_task->newsletter_rendered_subject = WPFunctions::get()->__('No subject', 'mailpoet');
} }
$rendered_newsletter = $this->emoji->encodeEmojisInBody($rendered_newsletter);
$sending_task->newsletter_rendered_body = $rendered_newsletter; $sending_task->newsletter_rendered_body = $rendered_newsletter;
$sending_task->save(); $sending_task->save();
// catch DB errors // catch DB errors
@ -162,6 +171,7 @@ class Newsletter {
// shortcodes and links will be replaced in the subject, html and text body // shortcodes and links will be replaced in the subject, html and text body
// to speed the processing, join content into a continuous string // to speed the processing, join content into a continuous string
$rendered_newsletter = $queue->getNewsletterRenderedBody(); $rendered_newsletter = $queue->getNewsletterRenderedBody();
$rendered_newsletter = $this->emoji->decodeEmojisInBody($rendered_newsletter);
$prepared_newsletter = Helpers::joinObject( $prepared_newsletter = Helpers::joinObject(
[ [
$queue->newsletter_rendered_subject, $queue->newsletter_rendered_subject,

View File

@ -208,6 +208,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\WooCommerce\Subscription::class)->setPublic(true); $container->autowire(\MailPoet\WooCommerce\Subscription::class)->setPublic(true);
$container->autowire(\MailPoet\WooCommerce\TransactionalEmails::class); $container->autowire(\MailPoet\WooCommerce\TransactionalEmails::class);
// WordPress // WordPress
$container->autowire(\MailPoet\WP\Emoji::class)->setPublic(true);
$container->autowire(\MailPoet\WP\Functions::class)->setPublic(true); $container->autowire(\MailPoet\WP\Functions::class)->setPublic(true);
return $container; return $container;
} }

View File

@ -5,7 +5,6 @@ namespace MailPoet\Models;
use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Tasks\Subscribers as TaskSubscribers; use MailPoet\Tasks\Subscribers as TaskSubscribers;
use MailPoet\Util\Helpers; use MailPoet\Util\Helpers;
use MailPoet\WP\Emoji;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
/** /**
@ -31,15 +30,12 @@ class SendingQueue extends Model {
const PRIORITY_MEDIUM = SendingQueueEntity::PRIORITY_MEDIUM; const PRIORITY_MEDIUM = SendingQueueEntity::PRIORITY_MEDIUM;
const PRIORITY_LOW = SendingQueueEntity::PRIORITY_LOW; const PRIORITY_LOW = SendingQueueEntity::PRIORITY_LOW;
private $emoji;
function __construct() { function __construct() {
parent::__construct(); parent::__construct();
$this->addValidations('newsletter_rendered_body', [ $this->addValidations('newsletter_rendered_body', [
'validRenderedNewsletterBody' => WPFunctions::get()->__('Rendered newsletter body is invalid!', 'mailpoet'), 'validRenderedNewsletterBody' => WPFunctions::get()->__('Rendered newsletter body is invalid!', 'mailpoet'),
]); ]);
$this->emoji = new Emoji();
} }
function task() { function task() {
@ -75,7 +71,7 @@ class SendingQueue extends Model {
if (!Helpers::isJson($this->newsletter_rendered_body) && !is_null($this->newsletter_rendered_body)) { if (!Helpers::isJson($this->newsletter_rendered_body) && !is_null($this->newsletter_rendered_body)) {
$this->set( $this->set(
'newsletter_rendered_body', 'newsletter_rendered_body',
json_encode($this->encodeEmojisInBody($this->newsletter_rendered_body)) json_encode($this->newsletter_rendered_body)
); );
} }
if (!is_null($this->meta) && !Helpers::isJson($this->meta)) { if (!is_null($this->meta) && !Helpers::isJson($this->meta)) {
@ -114,28 +110,6 @@ class SendingQueue extends Model {
return (Helpers::isJson($this->meta)) ? json_decode($this->meta, true) : $this->meta; return (Helpers::isJson($this->meta)) ? json_decode($this->meta, true) : $this->meta;
} }
function encodeEmojisInBody($newsletter_rendered_body) {
if (is_array($newsletter_rendered_body)) {
foreach ($newsletter_rendered_body as $key => $value) {
$newsletter_rendered_body[$key] = $this->emoji->encodeForUTF8Column(
self::$_table,
'newsletter_rendered_body',
$value
);
}
}
return $newsletter_rendered_body;
}
function decodeEmojisInBody($newsletter_rendered_body) {
if (is_array($newsletter_rendered_body)) {
foreach ($newsletter_rendered_body as $key => $value) {
$newsletter_rendered_body[$key] = $this->emoji->decodeEntities($value);
}
}
return $newsletter_rendered_body;
}
function isSubscriberProcessed($subscriber_id) { function isSubscriberProcessed($subscriber_id) {
if (!empty($this->subscribers) if (!empty($this->subscribers)
&& ScheduledTaskSubscriber::getTotalCount($this->task_id) === 0 && ScheduledTaskSubscriber::getTotalCount($this->task_id) === 0
@ -161,10 +135,10 @@ class SendingQueue extends Model {
private function decodeRenderedNewsletterBodyObject($rendered_body) { private function decodeRenderedNewsletterBodyObject($rendered_body) {
if (is_serialized($rendered_body)) { if (is_serialized($rendered_body)) {
return $this->decodeEmojisInBody(unserialize($rendered_body)); return unserialize($rendered_body);
} }
if (Helpers::isJson($rendered_body)) { if (Helpers::isJson($rendered_body)) {
return $this->decodeEmojisInBody(json_decode($rendered_body, true)); return json_decode($rendered_body, true);
} }
return $rendered_body; return $rendered_body;
} }

View File

@ -5,14 +5,18 @@ namespace MailPoet\Newsletter;
use MailPoet\Newsletter\Links\Links; use MailPoet\Newsletter\Links\Links;
use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Newsletter\Renderer\Renderer;
use MailPoet\Newsletter\Shortcodes\Shortcodes; use MailPoet\Newsletter\Shortcodes\Shortcodes;
use MailPoet\WP\Emoji;
class ViewInBrowser { class ViewInBrowser {
/** @var Emoji */
private $emoji;
/** @var bool */ /** @var bool */
private $is_tracking_enabled; private $is_tracking_enabled;
function __construct($is_tracking_enabled) { function __construct(Emoji $emoji, $is_tracking_enabled) {
$this->is_tracking_enabled = $is_tracking_enabled; $this->is_tracking_enabled = $is_tracking_enabled;
$this->emoji = $emoji;
} }
function view($data) { function view($data) {
@ -31,6 +35,7 @@ class ViewInBrowser {
function renderNewsletter($newsletter, $subscriber, $queue, $wp_user_preview) { function renderNewsletter($newsletter, $subscriber, $queue, $wp_user_preview) {
if ($queue && $queue->getNewsletterRenderedBody()) { if ($queue && $queue->getNewsletterRenderedBody()) {
$newsletter_body = $queue->getNewsletterRenderedBody('html'); $newsletter_body = $queue->getNewsletterRenderedBody('html');
$newsletter_body = $this->emoji->decodeEmojisInBody($newsletter_body);
// rendered newsletter body has shortcodes converted to links; we need to // rendered newsletter body has shortcodes converted to links; we need to
// isolate "view in browser", "unsubscribe" and "manage subscription" links // isolate "view in browser", "unsubscribe" and "manage subscription" links
// and convert them to shortcodes, which later will be replaced with "#" when // and convert them to shortcodes, which later will be replaced with "#" when

View File

@ -10,6 +10,7 @@ use MailPoet\Newsletter\Url as NewsletterUrl;
use MailPoet\Newsletter\ViewInBrowser as NewsletterViewInBrowser; use MailPoet\Newsletter\ViewInBrowser as NewsletterViewInBrowser;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Subscribers\LinkTokens; use MailPoet\Subscribers\LinkTokens;
use MailPoet\WP\Emoji;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
class ViewInBrowser { class ViewInBrowser {
@ -28,15 +29,19 @@ class ViewInBrowser {
/** @var LinkTokens */ /** @var LinkTokens */
private $link_tokens; private $link_tokens;
function __construct(AccessControl $access_control, SettingsController $settings, LinkTokens $link_tokens) { /** @var Emoji */
private $emoji;
function __construct(AccessControl $access_control, SettingsController $settings, LinkTokens $link_tokens, Emoji $emoji) {
$this->access_control = $access_control; $this->access_control = $access_control;
$this->settings = $settings; $this->settings = $settings;
$this->link_tokens = $link_tokens; $this->link_tokens = $link_tokens;
$this->emoji = $emoji;
} }
function view($data) { function view($data) {
$data = $this->_processBrowserPreviewData($data); $data = $this->_processBrowserPreviewData($data);
$view_in_browser = new NewsletterViewInBrowser((bool)$this->settings->get('tracking.enabled')); $view_in_browser = new NewsletterViewInBrowser($this->emoji, (bool)$this->settings->get('tracking.enabled'));
return $this->_displayNewsletter($view_in_browser->view($data)); return $this->_displayNewsletter($view_in_browser->view($data));
} }

View File

@ -14,6 +14,28 @@ class Emoji {
$this->wp = $wp; $this->wp = $wp;
} }
function encodeEmojisInBody($newsletter_rendered_body) {
if (is_array($newsletter_rendered_body)) {
return array_map([$this, 'encodeRenderedBodyForUTF8Column'], $newsletter_rendered_body);
}
return $this->encodeRenderedBodyForUTF8Column($newsletter_rendered_body);
}
function decodeEmojisInBody($newsletter_rendered_body) {
if (is_array($newsletter_rendered_body)) {
return array_map([$this, 'decodeEntities'], $newsletter_rendered_body);
}
return $this->decodeEntities($newsletter_rendered_body);
}
private function encodeRenderedBodyForUTF8Column($value) {
return $this->encodeForUTF8Column(
MP_SENDING_QUEUES_TABLE,
'newsletter_rendered_body',
$value
);
}
function encodeForUTF8Column($table, $field, $value) { function encodeForUTF8Column($table, $field, $value) {
global $wpdb; global $wpdb;
$charset = $wpdb->get_col_charset($table, $field); $charset = $wpdb->get_col_charset($table, $field);