| <?php | |
| /******************************************************************************* | |
| * Copyright(c) 2015 Eclipse Foundation and others. | |
| * All rights reserved. This program and the accompanying materials | |
| * are made available under the terms of the Eclipse Public License v1.0 | |
| * which accompanies this distribution, and is available at | |
| * http://www.eclipse.org/legal/epl-v10.html | |
| * | |
| * Contributors: | |
| * Eric Poirier(Eclipse Foundation) | |
| *******************************************************************************/ | |
| require_once("campaign.class.php"); | |
| class CampaignManager extends Campaign{ | |
| /** | |
| * Message of success or error | |
| * @var array | |
| * */ | |
| private $status_message = array(); | |
| /** | |
| * Number of clicks for the current campaign | |
| * @var string | |
| */ | |
| private $current_clicks = ""; | |
| /** | |
| * Count the number of clicks for campaigns | |
| * @var string | |
| */ | |
| private $count_clicks = ""; | |
| /** | |
| * This is the header of the HTML page | |
| * Which includes the list of campaigns and the number of clicks | |
| * @var string | |
| */ | |
| private $page_header_html = ''; | |
| public function __construct() { | |
| parent::__construct(); | |
| $Session = $this->App->useSession(true); | |
| // Verify what state is in right now | |
| switch($this->state) { | |
| // If a new Campaign is being created | |
| case 'create': | |
| $this->createNewCampaign(); | |
| break; | |
| // If a Campaign is being deleted | |
| case 'delete': | |
| $this->deleteCampaign(); | |
| break; | |
| // If a Campaign is being changed | |
| case 'change': | |
| $this->changeCampaign(); | |
| break; | |
| } | |
| // Verify what page the user is viewing | |
| switch($this->page) { | |
| case 'view-campaigns': | |
| $this->viewCampaigns(); | |
| $this->outputView('campaigns'); | |
| break; | |
| case 'view-clicks': | |
| $this->viewCampaignClicks(); | |
| $this->outputView('clicks'); | |
| break; | |
| } | |
| } | |
| /** | |
| * SETTERS | |
| */ | |
| /** | |
| * Set the success or error message | |
| * @param string | |
| * */ | |
| public function setStatusMessage($_message = '', $_type = 'success') { | |
| $alert_type = array('success', 'warning', 'danger', 'info'); | |
| if(!in_array($_type, $alert_type)) { | |
| $_type = 'warning'; | |
| } | |
| $this->status_message[$_type][] = $_message; | |
| } | |
| /** | |
| * Set the number of clicks for the current campaign | |
| * @param SQL query | |
| */ | |
| private function setCurrentClicks($_val) { | |
| $this->current_clicks = $_val; | |
| } | |
| /** | |
| * Set Count Clicks of a campaign | |
| * @param SQL query | |
| */ | |
| private function setCountCampaignClicks($_val) { | |
| $this->count_clicks = $_val; | |
| } | |
| /** | |
| * GETTERS | |
| */ | |
| /** | |
| * Get the Success or Error Mesage | |
| * @return string | |
| * */ | |
| public function getStatusMessage() { | |
| $html = ""; | |
| foreach($this->status_message as $type => $msgs) { | |
| foreach($msgs as $m) { | |
| $html .= '<div class="alert alert-' . $type . '" role="alert">' . $m . '</div>'; | |
| } | |
| } | |
| return $html; | |
| } | |
| /** | |
| * Get the number of clicks of the current campaign | |
| * @return string | |
| */ | |
| public function getCurrentClicks() { | |
| $clicks = array(); | |
| if($this->getCountCampaignClicks() != 0){ | |
| while ($myrow = mysql_fetch_array($this->current_clicks)){ | |
| $clicks[] = $myrow; | |
| } | |
| } | |
| return $clicks; | |
| } | |
| /** | |
| * Get the Number of Clicks of a campaign | |
| * @return string | |
| */ | |
| public function getCountCampaignClicks() { | |
| return $this->count_clicks; | |
| } | |
| /** | |
| * Content of the page on first load | |
| * And set the Page Title | |
| * @return string | |
| */ | |
| public function outputPage($pageTitle = 'Eclipse Campaign Manager') { | |
| $html = ""; | |
| // Print the output if the user is a commiter | |
| if($this->state != 'not-staff') { | |
| ob_start(); | |
| print '<h1>' . $pageTitle . '</h1>'; | |
| print $this->getStatusMessage(); | |
| include("tpl/campaignManager.tpl.php"); | |
| $html = ob_get_clean(); | |
| } | |
| return $html; | |
| } | |
| /** | |
| * Counts the number of clicks | |
| */ | |
| public function countCampaignClicks($_campaign_name) { | |
| $App = new App(); | |
| // Get sanitized values | |
| $campaign_name = $App->returnQuotedString($App->sqlSanitize($_campaign_name)); | |
| //Select total amount of clicks for each campaigns | |
| $sql = "SELECT COUNT(*) AS count FROM CampaignClicks WHERE CampaignKey=" . $campaign_name; | |
| $result = $App->eclipse_sql($sql); | |
| $count = array(); | |
| while($row = mysql_fetch_array($result)) { | |
| $this->setCountCampaignClicks($row['count']); | |
| $count = $row['count']; | |
| } | |
| return $count; | |
| } | |
| /** | |
| * Find out what the amount of last month's clicks | |
| */ | |
| public function pastMonthClicks($_campaign_name) { | |
| $App = new App(); | |
| // Get sanitized values | |
| $campaign_name = $App->returnQuotedString($App->sqlSanitize($_campaign_name)); | |
| // Select dates and counts for each month for the past 6 month | |
| $sql = 'SELECT | |
| count(TimeClicked) as count, | |
| DATE_FORMAT(TimeClicked, "%Y-%m") as date | |
| FROM | |
| CampaignClicks | |
| WHERE CampaignKey = '.$campaign_name.' | |
| GROUP BY | |
| MONTH(TimeClicked) | |
| ORDER BY TimeClicked DESC | |
| LIMIT 6'; | |
| $result = $App->eclipse_sql($sql); | |
| $results = array(); | |
| while($row = mysql_fetch_array($result)) { | |
| $results[$row['date']] = $row['count']; | |
| } | |
| $clicks = array(); | |
| $thisMonth = strtotime('now'); | |
| while ($thisMonth >= strtotime("-5 month")) { | |
| $date = date('Y-m',$thisMonth); | |
| $clicks[] = array( | |
| 'date' => $date, | |
| 'count' => (!empty($results[$date])) ? $results[$date] : 0, | |
| ); | |
| $thisMonth = strtotime(" -1 month", $thisMonth); | |
| } | |
| return $clicks; | |
| } | |
| /** | |
| * Create a new campaign | |
| */ | |
| public function createNewCampaign() { | |
| $App = new App(); | |
| // Get sanitized values | |
| $campaign_name = $App->returnQuotedString($App->sqlSanitize($this->getCampaignName())); | |
| $campaign_target = $App->returnQuotedString($App->sqlSanitize($this->getCampaignTarget())); | |
| $campaign_end_date = $App->returnQuotedString($App->sqlSanitize($this->getCampaignEndDate())); | |
| $campaign_portal_ID = $App->returnQuotedString($App->sqlSanitize($this->Friend->getEmail())); | |
| $campaign_group = $App->returnQuotedString($App->sqlSanitize($this->getCampaignGroup())); | |
| // Define default message | |
| $message = "ERROR, Campaign could not be created."; | |
| $message_type = "danger"; | |
| // Form validation | |
| $error_type = ""; | |
| // Check to see it the campaign name is valid | |
| if(empty($campaign_name)) { | |
| $error_type = "Campaign Name"; | |
| } | |
| // Check to see if the URL is valid. | |
| if(strpos($campaign_target,"://") === FALSE || | |
| strpos($campaign_target,".") === FALSE || | |
| empty($campaign_target)) { | |
| $error_type = "URL"; | |
| // Empty the url field | |
| $campaign_target = ""; | |
| } | |
| // Check to see if the end date is valid | |
| if(empty($campaign_end_date) || | |
| strpos($campaign_end_date,"-") === FALSE) { | |
| $error_type = "Date"; | |
| $campaign_end_date = ""; | |
| } | |
| // There is something wrong with a field | |
| $message = "ERROR, you need to enter a valid " . $error_type; | |
| // Check if the fields are not empty (Group field can be empty) | |
| if(!empty($campaign_name) && | |
| !empty($campaign_target) && | |
| !empty($campaign_end_date) && | |
| !empty($campaign_portal_ID)) { | |
| // Check for Duplicate Campaign Names | |
| $duplicates; | |
| $verifyDuplicates = "SELECT COUNT(*) FROM Campaigns WHERE CampaignKey = '" . $campaign_name . "'"; | |
| $resultVerifyDuplicates = $App->eclipse_sql($verifyDuplicates); | |
| // Define message if there's a duplicate | |
| $message = "ERROR, there's already a campaign with the same name."; | |
| while($row = mysql_fetch_array($resultVerifyDuplicates)) { | |
| $duplicates = $row[0]; | |
| } | |
| // If it does not create a duplicate, create a new entry | |
| if ($duplicates == 0) { | |
| $sql = "INSERT INTO Campaigns | |
| (CampaignKey, | |
| TargetUrl, | |
| DateCreated, | |
| DateExpires, | |
| CreatorPortalID, | |
| CampaignGroup) | |
| values(" . $campaign_name . ", | |
| ". $campaign_target . ", | |
| " . "NOW(), | |
| " . $campaign_end_date . ", | |
| ". $campaign_portal_ID . ", | |
| " . $campaign_group . ")"; | |
| $result = $App->eclipse_sql($sql); | |
| // Define success message | |
| $message = 'SUCCESS, Campaign has been Created!'; | |
| $message_type = 'success'; | |
| } | |
| } | |
| // SET MESSAGE | |
| $this->setStatusMessage($message, $message_type); | |
| } | |
| /** | |
| * Delete a campaign | |
| */ | |
| public function deleteCampaign() { | |
| $App = new App(); | |
| // Get sanitized values | |
| $campaign_delete = $App->returnQuotedString($App->sqlSanitize($this->getCampaignDelete())); | |
| $campaign_confirm_delete = $App->returnQuotedString($App->sqlSanitize($this->getCampaignConfirmDelete())); | |
| // Define default message | |
| $message = 'ERROR, Please click the confirm check box to delete.'; | |
| $message_type = 'danger'; | |
| if($campaign_confirm_delete) { | |
| // Define message when you don't know the CampaignKey | |
| $message = 'ERROR, Campaign could not be found.'; | |
| if(!empty($campaign_delete)) { | |
| $sql = "DELETE FROM Campaigns WHERE CampaignKey=" . $campaign_delete; | |
| $result = $App->eclipse_sql($sql); | |
| // Define success message | |
| $message = 'SUCCESS, Campaign has been deleted.'; | |
| $message_type = 'success'; | |
| } | |
| } | |
| // SET MESSAGE | |
| $this->setStatusMessage($message, $message_type); | |
| } | |
| /** | |
| * Make changes to a Campaign | |
| */ | |
| public function changeCampaign() { | |
| $App = new App(); | |
| // Get sanitized values | |
| $campaign_new_url = $App->returnQuotedString($App->sqlSanitize($this->getCampaignNewUrl())); | |
| $campaign_new_date = $App->returnQuotedString($App->sqlSanitize($this->getCampaignNewDate())); | |
| $campaign_new_group = $App->returnQuotedString($App->sqlSanitize($this->getCampaignNewGroup())); | |
| $campaign_new_clicks = $App->returnQuotedString($App->sqlSanitize($this->getCampaignNewClicks())); | |
| // Define default message | |
| $message = 'ERROR, Campaign could not be changed.'; | |
| $message_type = 'danger'; | |
| if(!empty($campaign_new_url) && !empty($campaign_new_date) && | |
| !empty($campaign_new_group) && !empty($campaign_new_clicks)) { | |
| $sql = "UPDATE Campaigns set | |
| TargetUrl = " . $campaign_new_url . ", | |
| DateExpires = " . $campaign_new_date . ", | |
| CampaignGroup = " . $campaign_new_group . " | |
| WHERE | |
| CampaignKey = " . $campaign_new_clicks; | |
| $result = $App->eclipse_sql($sql); | |
| // Define success message | |
| $message = 'SUCCESS, Campaign has been Changed!'; | |
| $message_type = 'success'; | |
| } | |
| // SET MESSAGE | |
| $this->setStatusMessage($message, $message_type); | |
| } | |
| /** | |
| * View Campaigns based on a Person or a Group | |
| */ | |
| public function viewCampaigns() { | |
| $App = new App(); | |
| $campaigns = array(); | |
| // Get sanitized values | |
| $campaign_portal_ID = $App->sqlSanitize($this->getCampaignPortalID()); | |
| $campaign_group = $App->sqlSanitize($this->getCampaignGroup()); | |
| if(!empty($campaign_portal_ID) || !empty($campaign_group)) { | |
| $sql = "SELECT * FROM Campaigns"; | |
| // View Campaigns by user ID | |
| if($campaign_portal_ID != "" && $campaign_portal_ID != "ALL" && | |
| $campaign_group == "") { | |
| $sql .= " WHERE CreatorPortalID = '" . $campaign_portal_ID . "'"; | |
| } | |
| // View Campaigns by Group | |
| else if($campaign_group != "" && $campaign_group != "ALL") { | |
| $sql .= " WHERE CampaignGroup = '" . $campaign_group . "'"; | |
| } | |
| $sql .= " ORDER BY CampaignGroup, CampaignKey"; | |
| $results = $App->eclipse_sql($sql); | |
| while ($result = mysql_fetch_array($results)){ | |
| $campaigns[] = $result; | |
| } | |
| return $campaigns; | |
| } | |
| } | |
| /** | |
| * View the number of clicks from a specific campaign | |
| */ | |
| public function viewCampaignClicks() { | |
| $App = new App(); | |
| // Get sanitized values | |
| $campaign_view_clicks = $App->returnQuotedString($App->sqlSanitize($this->getCampaignViewClicks())); | |
| $campaign_max_clicks = $App->sqlSanitize($this->getCampaignMaxClicks()); | |
| if(!empty($campaign_view_clicks) && !empty($campaign_max_clicks)) { | |
| $sql = "SELECT * FROM CampaignClicks | |
| WHERE CampaignKey=" . $campaign_view_clicks . " | |
| ORDER BY TimeClicked DESC LIMIT " . $campaign_max_clicks; | |
| $this->setCurrentClicks($App->eclipse_sql($sql)); | |
| $this->countCampaignClicks($this->getCampaignViewClicks()); | |
| $message = 'There are <strong>' . $this->getCountCampaignClicks() . '</strong> clicks for the <strong>'. $this->getCampaignViewClicks() . '</strong> campaign.'; | |
| $message_type = 'info'; | |
| $this->setStatusMessage($message, $message_type); | |
| } | |
| } | |
| /** | |
| * Select the Campaign that we want to change the URL | |
| */ | |
| public function selectCampaignFromCampaignKey() { | |
| $App = new App(); | |
| $campaign_view_clicks = $App->returnQuotedString($App->sqlSanitize($this->getCampaignViewClicks())); | |
| $campaign = array(); | |
| if(!empty($campaign_view_clicks)) { | |
| $sql = "SELECT DISTINCT * FROM Campaigns WHERE CampaignKey=" . $campaign_view_clicks; | |
| $result = $App->eclipse_sql($sql); | |
| } | |
| while ($myrow = mysql_fetch_array($result)) { | |
| $campaign['TargetUrl'] = $myrow['TargetUrl']; | |
| $campaign['DateExpires'] = $myrow['DateExpires']; | |
| $campaign['CampaignGroup'] = $myrow['CampaignGroup']; | |
| $campaign['NewExpiryDate'] = date('Y-m-d',strtotime('+3 years')); | |
| } | |
| return $campaign; | |
| } | |
| /** | |
| * Select Query by Person or by group | |
| * */ | |
| private function selectUserOrGroup($_user_or_group) { | |
| $App = new App(); | |
| // Define accepted values | |
| $acceptedValues = array('CreatorPortalID','CampaignGroup'); | |
| // Get sanitized values | |
| $user_or_group = $App->sqlSanitize($_user_or_group); | |
| if(in_array($user_or_group, $acceptedValues)) { | |
| $sql = "SELECT DISTINCT " . $user_or_group . " FROM Campaigns ORDER BY " . $user_or_group; | |
| return $App->eclipse_sql($sql); | |
| }else{ | |
| return NULL; | |
| } | |
| } | |
| /** | |
| * Select Campaigns based on a Person | |
| */ | |
| public function selectCampaignByUser() { | |
| $users = array(); | |
| $results = $this->selectUserOrGroup("CreatorPortalID"); | |
| while ($result = mysql_fetch_array($results)){ | |
| $users[] = $result; | |
| } | |
| return $users; | |
| } | |
| /** | |
| * Select Campaigns based on a Group | |
| */ | |
| public function selectCampaignByGroup() { | |
| $groups = array(); | |
| $results = $this->selectUserOrGroup("CampaignGroup"); | |
| while ($result = mysql_fetch_array($results)){ | |
| $groups[] = $result; | |
| } | |
| return $groups; | |
| } | |
| /** | |
| * Determine if the view is generated based on a person's id or a group | |
| * */ | |
| public function getCampaignByUserOrGroup($_for_url = FALSE) { | |
| $userOrGroup = ""; | |
| $campaignPortalID = ""; | |
| $campaignGroup = ""; | |
| if($_for_url == TRUE) { | |
| $campaignPortalID = "campaignPortalID="; | |
| $campaignGroup = "campaignGroup="; | |
| } | |
| if($this->getCampaignPortalID() || $this->getCampaignGroup()) { | |
| if($this->getCampaignPortalID()) { | |
| $userOrGroup = $campaignPortalID . $this->getCampaignPortalID(); | |
| } | |
| if($this->getCampaignGroup()) { | |
| $userOrGroup = $campaignGroup . $this->getCampaignGroup(); | |
| } | |
| return $userOrGroup; | |
| } | |
| return FALSE; | |
| } | |
| /** | |
| * Shorten a string as you which | |
| * */ | |
| public function shortenedString($_string, $_start, $_end) { | |
| $output = substr($_string, $_start, $_end); | |
| if (strlen($_string) > 80) { | |
| $output .= '...'; | |
| } | |
| return $output; | |
| } | |
| /** | |
| * Ouput the campaigns or the number of clicks for one campaign | |
| * */ | |
| private function outputView($_val) { | |
| ob_start(); | |
| include("tpl/campaign_view_". $_val .".tpl.php"); | |
| return $this->page_header_html = ob_get_clean(); | |
| } | |
| } |