- Isolates shortcodes regex into a class method

- Adds a new method to create a URL data object as a numeric array instead
  of associative, thus reducing the size of the object
- Adds a new method to convert numeric URL data object array into associative
  array
- Preserves backward compatibility with previous MP3 Beta versions
  by checking if the URL data object is already an associative array
This commit is contained in:
Vlad
2016-12-11 11:55:50 -05:00
parent 98c6c29716
commit 062f849fc8
2 changed files with 62 additions and 15 deletions

View File

@ -6,6 +6,7 @@ use MailPoet\Router\Router;
use MailPoet\Router\Endpoints\Track as TrackEndpoint;
use MailPoet\Models\NewsletterLink;
use MailPoet\Newsletter\Shortcodes\Shortcodes;
use MailPoet\Util\Helpers;
use MailPoet\Util\Security;
class Links {
@ -101,24 +102,19 @@ class Links {
$preview = false
) {
// match data tags
$regex = sprintf(
'/((%s|%s)(?:-\w+)?)/',
preg_quote(self::DATA_TAG_CLICK),
preg_quote(self::DATA_TAG_OPEN)
);
$subscriber = Subscriber::findOne($subscriber_id);
preg_match_all($regex, $content, $matches);
preg_match_all(self::getLinkRegex(), $content, $matches);
foreach($matches[1] as $index => $match) {
$hash = null;
if(preg_match('/-/', $match)) {
list(, $hash) = explode('-', $match);
}
$data = array(
'subscriber_id' => $subscriber->id,
'subscriber_token' => Subscriber::generateToken($subscriber->email),
'queue_id' => $queue_id,
'link_hash' => $hash,
'preview' => $preview
$data = self::createUrlDataObject(
$subscriber->id,
$subscriber->email,
$queue_id,
$hash,
$preview
);
$router_action = ($matches[2][$index] === self::DATA_TAG_CLICK) ?
TrackEndpoint::ACTION_CLICK :
@ -144,4 +140,54 @@ class Links {
$newsletter_link->save();
}
}
static function convertHashedLinksToShortcodesAndUrls($content, $convert_all = false) {
preg_match_all(self::getLinkRegex(), $content, $links);
$links = array_unique(Helpers::flattenArray($links));
foreach($links as $link) {
$link_hash = explode('-', $link);
if(!isset($link_hash[1])) continue;
$newsletter_link = NewsletterLink::getByHash($link_hash[1]);
// 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)
){
$content = str_replace($link, $newsletter_link->url, $content);
}
}
return $content;
}
static function getLinkRegex() {
return sprintf(
'/((%s|%s)(?:-\w+)?)/',
preg_quote(self::DATA_TAG_CLICK),
preg_quote(self::DATA_TAG_OPEN)
);
}
static function createUrlDataObject(
$subscriber_id, $subscriber_email, $queue_id, $link_hash, $preview
) {
return array(
$subscriber_id,
Subscriber::generateToken($subscriber_email),
$queue_id,
$link_hash,
$preview
);
}
static function transformUrlDataObject($data) {
reset($data);
if(!is_int(key($data))) return $data;
$transformed_data = array();
$transformed_data['subscriber_id'] = (!empty($data[0])) ? $data[0] : false;
$transformed_data['subscriber_token'] = (!empty($data[1])) ? $data[1] : false;
$transformed_data['queue_id'] = (!empty($data[2])) ? $data[2] : false;
$transformed_data['link_hash'] = (!empty($data[3])) ? $data[3] : false;
$transformed_data['preview'] = (!empty($data[4])) ? $data[4] : false;
return $transformed_data;
}
}

View File

@ -5,6 +5,7 @@ use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterLink;
use MailPoet\Models\SendingQueue;
use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Links\Links;
use MailPoet\Statistics\Track\Clicks;
use MailPoet\Statistics\Track\Opens;
@ -35,10 +36,10 @@ class Track {
}
function _processTrackData($data) {
$data = (object)$data;
$data = (object)Links::transformUrlDataObject($data);
if(empty($data->queue_id) ||
empty($data->subscriber_id) ||
empty($data->subscriber_token)
empty($data->subscriber_id) ||
empty($data->subscriber_token)
) {
return false;
}