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

View File

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

View File

@ -151,8 +151,8 @@ class Links {
// convert either only link shortcodes or all hashes links if "convert all" // convert either only link shortcodes or all hashes links if "convert all"
// option is specified // option is specified
if($newsletter_link && 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); $content = str_replace($link, $newsletter_link->url, $content);
} }
} }

View File

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

View File

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

View File

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