Extract usage of emoji encoding from the sending queue model [MAILPOET-2460]
This commit is contained in:
@ -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,
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user