blob: 83b60dabb615b09e8bb0d0771cd085e6f4280e28 [file] [log] [blame]
<?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();
}
}