예제 #1
0
 public function track()
 {
     // Required data
     $subkey = JRequest::getString('uid', '');
     $newsletterId = JRequest::getInt('nid', 0);
     $action = JRequest::getString('action', '');
     $link = base64_decode(urldecode(JRequest::getVar('link', '')));
     // Optional data
     $listId = JRequest::getInt('lid', 0);
     $listId = !empty($listId) ? $listId : null;
     try {
         // Check the uid
         $subscriber = SubscriberHelper::getBySubkey($subkey);
         if (empty($subscriber->subscriber_id)) {
             throw new Exception('User is absent');
         }
         // Determine the action
         $table = JTable::getInstance('history', 'NewsletterTable');
         $actionCode = $table->getActionCode($action);
         if ($actionCode === false) {
             throw new Exception('Unknown action');
         }
         // If this is a "clicked" event we should save the link
         $text = $actionCode == NewsletterTableHistory::ACTION_CLICKED ? $link : "";
         // Track the event
         // If type of action is ACTION_OPENED then check it
         // should be only one in the DB for sid-nid
         if ($actionCode == NewsletterTableHistory::ACTION_OPENED) {
             $res = $table->load(array('subscriber_id' => (int) $subscriber->subscriber_id, 'newsletter_id' => (int) $newsletterId, 'action' => $actionCode));
             if (!empty($table->history_id)) {
                 throw new Exception('no need to track');
             }
         }
         $res = $table->save(array('subscriber_id' => (int) $subscriber->subscriber_id, 'list_id' => $listId, 'newsletter_id' => (int) $newsletterId, 'date' => date('Y-m-d H:i:s'), 'action' => $actionCode, 'text' => addslashes($link)));
         if (!$res) {
             $err = $table->getError();
             $err = $err instanceof Exception ? $err->getMessage() : $err;
             throw new Exception('Error saving data: ' . $err);
         }
     } catch (Exception $e) {
         if ($e->getMessage() != 'no need to track') {
             // For debug
             LogHelper::addDebug('Tracking failed', LogHelper::CAT_TRACKING, array('Message' => $e->getMessage(), 'Data' => JRequest::get()));
             jexit();
         } else {
             // For debug
             LogHelper::addDebug('Tracking', LogHelper::CAT_TRACKING, array('Message' => 'No need to track', 'data' => JRequest::get()));
         }
     }
     LogHelper::addDebug('Tracking', LogHelper::CAT_TRACKING, JRequest::get());
     // Redirect it!
     if (!empty($link)) {
         $this->setRedirect($link);
     }
 }