- Implements view in browser
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
namespace MailPoet\Config;
|
namespace MailPoet\Config;
|
||||||
|
|
||||||
use MailPoet\Cron\Daemon;
|
use MailPoet\Cron\Daemon;
|
||||||
|
use MailPoet\Newsletter\Viewer\ViewInBrowser;
|
||||||
use MailPoet\Statistics\Track\Opens;
|
use MailPoet\Statistics\Track\Opens;
|
||||||
use MailPoet\Subscription;
|
use MailPoet\Subscription;
|
||||||
use MailPoet\Statistics\Track\Clicks;
|
use MailPoet\Statistics\Track\Clicks;
|
||||||
@@ -64,6 +65,14 @@ class PublicAPI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function viewInBrowser() {
|
||||||
|
try {
|
||||||
|
$viewer = new ViewInBrowser($this->_decodeData());
|
||||||
|
$viewer->view();
|
||||||
|
} catch(\Exception $e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private function _checkAndCallMethod($class, $method, $terminate_request = false) {
|
private function _checkAndCallMethod($class, $method, $terminate_request = false) {
|
||||||
if(!method_exists($class, $method)) {
|
if(!method_exists($class, $method)) {
|
||||||
if(!$terminate_request) return;
|
if(!$terminate_request) return;
|
||||||
|
@@ -1,61 +1,76 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace MailPoet\Newsletter\Links;
|
namespace MailPoet\Newsletter\Viewer;
|
||||||
|
|
||||||
|
use MailPoet\Models\Newsletter;
|
||||||
|
use MailPoet\Models\SendingQueue;
|
||||||
|
use MailPoet\Models\Setting;
|
||||||
|
use MailPoet\Models\Subscriber;
|
||||||
|
use MailPoet\Newsletter\Links\Links;
|
||||||
|
use MailPoet\Newsletter\Renderer\Renderer;
|
||||||
use MailPoet\Newsletter\Shortcodes\Shortcodes;
|
use MailPoet\Newsletter\Shortcodes\Shortcodes;
|
||||||
use MailPoet\Util\Security;
|
|
||||||
|
|
||||||
class Links {
|
class ViewInBrowser {
|
||||||
static function extract($text, $process_link_shortcodes = false) {
|
public $data;
|
||||||
// adopted from WP's wp_extract_urls() function & modified to work on hrefs
|
|
||||||
# match href=' or href="
|
function __construct($data) {
|
||||||
$regex = '#(?:href.*?=.*?)(["\']?)('
|
$this->data = $data;
|
||||||
# match http://
|
|
||||||
. '(?:([\w-]+:)?//?)'
|
|
||||||
# match everything except for special characters # until .
|
|
||||||
. '[^\s()<>]+'
|
|
||||||
. '[.]'
|
|
||||||
# conditionally match everything except for special characters after .
|
|
||||||
. '(?:'
|
|
||||||
. '\([\w\d]+\)|'
|
|
||||||
. '(?:'
|
|
||||||
. '[^`!()\[\]{}:\'".,<>«»“”‘’\s]|'
|
|
||||||
. '(?:[:]\d+)?/?'
|
|
||||||
. ')+'
|
|
||||||
. ')'
|
|
||||||
. ')\\1#';
|
|
||||||
$shortcodes = new Shortcodes();
|
|
||||||
// extract shortcodes with [url:*] format
|
|
||||||
$shortcodes = $shortcodes->extract($text, $limit = array('link'));
|
|
||||||
// extract links
|
|
||||||
preg_match_all($regex, $text, $links);
|
|
||||||
return array_merge(
|
|
||||||
array_unique($links[2]),
|
|
||||||
$shortcodes
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static function replace($text, $links = false, $process_link_shortcodes = false) {
|
function view($data = false) {
|
||||||
if ($process_link_shortcodes) {
|
$data = ($data) ? $data : $this->data;
|
||||||
// process shortcodes with [url:*] format
|
$newsletter = ($data['newsletter'] !== false) ?
|
||||||
$shortcodes = new Shortcodes();
|
Newsletter::findOne($data['newsletter']) :
|
||||||
$text = $shortcodes->replace($text, $limit = array('link'));
|
false;
|
||||||
|
if(!$newsletter) $this->abort();
|
||||||
|
$subscriber = ($data['subscriber'] !== false) ?
|
||||||
|
$this->verifySubscriber($data['subscriber'], $data['subscriber_token']) :
|
||||||
|
false;
|
||||||
|
$queue = ($data['queue'] !== false) ?
|
||||||
|
SendingQueue::findOne($data['queue']) :
|
||||||
|
false;
|
||||||
|
$rendered_newsletter =
|
||||||
|
$this->getAndRenderNewsletter($newsletter, $subscriber, $queue);
|
||||||
|
header('Content-Type: text/html; charset=utf-8');
|
||||||
|
echo $rendered_newsletter;
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
function verifySubscriber($subscriber_id, $subscriber_token) {
|
||||||
|
$subscriber = Subscriber::findOne($subscriber_id);
|
||||||
|
if(!$subscriber ||
|
||||||
|
Subscriber::generateToken($subscriber->email) !== $subscriber_token
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
$links = ($links) ? $links : self::extract($text, $process_link_shortcodes);
|
return $subscriber;
|
||||||
$processed_links = array();
|
}
|
||||||
foreach($links as $link) {
|
|
||||||
$hash = Security::generateRandomString(5);
|
function getAndRenderNewsletter($newsletter, $subscriber, $queue) {
|
||||||
$processed_links[] = array(
|
if($queue) {
|
||||||
'hash' => $hash,
|
$newsletter_body = json_decode($queue->newsletter_rendered_body, true);
|
||||||
'url' => $link
|
} else {
|
||||||
);
|
$renderer = new Renderer($newsletter->asArray());
|
||||||
$encoded_link = sprintf(
|
$newsletter_body = $renderer->render();
|
||||||
'%s/?mailpoet&endpoint=track&action=click&data=%s',
|
|
||||||
home_url(),
|
|
||||||
'[mailpoet_data]-' . $hash
|
|
||||||
);
|
|
||||||
$link_regex = '/' . preg_quote($link, '/') . '/';
|
|
||||||
$text = preg_replace($link_regex, $encoded_link, $text);
|
|
||||||
}
|
}
|
||||||
return array($text, $processed_links);
|
$shortcodes = new Shortcodes(
|
||||||
|
$newsletter,
|
||||||
|
$subscriber,
|
||||||
|
$queue
|
||||||
|
);
|
||||||
|
$rendered_newsletter = $shortcodes->replace($newsletter_body['html']);
|
||||||
|
if($queue && (boolean) Setting::getValue('tracking.enabled')) {
|
||||||
|
$rendered_newsletter = Links::replaceSubscriberData(
|
||||||
|
$newsletter->id,
|
||||||
|
$subscriber->id,
|
||||||
|
$queue->id,
|
||||||
|
$rendered_newsletter
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $rendered_newsletter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function abort() {
|
||||||
|
header('HTTP/1.0 404 Not Found');
|
||||||
|
exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user