Merge pull request #512 from mailpoet/preview_link_refactoring
Extracts browser preview URl logic into a separate class
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
namespace MailPoet\Config;
|
namespace MailPoet\Config;
|
||||||
|
|
||||||
use MailPoet\Cron\Daemon;
|
use MailPoet\Cron\Daemon;
|
||||||
use MailPoet\Newsletter\Viewer\ViewInBrowser;
|
use MailPoet\Newsletter\ViewInBrowser;
|
||||||
use MailPoet\Statistics\Track\Clicks;
|
use MailPoet\Statistics\Track\Clicks;
|
||||||
use MailPoet\Statistics\Track\Opens;
|
use MailPoet\Statistics\Track\Opens;
|
||||||
use MailPoet\Subscription;
|
use MailPoet\Subscription;
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
namespace MailPoet\Newsletter\Shortcodes\Categories;
|
namespace MailPoet\Newsletter\Shortcodes\Categories;
|
||||||
|
|
||||||
use MailPoet\Models\Setting;
|
use MailPoet\Models\Setting;
|
||||||
use MailPoet\Models\Subscriber as SubscriberModel;
|
use MailPoet\Newsletter\Url as NewsletterUrl;
|
||||||
use MailPoet\Statistics\Track\Unsubscribes;
|
use MailPoet\Statistics\Track\Unsubscribes;
|
||||||
use MailPoet\Subscription\Url as SubscriptionUrl;
|
use MailPoet\Subscription\Url as SubscriptionUrl;
|
||||||
|
|
||||||
@@ -58,8 +58,8 @@ class Link {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'newsletter_view_in_browser':
|
case 'newsletter_view_in_browser':
|
||||||
$action = 'view_in_browser_url';
|
$action = 'newsletter_view_in_browser_url';
|
||||||
$url = esc_attr(self::getViewInBrowserUrl($newsletter, $subscriber, $queue));
|
$url = esc_attr(NewsletterUrl::getViewInBrowserUrl($newsletter, $subscriber, $queue));
|
||||||
$url = self::processUrl($action, $url, $queue);
|
$url = self::processUrl($action, $url, $queue);
|
||||||
return sprintf(
|
return sprintf(
|
||||||
'<a target="_blank" href="%s">%s</a>',
|
'<a target="_blank" href="%s">%s</a>',
|
||||||
@@ -69,9 +69,9 @@ class Link {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'newsletter_view_in_browser_url':
|
case 'newsletter_view_in_browser_url':
|
||||||
$url = self::getViewInBrowserUrl($newsletter, $subscriber, $queue);
|
$url = NewsletterUrl::getViewInBrowserUrl($newsletter, $subscriber, $queue);
|
||||||
return self::processUrl($action, $url, $queue);
|
return self::processUrl($action, $url, $queue);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
$shortcode = self::getShortcode($action);
|
$shortcode = self::getShortcode($action);
|
||||||
@@ -89,29 +89,6 @@ class Link {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static function getViewInBrowserUrl(
|
|
||||||
$newsletter,
|
|
||||||
$subscriber = false,
|
|
||||||
$queue = false
|
|
||||||
) {
|
|
||||||
$data = array(
|
|
||||||
'newsletter' => (isset($newsletter['id'])) ?
|
|
||||||
$newsletter['id'] :
|
|
||||||
$newsletter,
|
|
||||||
'subscriber' => (isset($subscriber['id'])) ?
|
|
||||||
$subscriber['id'] :
|
|
||||||
$subscriber,
|
|
||||||
'subscriber_token' => (isset($subscriber['id'])) ?
|
|
||||||
SubscriberModel::generateToken($subscriber['email']) :
|
|
||||||
false,
|
|
||||||
'queue' => (isset($queue['id'])) ?
|
|
||||||
$queue['id'] :
|
|
||||||
$queue
|
|
||||||
);
|
|
||||||
$data = rtrim(base64_encode(serialize($data)), '=');
|
|
||||||
return home_url() . '/?mailpoet&endpoint=view_in_browser&data=' . $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
static function processUrl($action, $url, $queue) {
|
static function processUrl($action, $url, $queue) {
|
||||||
return ($queue !== false && (boolean) Setting::getValue('tracking.enabled')) ?
|
return ($queue !== false && (boolean) Setting::getValue('tracking.enabled')) ?
|
||||||
self::getShortcode($action) :
|
self::getShortcode($action) :
|
||||||
@@ -129,13 +106,13 @@ class Link {
|
|||||||
$unsubscribe->track($subscriber['id'], $queue['id'], $newsletter['id']);
|
$unsubscribe->track($subscriber['id'], $queue['id'], $newsletter['id']);
|
||||||
}
|
}
|
||||||
$url = SubscriptionUrl::getUnsubscribeUrl($subscriber);
|
$url = SubscriptionUrl::getUnsubscribeUrl($subscriber);
|
||||||
break;
|
break;
|
||||||
case 'subscription_manage_url':
|
case 'subscription_manage_url':
|
||||||
$url = SubscriptionUrl::getManageUrl($subscriber);
|
$url = SubscriptionUrl::getManageUrl($subscriber);
|
||||||
break;
|
break;
|
||||||
case 'newsletter_view_in_browser_url':
|
case 'newsletter_view_in_browser_url':
|
||||||
$url = Link::getViewInBrowserUrl($newsletter, $subscriber, $queue);
|
$url = NewsletterUrl::getViewInBrowserUrl($newsletter, $subscriber, $queue);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$shortcode = self::getShortcode($shortcode_action);
|
$shortcode = self::getShortcode($shortcode_action);
|
||||||
$url = apply_filters(
|
$url = apply_filters(
|
||||||
@@ -146,7 +123,7 @@ class Link {
|
|||||||
$queue
|
$queue
|
||||||
);
|
);
|
||||||
$url = ($url !== $shortcode_action) ? $url : false;
|
$url = ($url !== $shortcode_action) ? $url : false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return $url;
|
return $url;
|
||||||
}
|
}
|
||||||
|
42
lib/Newsletter/Url.php
Normal file
42
lib/Newsletter/Url.php
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<?php
|
||||||
|
namespace MailPoet\Newsletter;
|
||||||
|
|
||||||
|
use MailPoet\Models\Subscriber;
|
||||||
|
|
||||||
|
class Url {
|
||||||
|
static function getViewInBrowserUrl(
|
||||||
|
$newsletter,
|
||||||
|
$subscriber = false,
|
||||||
|
$queue = false
|
||||||
|
) {
|
||||||
|
if(is_object($newsletter)) {
|
||||||
|
$newsletter = $newsletter->asArray();
|
||||||
|
}
|
||||||
|
if(is_object($subscriber)) {
|
||||||
|
$subscriber = $subscriber->asArray();
|
||||||
|
}
|
||||||
|
if(is_object($queue)) {
|
||||||
|
$queue = $queue->asArray();
|
||||||
|
}
|
||||||
|
$data = array(
|
||||||
|
'newsletter' => (!empty($newsletter['id'])) ?
|
||||||
|
$newsletter['id'] :
|
||||||
|
$newsletter,
|
||||||
|
'subscriber' => (!empty($subscriber['id'])) ?
|
||||||
|
$subscriber['id'] :
|
||||||
|
$subscriber,
|
||||||
|
'subscriber_token' => (!empty($subscriber['id'])) ?
|
||||||
|
Subscriber::generateToken($subscriber['email']) :
|
||||||
|
false,
|
||||||
|
'queue' => (!empty($queue['id'])) ?
|
||||||
|
$queue['id'] :
|
||||||
|
$queue
|
||||||
|
);
|
||||||
|
$params = array(
|
||||||
|
'mailpoet' => '',
|
||||||
|
'endpoint' => 'view_in_browser',
|
||||||
|
'data' => base64_encode(serialize($data))
|
||||||
|
);
|
||||||
|
return add_query_arg($params, home_url());
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace MailPoet\Newsletter\Viewer;
|
namespace MailPoet\Newsletter;
|
||||||
|
|
||||||
use MailPoet\Models\Newsletter;
|
use MailPoet\Models\Newsletter;
|
||||||
use MailPoet\Models\SendingQueue;
|
use MailPoet\Models\SendingQueue;
|
@@ -11,7 +11,7 @@ use MailPoet\Models\NewsletterOption;
|
|||||||
use MailPoet\Models\Subscriber;
|
use MailPoet\Models\Subscriber;
|
||||||
use MailPoet\Newsletter\Renderer\Renderer;
|
use MailPoet\Newsletter\Renderer\Renderer;
|
||||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||||
use MailPoet\Newsletter\Shortcodes\Categories\Link;
|
use MailPoet\Newsletter\Url as NewsletterUrl;
|
||||||
use MailPoet\Util\Helpers;
|
use MailPoet\Util\Helpers;
|
||||||
|
|
||||||
if(!defined('ABSPATH')) exit;
|
if(!defined('ABSPATH')) exit;
|
||||||
@@ -154,7 +154,7 @@ class Newsletters {
|
|||||||
$subscriber = Subscriber::where('email', $wp_user->data->user_email)
|
$subscriber = Subscriber::where('email', $wp_user->data->user_email)
|
||||||
->findOne();
|
->findOne();
|
||||||
$subscriber = ($subscriber) ? $subscriber->asArray() : $subscriber;
|
$subscriber = ($subscriber) ? $subscriber->asArray() : $subscriber;
|
||||||
$preview_url = Link::getViewInBrowserUrl($data, $subscriber);
|
$preview_url = NewsletterUrl::getViewInBrowserUrl($data, $subscriber);
|
||||||
return array(
|
return array(
|
||||||
'result' => true,
|
'result' => true,
|
||||||
'data' => array('url' => $preview_url)
|
'data' => array('url' => $preview_url)
|
||||||
|
@@ -165,25 +165,25 @@ class ShortcodesTest extends MailPoetTest {
|
|||||||
$shortcodes_object = $this->shortcodes_object;
|
$shortcodes_object = $this->shortcodes_object;
|
||||||
$result =
|
$result =
|
||||||
$shortcodes_object->process(array('[link:subscription_unsubscribe]'));
|
$shortcodes_object->process(array('[link:subscription_unsubscribe]'));
|
||||||
expect(preg_match('/^<a.*?\/a>$/', $result['0']))->equals(1);
|
expect($result['0'])->regExp('/^<a.*?\/a>$/');
|
||||||
expect(preg_match('/action=unsubscribe/', $result['0']))->equals(1);
|
expect($result['0'])->regExp('/action=unsubscribe/');
|
||||||
$result =
|
$result =
|
||||||
$shortcodes_object->process(array('[link:subscription_unsubscribe_url]'));
|
$shortcodes_object->process(array('[link:subscription_unsubscribe_url]'));
|
||||||
expect(preg_match('/^http.*?action=unsubscribe/', $result['0']))->equals(1);
|
expect($result['0'])->regExp('/^http.*?action=unsubscribe/');
|
||||||
$result =
|
$result =
|
||||||
$shortcodes_object->process(array('[link:subscription_manage]'));
|
$shortcodes_object->process(array('[link:subscription_manage]'));
|
||||||
expect(preg_match('/^<a.*?\/a>$/', $result['0']))->equals(1);
|
expect($result['0'])->regExp('/^<a.*?\/a>$/');
|
||||||
expect(preg_match('/action=manage/', $result['0']))->equals(1);
|
expect($result['0'])->regExp('/action=manage/');
|
||||||
$result =
|
$result =
|
||||||
$shortcodes_object->process(array('[link:subscription_manage_url]'));
|
$shortcodes_object->process(array('[link:subscription_manage_url]'));
|
||||||
expect(preg_match('/^http.*?action=manage/', $result['0']))->equals(1);
|
expect($result['0'])->regExp('/^http.*?action=manage/');
|
||||||
$result =
|
$result =
|
||||||
$shortcodes_object->process(array('[link:newsletter_view_in_browser]'));
|
$shortcodes_object->process(array('[link:newsletter_view_in_browser]'));
|
||||||
expect(preg_match('/^<a.*?\/a>$/', $result['0']))->equals(1);
|
expect($result['0'])->regExp('/^<a.*?\/a>$/');
|
||||||
expect(preg_match('/endpoint=view_in_browser/', $result['0']))->equals(1);
|
expect($result['0'])->regExp('/endpoint=view_in_browser/');
|
||||||
$result =
|
$result =
|
||||||
$shortcodes_object->process(array('[link:newsletter_view_in_browser_url]'));
|
$shortcodes_object->process(array('[link:newsletter_view_in_browser_url]'));
|
||||||
expect(preg_match('/^http.*?endpoint=view_in_browser/', $result['0']))->equals(1);
|
expect($result['0'])->regExp('/^http.*?endpoint=view_in_browser/');
|
||||||
}
|
}
|
||||||
|
|
||||||
function testItReturnsShortcodeWhenTrackingEnabled() {
|
function testItReturnsShortcodeWhenTrackingEnabled() {
|
||||||
@@ -191,9 +191,9 @@ class ShortcodesTest extends MailPoetTest {
|
|||||||
$shortcode = '[link:subscription_unsubscribe_url]';
|
$shortcode = '[link:subscription_unsubscribe_url]';
|
||||||
$result =
|
$result =
|
||||||
$shortcodes_object->process(array($shortcode));
|
$shortcodes_object->process(array($shortcode));
|
||||||
expect(preg_match('/^http.*?action=unsubscribe/', $result['0']))->equals(1);
|
expect($result['0'])->regExp('/^http.*?action=unsubscribe/');
|
||||||
Setting::setValue('tracking.enabled', true);
|
Setting::setValue('tracking.enabled', true);
|
||||||
$shortcodes = array(
|
$initial_shortcodes = array(
|
||||||
'[link:subscription_unsubscribe]',
|
'[link:subscription_unsubscribe]',
|
||||||
'[link:subscription_unsubscribe_url]',
|
'[link:subscription_unsubscribe_url]',
|
||||||
'[link:subscription_manage]',
|
'[link:subscription_manage]',
|
||||||
@@ -201,13 +201,26 @@ class ShortcodesTest extends MailPoetTest {
|
|||||||
'[link:newsletter_view_in_browser]',
|
'[link:newsletter_view_in_browser]',
|
||||||
'[link:newsletter_view_in_browser_url]'
|
'[link:newsletter_view_in_browser_url]'
|
||||||
);
|
);
|
||||||
|
$expected_transformed_shortcodes = array(
|
||||||
|
'[link:subscription_unsubscribe_url]',
|
||||||
|
'[link:subscription_unsubscribe_url]',
|
||||||
|
'[link:subscription_manage_url]',
|
||||||
|
'[link:subscription_manage_url]',
|
||||||
|
'[link:newsletter_view_in_browser_url]',
|
||||||
|
'[link:newsletter_view_in_browser_url]'
|
||||||
|
);
|
||||||
// tracking function only works during sending, so queue object must not be false
|
// tracking function only works during sending, so queue object must not be false
|
||||||
$shortcodes_object->queue = true;
|
$shortcodes_object->queue = true;
|
||||||
$result =
|
$result = $shortcodes_object->process($initial_shortcodes);
|
||||||
$shortcodes_object->process($shortcodes);
|
foreach($result as $index => $transformed_shortcode) {
|
||||||
// all returned shortcodes must end with url
|
// 1. result must not contain a link
|
||||||
$result = join(',', $result);
|
expect($transformed_shortcode)->regExp('/^((?!href="http).)*$/');
|
||||||
expect(substr_count($result, '_url'))->equals(count($shortcodes));
|
// 2. result must include a URL shortcode. for example:
|
||||||
|
// [link:subscription_unsubscribe] should become
|
||||||
|
// [link:subscription_unsubscribe_url]
|
||||||
|
expect($transformed_shortcode)
|
||||||
|
->regExp('/' . preg_quote($expected_transformed_shortcodes[$index]) . '/');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function testItCanProcessCustomLinkShortcodes() {
|
function testItCanProcessCustomLinkShortcodes() {
|
||||||
|
Reference in New Issue
Block a user