diff --git a/lib/Statistics/Track/Clicks.php b/lib/Statistics/Track/Clicks.php index 33ba9a5033..e4fb51c627 100644 --- a/lib/Statistics/Track/Clicks.php +++ b/lib/Statistics/Track/Clicks.php @@ -1,9 +1,12 @@ url; if(!preg_match('/\d+-\d+-\d+-[a-zA-Z0-9]/', $url)) $this->abort(); list ($newsletter_id, $subscriber_id, $queue_id, $hash) = explode('-', $url); - $subscriber = Subscriber::findOne($subscriber_id); - $link = NewsletterLink::where('hash', $hash) - ->findOne(); - if(!$subscriber) return; - if(!$link) $this->abort(); - $statistics = StatisticsClicks::where('link_id', $link->id) - ->where('subscriber_id', $subscriber_id) - ->where('newsletter_id', $newsletter_id) - ->where('queue_id', $queue_id) + $newsletter = $this->getNewsletter($newsletter_id); + $subscriber = $this->getSubscriber($subscriber_id); + $queue = $this->getQueue($queue_id); + $link = $this->getLink($hash); + if(!$subscriber || !$newsletter || !$link || !$queue) { + $this->abort(); + } + $statistics = StatisticsClicks::where('link_id', $link['id']) + ->where('subscriber_id', $subscriber['id']) + ->where('newsletter_id', $newsletter['id']) + ->where('queue_id', $queue['id']) ->findOne(); if(!$statistics) { // 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->newsletter_id = $newsletter_id; - $statistics->link_id = $link->id; - $statistics->subscriber_id = $subscriber_id; - $statistics->queue_id = $queue_id; + $statistics->newsletter_id = $newsletter['id']; + $statistics->link_id = $link['id']; + $statistics->subscriber_id = $subscriber['id']; + $statistics->queue_id = $queue['id']; $statistics->count = 1; $statistics->save(); } else { $statistics->count++; $statistics->save(); } - $is_this_subscription = (preg_match('/\[link:(?P.*?)\]/', $link->url, $action)); - $url = ($is_this_subscription) ? - $this->getSubscriptionUrl($link->url, $subscriber, $queue_id, $newsletter_id) : - $link->url; + $url = $this->processUrl($link['url'], $newsletter, $subscriber, $queue); header('Location: ' . $url, true, 302); exit; } - function getSubscriptionUrl( - $subscription_action, $subscriber, $queue_id, $newsletter_id - ) { - if(!isset($subscription_action['action'])) self::abort(); - switch($subscription_action['action']) { - case 'unsubscribe': - // track unsubscribe event - $this->trackUnsubscribe($subscriber->id, $queue_id, $newsletter_id); - $url = SubscriptionUrl::getUnsubscribeUrl($subscriber); - break; - case 'manage': - $url = SubscriptionUrl::getManageUrl($subscriber); - break; + function getNewsletter($newsletter_id) { + $newsletter = Newsletter::findOne($newsletter_id); + return ($newsletter) ? $newsletter->asArray() : $newsletter; + } + + function getSubscriber($subscriber_id) { + $subscriber = Subscriber::findOne($subscriber_id); + return ($subscriber) ? $subscriber->asArray() : $subscriber; + } + + function getQueue($queue_id) { + $queue = SendingQueue::findOne($queue_id); + 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.*?)\]/', $url, $shortcode)) { + if(!$shortcode['action']) $this->abort(); + $url = Link::processShortcodeAction( + $shortcode['action'], + $newsletter, + $subscriber, + $queue + ); + if (!$url) $this->abort(); } 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() { header('HTTP/1.0 404 Not Found'); exit;