- Optimizes ViewInBrowser router endpoint

- Optimizes ViewInBrowser class
- Optimizes and updates shortcode link category to use the refactored
  getViewInBrowserUrl() method
- Updates Shortcodes to use the refactored getViewInBrowserUrl() method
This commit is contained in:
Vlad
2016-12-12 21:43:52 -05:00
parent 707afc2ae0
commit 9698cf2d2e
6 changed files with 87 additions and 49 deletions

View File

@ -220,7 +220,7 @@ class Newsletters extends APIEndpoint {
$newsletter->save();
$subscriber = Subscriber::getCurrentWPUser();
$preview_url = NewsletterUrl::getViewInBrowserUrl(
NewsletterUrl::ACTION_EDITOR,
NewsletterUrl::TYPE_LISTING_EDITOR,
$newsletter,
$subscriber
);
@ -341,7 +341,7 @@ class Newsletters extends APIEndpoint {
// get preview url
$subscriber = Subscriber::getCurrentWPUser();
$newsletter->preview_url = NewsletterUrl::getViewInBrowserUrl(
NewsletterUrl::ACTION_LISTING,
NewsletterUrl::TYPE_LISTING_EDITOR,
$newsletter,
$subscriber,
$queue

View File

@ -32,7 +32,7 @@ class Shortcodes {
), 2);
add_filter('mailpoet_archive_subject', array(
$this, 'renderArchiveSubject'
), 2);
), 2, 3);
}
function formWidget($params = array()) {
@ -77,6 +77,8 @@ class Shortcodes {
$newsletters = Newsletter::getArchives($segment_ids);
$subscriber = Subscriber::getCurrentWPUser();
if(empty($newsletters)) {
return apply_filters(
'mailpoet_archive_no_newsletters',
@ -90,12 +92,13 @@ class Shortcodes {
$html .= '<ul class="mailpoet_archive">';
foreach($newsletters as $newsletter) {
$queue = $newsletter->queue()->findOne();
$html .= '<li>'.
'<span class="mailpoet_archive_date">'.
apply_filters('mailpoet_archive_date', $newsletter).
'</span>
<span class="mailpoet_archive_subject">'.
apply_filters('mailpoet_archive_subject', $newsletter).
apply_filters('mailpoet_archive_subject', $newsletter, $subscriber, $queue).
'</span>
</li>';
}
@ -111,14 +114,13 @@ class Shortcodes {
);
}
function renderArchiveSubject($newsletter) {
function renderArchiveSubject($newsletter, $subscriber, $queue) {
$preview_url = NewsletterUrl::getViewInBrowserUrl(
NewsletterUrl::TYPE_ARCHIVE,
$newsletter,
$subscriber = false,
$queue = false,
$wp_user_preview = true
$subscriber,
$queue
);
return '<a href="'.esc_attr($preview_url).'" target="_blank" title="'
.esc_attr(__('Preview in a new tab', 'mailpoet')).'">'
.esc_attr($newsletter->subject).

View File

@ -151,8 +151,8 @@ class Links {
// convert either only link shortcodes or all hashes links if "convert all"
// option is specified
if($newsletter_link &&
(preg_match('/\[link:/', $newsletter_link->url) || $convert_all)
){
(preg_match('/\[link:/', $newsletter_link->url) || $convert_all)
) {
$content = str_replace($link, $newsletter_link->url, $content);
}
}

View File

@ -21,7 +21,7 @@ class Link {
$action = 'subscription_unsubscribe_url';
$url = self::processUrl(
$action,
esc_attr(SubscriptionUrl::getUnsubscribeUrl($subscriber)),
SubscriptionUrl::getUnsubscribeUrl($subscriber),
$queue,
$wp_user_preview
);
@ -42,7 +42,7 @@ class Link {
case 'subscription_manage':
$url = self::processUrl(
$action = 'subscription_manage_url',
esc_attr(SubscriptionUrl::getManageUrl($subscriber)),
SubscriptionUrl::getManageUrl($subscriber),
$queue,
$wp_user_preview
);
@ -62,7 +62,13 @@ class Link {
case 'newsletter_view_in_browser':
$action = 'newsletter_view_in_browser_url';
$url = esc_attr(NewsletterUrl::getViewInBrowserUrl($newsletter, $subscriber, $queue));
$url = NewsletterUrl::getViewInBrowserUrl(
$type = null,
$newsletter,
$subscriber,
$queue,
$wp_user_preview
);
$url = self::processUrl($action, $url, $queue, $wp_user_preview);
return sprintf(
'<a target="_blank" href="%s">%s</a>',
@ -71,7 +77,13 @@ class Link {
);
case 'newsletter_view_in_browser_url':
$url = NewsletterUrl::getViewInBrowserUrl($newsletter, $subscriber, $queue);
$url = NewsletterUrl::getViewInBrowserUrl(
$type = null,
$newsletter,
$subscriber,
$queue,
$wp_user_preview
);
return self::processUrl($action, $url, $queue, $wp_user_preview);
default:
@ -113,7 +125,12 @@ class Link {
$url = SubscriptionUrl::getManageUrl($subscriber);
break;
case 'newsletter_view_in_browser_url':
$url = NewsletterUrl::getViewInBrowserUrl($newsletter, $subscriber, $queue);
$url = NewsletterUrl::getViewInBrowserUrl(
$type = null,
$newsletter,
$subscriber,
$queue
);
break;
default:
$shortcode = self::getShortcode($shortcode_action);

View File

@ -2,13 +2,17 @@
namespace MailPoet\Newsletter;
use MailPoet\Models\Setting;
use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Links\Links;
use MailPoet\Newsletter\Renderer\Renderer;
use MailPoet\Newsletter\Shortcodes\Shortcodes;
class ViewInBrowser {
function view($data) {
$wp_user_preview = ($data->preview && $data->subscriber->isWPUser());
$wp_user_preview = (
($data->subscriber && $data->subscriber->isWPUser() && $data->preview) ||
($data->preview && $data->newsletter_hash)
);
return $this->renderNewsletter(
$data->newsletter,
$data->subscriber,
@ -19,10 +23,20 @@ class ViewInBrowser {
function renderNewsletter($newsletter, $subscriber, $queue, $wp_user_preview) {
if($queue && $queue->newsletter_rendered_body) {
$newsletter_body = $queue->getNewsletterRenderedBody();
$newsletter_body = $queue->getNewsletterRenderedBody('html');
// 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
// newsletter is previewed
if($wp_user_preview && preg_match(Links::getLinkRegex(), $newsletter_body)) {
$newsletter_body = Links::convertHashedLinksToShortcodesAndUrls(
$newsletter_body,
$convert_all = true
);
}
} else {
$renderer = new Renderer($newsletter, $wp_user_preview);
$newsletter_body = $renderer->render();
$newsletter_body = $renderer->render('html');
}
$shortcodes = new Shortcodes(
$newsletter,
@ -30,13 +44,12 @@ class ViewInBrowser {
$queue,
$wp_user_preview
);
$rendered_newsletter = $shortcodes->replace($newsletter_body['html']);
if($queue && (boolean)Setting::getValue('tracking.enabled')) {
$rendered_newsletter = $shortcodes->replace($newsletter_body);
if(!$wp_user_preview && $queue && $subscriber && (boolean)Setting::getValue('tracking.enabled')) {
$rendered_newsletter = Links::replaceSubscriberData(
$subscriber->id,
$queue->id,
$rendered_newsletter,
$wp_user_preview
$rendered_newsletter
);
}
return $rendered_newsletter;

View File

@ -4,6 +4,7 @@ namespace MailPoet\Router\Endpoints;
use MailPoet\Models\Newsletter;
use MailPoet\Models\SendingQueue;
use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Url as NewsletterUrl;
use MailPoet\Newsletter\ViewInBrowser as NewsletterViewInBrowser;
if(!defined('ABSPATH')) exit;
@ -24,37 +25,42 @@ class ViewInBrowser {
}
function _processBrowserPreviewData($data) {
$data = (object)$data;
if(empty($data->subscriber_id) ||
empty($data->subscriber_token) ||
empty($data->newsletter_id)
) {
$data = (object)NewsletterUrl::transformUrlDataObject($data);
return ($this->_validateBrowserPreviewData($data)) ?
$data :
$this->_abort();
} else {
$data->newsletter = Newsletter::findOne($data->newsletter_id);
$data->subscriber = Subscriber::findOne($data->subscriber_id);
$data->queue = ($data->queue_id) ?
SendingQueue::findOne($data->queue_id) :
false;
return ($this->_validateBrowserPreviewData($data)) ?
$data :
$this->_abort();
}
}
function _validateBrowserPreviewData($data) {
if(!$data || !$data->subscriber || !$data->newsletter) return false;
$subscriber_token_match =
Subscriber::verifyToken($data->subscriber->email, $data->subscriber_token);
if(!$subscriber_token_match) return false;
// return if this is a WP user previewing the newsletter
if($data->subscriber->isWPUser() && $data->preview) {
return $data;
}
// if queue exists, check if the newsletter was sent to the subscriber
if($data->queue && !$data->queue->isSubscriberProcessed($data->subscriber->id)) {
$data = false;
// either newsletter ID or hash must be defined, and newsletter must exist
if(empty($data->newsletter_id) && empty($data->newsletter_hash)) return false;
$data->newsletter = (!empty($data->newsletter_id)) ?
Newsletter::findOne($data->newsletter_id) :
Newsletter::getByHash($data->newsletter_hash);
if(!$data->newsletter) return false;
// queue is optional; if defined, get it
$data->queue = (!empty($data->queue_id)) ?
SendingQueue::findOne($data->queue_id) :
SendingQueue::where('newsletter_id', $data->newsletter->id)->findOne();
// subscriber is optional; if exists, token must validate
$data->subscriber = (!empty($data->subscriber_id)) ?
Subscriber::findOne($data->subscriber_id) :
false;
if($data->subscriber) {
if(empty($data->subscriber_token) ||
!Subscriber::verifyToken($data->subscriber->email, $data->subscriber_token)
) return false;
}
// if queue and subscriber exist and newsletter is not being previewed,
// subscriber must have received the newsletter
if(empty($data->preview) &&
$data->queue &&
$data->subscriber &&
!$data->queue->isSubscriberProcessed($data->subscriber->id)
) return false;
return $data;
}