From 8fb18e7c2ec274a906ad7ad835f9c65361bccef0 Mon Sep 17 00:00:00 2001 From: wxa Date: Wed, 23 Oct 2019 14:46:02 +0300 Subject: [PATCH] Extract usage of emoji encoding from the sending queue model [MAILPOET-2460] --- .../Workers/SendingQueue/Tasks/Newsletter.php | 12 ++++++- lib/DI/ContainerConfigurator.php | 1 + lib/Models/SendingQueue.php | 32 ++----------------- lib/Newsletter/ViewInBrowser.php | 7 +++- lib/Router/Endpoints/ViewInBrowser.php | 9 ++++-- lib/WP/Emoji.php | 22 +++++++++++++ 6 files changed, 50 insertions(+), 33 deletions(-) diff --git a/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php b/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php index dc7cf6645e..04dea2a5f4 100644 --- a/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php +++ b/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php @@ -15,6 +15,7 @@ use MailPoet\Newsletter\Renderer\PostProcess\OpenTracking; use MailPoet\Settings\SettingsController; use MailPoet\Statistics\GATracking; use MailPoet\Util\Helpers; +use MailPoet\WP\Emoji; use MailPoet\WP\Functions as WPFunctions; class Newsletter { @@ -33,7 +34,10 @@ class Newsletter { /** @var LoggerFactory */ 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(); $this->tracking_enabled = (boolean)$settings->get('tracking.enabled'); if ($wp === null) { @@ -49,6 +53,10 @@ class Newsletter { } $this->ga_tracking = $ga_tracking; $this->logger_factory = LoggerFactory::getInstance(); + if ($emoji === null) { + $emoji = new Emoji(); + } + $this->emoji = $emoji; } function getNewsletterFromQueue($queue) { @@ -141,6 +149,7 @@ class Newsletter { if (empty(trim($sending_task->newsletter_rendered_subject))) { $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->save(); // catch DB errors @@ -162,6 +171,7 @@ class Newsletter { // shortcodes and links will be replaced in the subject, html and text body // to speed the processing, join content into a continuous string $rendered_newsletter = $queue->getNewsletterRenderedBody(); + $rendered_newsletter = $this->emoji->decodeEmojisInBody($rendered_newsletter); $prepared_newsletter = Helpers::joinObject( [ $queue->newsletter_rendered_subject, diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index 22e4470012..f6e038b8d5 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -208,6 +208,7 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\WooCommerce\Subscription::class)->setPublic(true); $container->autowire(\MailPoet\WooCommerce\TransactionalEmails::class); // WordPress + $container->autowire(\MailPoet\WP\Emoji::class)->setPublic(true); $container->autowire(\MailPoet\WP\Functions::class)->setPublic(true); return $container; } diff --git a/lib/Models/SendingQueue.php b/lib/Models/SendingQueue.php index 740af1dc7e..71dafa5d72 100644 --- a/lib/Models/SendingQueue.php +++ b/lib/Models/SendingQueue.php @@ -5,7 +5,6 @@ namespace MailPoet\Models; use MailPoet\Entities\SendingQueueEntity; use MailPoet\Tasks\Subscribers as TaskSubscribers; use MailPoet\Util\Helpers; -use MailPoet\WP\Emoji; use MailPoet\WP\Functions as WPFunctions; /** @@ -31,15 +30,12 @@ class SendingQueue extends Model { const PRIORITY_MEDIUM = SendingQueueEntity::PRIORITY_MEDIUM; const PRIORITY_LOW = SendingQueueEntity::PRIORITY_LOW; - private $emoji; - function __construct() { parent::__construct(); $this->addValidations('newsletter_rendered_body', [ 'validRenderedNewsletterBody' => WPFunctions::get()->__('Rendered newsletter body is invalid!', 'mailpoet'), ]); - $this->emoji = new Emoji(); } function task() { @@ -75,7 +71,7 @@ class SendingQueue extends Model { if (!Helpers::isJson($this->newsletter_rendered_body) && !is_null($this->newsletter_rendered_body)) { $this->set( '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)) { @@ -114,28 +110,6 @@ class SendingQueue extends Model { 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) { if (!empty($this->subscribers) && ScheduledTaskSubscriber::getTotalCount($this->task_id) === 0 @@ -161,10 +135,10 @@ class SendingQueue extends Model { private function decodeRenderedNewsletterBodyObject($rendered_body) { if (is_serialized($rendered_body)) { - return $this->decodeEmojisInBody(unserialize($rendered_body)); + return unserialize($rendered_body); } if (Helpers::isJson($rendered_body)) { - return $this->decodeEmojisInBody(json_decode($rendered_body, true)); + return json_decode($rendered_body, true); } return $rendered_body; } diff --git a/lib/Newsletter/ViewInBrowser.php b/lib/Newsletter/ViewInBrowser.php index ba49cdb88d..693a516ea6 100644 --- a/lib/Newsletter/ViewInBrowser.php +++ b/lib/Newsletter/ViewInBrowser.php @@ -5,14 +5,18 @@ namespace MailPoet\Newsletter; use MailPoet\Newsletter\Links\Links; use MailPoet\Newsletter\Renderer\Renderer; use MailPoet\Newsletter\Shortcodes\Shortcodes; +use MailPoet\WP\Emoji; class ViewInBrowser { + /** @var Emoji */ + private $emoji; /** @var bool */ private $is_tracking_enabled; - function __construct($is_tracking_enabled) { + function __construct(Emoji $emoji, $is_tracking_enabled) { $this->is_tracking_enabled = $is_tracking_enabled; + $this->emoji = $emoji; } function view($data) { @@ -31,6 +35,7 @@ class ViewInBrowser { function renderNewsletter($newsletter, $subscriber, $queue, $wp_user_preview) { if ($queue && $queue->getNewsletterRenderedBody()) { $newsletter_body = $queue->getNewsletterRenderedBody('html'); + $newsletter_body = $this->emoji->decodeEmojisInBody($newsletter_body); // rendered newsletter body has shortcodes converted to links; we need to // isolate "view in browser", "unsubscribe" and "manage subscription" links // and convert them to shortcodes, which later will be replaced with "#" when diff --git a/lib/Router/Endpoints/ViewInBrowser.php b/lib/Router/Endpoints/ViewInBrowser.php index 80bc1cfd02..e7994b2c65 100644 --- a/lib/Router/Endpoints/ViewInBrowser.php +++ b/lib/Router/Endpoints/ViewInBrowser.php @@ -10,6 +10,7 @@ use MailPoet\Newsletter\Url as NewsletterUrl; use MailPoet\Newsletter\ViewInBrowser as NewsletterViewInBrowser; use MailPoet\Settings\SettingsController; use MailPoet\Subscribers\LinkTokens; +use MailPoet\WP\Emoji; use MailPoet\WP\Functions as WPFunctions; class ViewInBrowser { @@ -28,15 +29,19 @@ class ViewInBrowser { /** @var LinkTokens */ 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->settings = $settings; $this->link_tokens = $link_tokens; + $this->emoji = $emoji; } function view($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)); } diff --git a/lib/WP/Emoji.php b/lib/WP/Emoji.php index 40d1c497e2..69bf8755a7 100644 --- a/lib/WP/Emoji.php +++ b/lib/WP/Emoji.php @@ -14,6 +14,28 @@ class Emoji { $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) { global $wpdb; $charset = $wpdb->get_col_charset($table, $field);