- Refactors link tracking class

This commit is contained in:
Vlad
2016-04-30 22:14:50 -04:00
parent 0abe8b5371
commit 2d6971f8df

View File

@ -1,9 +1,12 @@
<?php <?php
namespace MailPoet\Statistics\Track; namespace MailPoet\Statistics\Track;
use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterLink; use MailPoet\Models\NewsletterLink;
use MailPoet\Models\SendingQueue;
use MailPoet\Models\StatisticsClicks; use MailPoet\Models\StatisticsClicks;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Shortcodes\Categories\Link;
use MailPoet\Subscription\Url as SubscriptionUrl; use MailPoet\Subscription\Url as SubscriptionUrl;
if(!defined('ABSPATH')) exit; if(!defined('ABSPATH')) exit;
@ -19,65 +22,73 @@ class Clicks {
$url = ($url) ? $url : $this->url; $url = ($url) ? $url : $this->url;
if(!preg_match('/\d+-\d+-\d+-[a-zA-Z0-9]/', $url)) $this->abort(); if(!preg_match('/\d+-\d+-\d+-[a-zA-Z0-9]/', $url)) $this->abort();
list ($newsletter_id, $subscriber_id, $queue_id, $hash) = explode('-', $url); list ($newsletter_id, $subscriber_id, $queue_id, $hash) = explode('-', $url);
$subscriber = Subscriber::findOne($subscriber_id); $newsletter = $this->getNewsletter($newsletter_id);
$link = NewsletterLink::where('hash', $hash) $subscriber = $this->getSubscriber($subscriber_id);
->findOne(); $queue = $this->getQueue($queue_id);
if(!$subscriber) return; $link = $this->getLink($hash);
if(!$link) $this->abort(); if(!$subscriber || !$newsletter || !$link || !$queue) {
$statistics = StatisticsClicks::where('link_id', $link->id) $this->abort();
->where('subscriber_id', $subscriber_id) }
->where('newsletter_id', $newsletter_id) $statistics = StatisticsClicks::where('link_id', $link['id'])
->where('queue_id', $queue_id) ->where('subscriber_id', $subscriber['id'])
->where('newsletter_id', $newsletter['id'])
->where('queue_id', $queue['id'])
->findOne(); ->findOne();
if(!$statistics) { if(!$statistics) {
// track open event in case it did not register // track open event in case it did not register
$this->trackOpen($url); $open = new Opens($url, $display_image = false);
$open->track();
$statistics = StatisticsClicks::create(); $statistics = StatisticsClicks::create();
$statistics->newsletter_id = $newsletter_id; $statistics->newsletter_id = $newsletter['id'];
$statistics->link_id = $link->id; $statistics->link_id = $link['id'];
$statistics->subscriber_id = $subscriber_id; $statistics->subscriber_id = $subscriber['id'];
$statistics->queue_id = $queue_id; $statistics->queue_id = $queue['id'];
$statistics->count = 1; $statistics->count = 1;
$statistics->save(); $statistics->save();
} else { } else {
$statistics->count++; $statistics->count++;
$statistics->save(); $statistics->save();
} }
$is_this_subscription = (preg_match('/\[link:(?P<action>.*?)\]/', $link->url, $action)); $url = $this->processUrl($link['url'], $newsletter, $subscriber, $queue);
$url = ($is_this_subscription) ?
$this->getSubscriptionUrl($link->url, $subscriber, $queue_id, $newsletter_id) :
$link->url;
header('Location: ' . $url, true, 302); header('Location: ' . $url, true, 302);
exit; exit;
} }
function getSubscriptionUrl( function getNewsletter($newsletter_id) {
$subscription_action, $subscriber, $queue_id, $newsletter_id $newsletter = Newsletter::findOne($newsletter_id);
) { return ($newsletter) ? $newsletter->asArray() : $newsletter;
if(!isset($subscription_action['action'])) self::abort(); }
switch($subscription_action['action']) {
case 'unsubscribe': function getSubscriber($subscriber_id) {
// track unsubscribe event $subscriber = Subscriber::findOne($subscriber_id);
$this->trackUnsubscribe($subscriber->id, $queue_id, $newsletter_id); return ($subscriber) ? $subscriber->asArray() : $subscriber;
$url = SubscriptionUrl::getUnsubscribeUrl($subscriber); }
break;
case 'manage': function getQueue($queue_id) {
$url = SubscriptionUrl::getManageUrl($subscriber); $queue = SendingQueue::findOne($queue_id);
break; return ($queue) ? $queue->asArray() : $queue;
}
function getLink($hash) {
$link = NewsletterLink::where('hash', $hash)
->findOne();
return ($link) ? $link->asArray() : $link;
}
function processUrl($url, $newsletter, $subscriber, $queue) {
if(preg_match('/\[link:(?P<action>.*?)\]/', $url, $shortcode)) {
if(!$shortcode['action']) $this->abort();
$url = Link::processShortcodeAction(
$shortcode['action'],
$newsletter,
$subscriber,
$queue
);
if (!$url) $this->abort();
} }
return $url; return $url;
} }
function trackUnsubscribe($subscriber, $queue, $newsletter) {
$unsubscribe = new Unsubscribes();
$unsubscribe->track($subscriber, $queue, $newsletter);
}
function trackOpen($url) {
$open = new Opens($url, $display_image = false);
$open->track();
}
private function abort() { private function abort() {
header('HTTP/1.0 404 Not Found'); header('HTTP/1.0 404 Not Found');
exit; exit;