Blame | Last modification | View Log | RSS feed
<?php
/***************************************************************************
* Copyright (C) 2009-2011 by Geo Varghese(www.seopanel.in) *
* sendtogeo@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
// include google api module
include_once(SP_CTRLPATH . "/googleapi.ctrl.php");
// class defines all google analytics api controller functions
class AnalyticsController extends GoogleAPIController {
var $spTextGA;
var $metrics;
var $metricList;
var $defaultMetricName = "users";
var $dimensionName = "source";
function __construct() {
parent::__construct();
$this->spTextGA = $this->getLanguageTexts('analytics', $_SESSION['lang_code']);
$this->set('spTextGA', $this->spTextGA);
$this->metrics = array(
'users' => $this->spTextGA['Users'],
'newUsers' => $this->spTextGA['New Users'],
'sessions' => $this->spTextGA['Sessions'],
'bounceRate' => $this->spTextGA['Bounce Rate'],
'avgSessionDuration' => $this->spTextGA['Avg. Session Duration'],
'goalCompletionsAll' => $this->spTextGA['Goal Completions'],
);
$this->set('metricColList', $this->metrics);
$this->metricList = array_keys($this->metrics);
}
/*
* function to get analytics query result
*/
function getAnalyticsResults($userId, $VIEW_ID, $startDate, $endDate) {
$result = array('status' => false);
if (empty($VIEW_ID)) {
$result['msg'] = $this->spTextGA['view_id_not_found_error'];
$alertCtler = new AlertController();
$alertInfo = array(
'alert_subject' => $this->spTextGA['view_id_not_found_error'],
'alert_message' => "",
'alert_url' => SP_WEBPATH ."/admin-panel.php",
'alert_type' => "danger",
'alert_category' => "reports",
);
$alertCtler->createAlert($alertInfo, $userId);
return $result;
}
try {
$client = $this->getAuthClient($userId);
// check whether client created successfully
if (!is_object($client)) {
$result['msg'] = $client;
return $result;
}
$analytics = new Google_Service_AnalyticsReporting($client);
// Create the DateRange object.
$dateRange = new Google_Service_AnalyticsReporting_DateRange();
$dateRange->setStartDate($startDate);
$dateRange->setEndDate($endDate);
// Create the Metrics object list
$metricObjList = [];
foreach ($this->metricList as $metricName) {
$sessions = new Google_Service_AnalyticsReporting_Metric();
$sessions->setExpression("ga:$metricName");
$sessions->setAlias($metricName);
$metricObjList[] = $sessions;
}
// Create the dimension.
$dimension = new Google_Service_AnalyticsReporting_Dimension();
$dimension->setName("ga:$this->dimensionName");
// Create the Ordering.
$ordering = new Google_Service_AnalyticsReporting_OrderBy();
$ordering->setFieldName("ga:$this->defaultMetricName");
$ordering->setOrderType("VALUE");
$ordering->setSortOrder("DESCENDING");
// Create the ReportRequest object.
$request = new Google_Service_AnalyticsReporting_ReportRequest();
$request->setViewId($VIEW_ID);
$request->setDateRanges($dateRange);
$request->setMetrics($metricObjList);
$request->setDimensions(array($dimension));
$request->setOrderBys($ordering);
$body = new Google_Service_AnalyticsReporting_GetReportsRequest();
$body->setReportRequests( array( $request) );
$res = $analytics->reports->batchGet( $body );
$resultList = $this->formatResult($res);
$result['status'] = true;
$result['resultList'] = $resultList;
} catch (Exception $e) {
$err = $e->getMessage();
$result['msg'] = "Error: search query analytics - $err";
}
return $result;
}
function formatMetricValue($value, $metricName) {
if ($metricName == "bounceRate") {
$value = round($value, 2);
}
if ($metricName == "avgSessionDuration") {
$value = round(($value/60), 2);
}
return $value;
}
function formatResult($reports) {
$resultList = array();
// loop through the reports
for ( $reportIndex = 0; $reportIndex < count( $reports ); $reportIndex++ ) {
$report = $reports[ $reportIndex ];
// get total value
$totals = $report->getData()->getTotals();
$values = $totals[0]->getValues();
$resultList['total'] = [];
foreach ($this->metricList as $i => $metricName) {
$resultList['total'][$metricName] = $this->formatMetricValue($values[$i], $metricName);
}
// get dimension type value
$rows = $report->getData()->getRows();
for ( $rowIndex = 0; $rowIndex < count($rows); $rowIndex++) {
$row = $rows[$rowIndex];
$dimensions = $row->getDimensions();
$metrics = $row->getMetrics();
$values = $metrics[0]->getValues();
// find metric values
$resultList[$dimensions[0]] = [];
foreach ($this->metricList as $i => $metricName) {
$resultList[$dimensions[0]][$metricName] = $this->formatMetricValue($values[$i], $metricName);
}
}
}
return $resultList;
}
function getAnalyticsSourceList() {
$sourceList = [];
$list = $this->dbHelper->getAllRows("analytic_sources");
foreach ($list as $listInfo) {
$sourceList[$listInfo['source_name']] = $listInfo['id'];
}
return $sourceList;
}
function generateSource($sourceName) {
$sourceId = false;
if ($this->dbHelper->insertRow("analytic_sources", array("source_name" => $sourceName))) {
$sourceId = $this->db->getMaxId("analytic_sources");
}
return $sourceId;
}
/*
* function to store website results
*/
function storeWebsiteAnalytics($websiteId, $reportDate) {
$websiteId = intval($websiteId);
$websiteCtrler = new WebsiteController();
$websiteInfo = $websiteCtrler->__getWebsiteInfo($websiteId);
// query results from api and verify no error occured
$result = $this->getAnalyticsResults($websiteInfo['user_id'], $websiteInfo['analytics_view_id'], $reportDate, $reportDate);
if ($result['status']) {
$sourceList = $this->getAnalyticsSourceList();
// loop through the result list
foreach ($result['resultList'] as $sourceName => $reportInfo) {
// generate source list, if not set it yet
if (!isset($sourceList[$sourceName])) {
$sourceId = $this->generateSource($sourceName);
} else {
$sourceId = $sourceList[$sourceName];
}
if (!empty($sourceId)) {
$this->insertWebsiteAnalytics($websiteId, $sourceId, $reportInfo, $reportDate);
} else {
$result['msg'] .= "Error: Analytics source id not found";
}
}
}
return $result;
}
/*
* function to insert website analytics
*/
function insertWebsiteAnalytics($websiteId, $sourceId, $reportInfo, $resultDate, $clearExisting = true) {
$websiteId = intval($websiteId);
$sourceId = intval($sourceId);
$resultDate = addslashes($resultDate);
if ($clearExisting) {
$whereCond = "website_id=$websiteId and report_date='$resultDate' and source_id='$sourceId'";
$this->dbHelper->deleteRows('website_analytics', $whereCond);
}
$reportInfo['website_id'] = $websiteId;
$reportInfo['source_id'] = $sourceId;
$reportInfo['report_date'] = $resultDate;
$this->dbHelper->insertRow('website_analytics', $reportInfo);
}
// func to show quick checker
function viewQuickChecker($searchInfo='') {
$userId = isLoggedIn();
$websiteController = New WebsiteController();
$websiteList = $websiteController->__getAllWebsites($userId, true);
$this->set('websiteList', $websiteList);
$websiteId = empty ($searchInfo['website_id']) ? $websiteList[0]['id'] : intval($searchInfo['website_id']);
$this->set('websiteId', $websiteId);
$this->set('fromTime', date('Y-m-d', strtotime('-1 days')));
$this->set('toTime', date('Y-m-d'));
$this->render('analytics/quick_checker');
}
// func to do quick report
function doQuickChecker($searchInfo = '') {
if (!empty($searchInfo['website_id'])) {
$websiteId = intval($searchInfo['website_id']);
$websiteController = New WebsiteController();
$websiteInfo = $websiteController->__getWebsiteInfo($websiteId);
$this->set('websiteInfo', $websiteInfo);
if (!empty($websiteInfo['url'])) {
$reportStartDate = !empty($searchInfo['from_time']) ? $searchInfo['from_time'] : date('Y-m-d', strtotime('-1 days'));
$reportEndDate = !empty($searchInfo['to_time']) ? $searchInfo['to_time'] : date('Y-m-d');
// query results from api and verify no error occured
$result = $this->getAnalyticsResults($websiteInfo['user_id'], $websiteInfo['analytics_view_id'], $reportStartDate, $reportEndDate);
// if status is success
if ($result['status']) {
$websiteReport = array_shift($result['resultList']);
$sourceReport = $result['resultList'];
$this->set('websiteReport', $websiteReport);
$this->set('sourceReport', $sourceReport);
$this->set('searchInfo', $searchInfo);
$this->render('analytics/quick_checker_results');
return true;
}
}
}
$errorMsg = !empty($result['msg']) ? $result['msg'] : "Internal error occured while accessing webmaster tools.";
showErrorMsg($errorMsg);
}
// function check whether analytics reports already saved
function isReportsExists($websiteId, $resultDate) {
$websiteId = intval($websiteId);
$resultDate = addslashes($resultDate);
$whereCond = "website_id=$websiteId and report_date='$resultDate'";
$info = $this->dbHelper->getRow("website_analytics", $whereCond, "website_id");
return !empty($info['website_id']) ? true : false;
}
# func to show analytics report summary
function viewAnalyticsSummary($searchInfo = '', $summaryPage = false, $cronUserId=false) {
$userId = !empty($cronUserId) ? $cronUserId : isLoggedIn();
$this->set('summaryPage', $summaryPage);
$this->set('searchInfo', $searchInfo);
$this->set('cronUserId', $cronUserId);
$exportVersion = false;
switch($searchInfo['doc_type']){
case "export":
$exportVersion = true;
$exportContent = "";
break;
case "pdf":
$this->set('pdfVersion', true);
break;
case "print":
$this->set('printVersion', true);
break;
}
$fromTime = !empty($searchInfo['from_time']) ? addslashes($searchInfo['from_time']) : date('Y-m-d', strtotime('-2 days'));
$toTime = !empty($searchInfo['to_time']) ? addslashes($searchInfo['to_time']) : date('Y-m-d', strtotime('-1 days'));
$this->set('fromTime', $fromTime);
$this->set('toTime', $toTime);
$websiteController = New WebsiteController();
$wList = $websiteController->__getAllWebsites($userId, true);
$websiteList = [];
foreach ($wList as $wInfo) {
$websiteList[$wInfo['id']] = $wInfo;
}
$websiteList = count($websiteList) ? $websiteList : array(0);
$this->set('websiteList', $websiteList);
$websiteId = intval($searchInfo['website_id']);
$this->set('websiteId', $websiteId);
// to find order col
if (!empty($searchInfo['order_col'])) {
$orderCol = $searchInfo['order_col'];
$orderVal = getOrderByVal($searchInfo['order_val']);
} else {
$orderCol = "users";
$orderVal = 'DESC';
}
$this->set('orderCol', $orderCol);
$this->set('orderVal', $orderVal);
$scriptName = $summaryPage ? "archive.php" : "analytics.php";
$scriptPath = SP_WEBPATH . "/$scriptName?sec=viewAnalyticsSummary&website_id=$websiteId";
$scriptPath .= "&from_time=$fromTime&to_time=$toTime&search_name=" . $searchInfo['search_name'];
$scriptPath .= "&order_col=$orderCol&order_val=$orderVal&report_type=analytics-reports";
$conditions = !empty($searchInfo['search_name']) ? " and k.source_name like '%".addslashes($searchInfo['search_name'])."%'" : "";
// set website id to get exact keywords of a user
if (!empty($websiteId)) {
$conditions .= " and r.website_id=$websiteId";
} else {
$conditions .= " and r.website_id in (".implode(',', array_keys($websiteList)).")";
}
$analyticsCols = implode(",", array_keys($this->metrics));
$sql = "select k.id,k.source_name,r.website_id,$analyticsCols
from analytic_sources k, website_analytics r
where k.id=r.source_id $conditions and r.report_date='$toTime'
order by " . addslashes($orderCol) . " " . addslashes($orderVal);
if ($orderCol != 'users') $sql .= ", users";
// pagination setup, if not from cron job email send function, pdf and export action
if (!in_array($searchInfo['doc_type'], array("pdf", "export"))) {
$this->db->query($sql, true);
$this->paging->setDivClass('pagingdiv');
$this->paging->loadPaging($this->db->noRows, SP_PAGINGNO);
$pagingDiv = $this->paging->printPages($scriptPath, '', 'scriptDoLoad', 'content', "");
$this->set('pagingDiv', $pagingDiv);
$this->set('pageNo', $searchInfo['pageno']);
$sql .= " limit ".$this->paging->start .",". $this->paging->per_page;
}
# set report list
$baseReportList = $this->db->select($sql);
$this->set('baseReportList', $baseReportList);
$this->set('colList', $this->colList);
// if keywords existing
if (!empty($baseReportList)) {
$sourceIdList = array();
foreach ($baseReportList as $info) {
$sourceIdList[] = $info['id'];
}
$sql = "select k.id,k.source_name,r.website_id, $analyticsCols
from analytic_sources k, website_analytics r where k.id=r.source_id
$conditions and r.report_date='$fromTime'";
$sql .= " and k.id in(" . implode(",", $sourceIdList) . ")";
$reportList = $this->db->select($sql);
$compareReportList = array();
foreach ($reportList as $info) {
$compareReportList[$info['website_id']][$info['id']] = $info;
}
$this->set('compareReportList', $compareReportList);
}
if ($exportVersion) {
$spText = $_SESSION['text'];
$reportHeading = $this->spTextTools['Website Analytics Summary']."($fromTime - $toTime)";
$exportContent .= createExportContent( array('', $reportHeading, ''));
$exportContent .= createExportContent( array());
$headList = array($spText['common']['Website'], $spText['common']['Source']);
$pTxt = str_replace("-", "/", substr($fromTime, -5));
$cTxt = str_replace("-", "/", substr($toTime, -5));
foreach ($this->metrics as $colKey => $colLabel) {
if ($colKey == 'name') continue;
$headList[] = $colLabel . "($pTxt)";
$headList[] = $colLabel . "($cTxt)";
$headList[] = $colLabel . "(+/-)";
}
$exportContent .= createExportContent($headList);
foreach($baseReportList as $listInfo){
$valueList = array($websiteList[$listInfo['website_id']]['url'], $listInfo['source_name']);
foreach ($this->metrics as $colName => $colVal) {
if ($colName == 'name') continue;
$currRank = isset($listInfo[$colName]) ? $listInfo[$colName] : 0;
$prevRank = isset($compareReportList[$listInfo['website_id']][$listInfo['id']][$colName]) ? $compareReportList[$listInfo['website_id']][$listInfo['id']][$colName] : 0;
$rankDiff = "";
// if both ranks are existing
if ($prevRank != '' && $currRank != '') {
$rankDiff = $currRank - $prevRank;
if ($colName == 'bounceRate') $rankDiff = $rankDiff * -1;
}
$valueList[] = $prevRank;
$valueList[] = $currRank;
$valueList[] = $rankDiff;
}
$exportContent .= createExportContent( $valueList);
}
if ($summaryPage) {
return $exportContent;
} else {
exportToCsv('analytics_summary', $exportContent);
}
} else {
// if pdf export
if ($summaryPage) {
return $this->getViewContent('analytics/analytics_summary');
} else {
// if pdf export
if ($searchInfo['doc_type'] == "pdf") {
exportToPdf($this->getViewContent('analytics/analytics_summary'), "analytics_summary_$fromTime-$toTime.pdf");
} else {
$this->set('searchInfo', $searchInfo);
$this->render('analytics/analytics_summary');
}
}
}
}
function __getWebsiteSourceList($websiteId) {
$websiteId = intval($websiteId);
$sql = "select * from analytic_sources where
id in (select distinct source_id from website_analytics where website_id=$websiteId)
order by source_name";
$sourceList = $this->db->select($sql);
return $sourceList;
}
// func to show analytics reports
function viewAnalyticsReports($searchInfo = '') {
$userId = isLoggedIn();
if (!empty ($searchInfo['from_time'])) {
$fromTimeDate = addslashes($searchInfo['from_time']);
} else {
$fromTimeDate = date('Y-m-d', strtotime('-17 days'));
}
if (!empty ($searchInfo['to_time'])) {
$toTimeDate = addslashes($searchInfo['to_time']);
} else {
$toTimeDate = date('Y-m-d', strtotime('-1 days'));
}
$this->set('fromTime', $fromTimeDate);
$this->set('toTime', $toTimeDate);
$websiteController = New WebsiteController();
$websiteList = $websiteController->__getAllWebsites($userId, true);
$this->set('websiteList', $websiteList);
$websiteId = empty ($searchInfo['website_id']) ? $websiteList[0]['id'] : intval($searchInfo['website_id']);
$this->set('websiteId', $websiteId);
$sourceList = $this->__getWebsiteSourceList($websiteId);
$this->set('sourceList', $sourceList);
$sourceId = empty ($searchInfo['source_id']) ? $sourceList[0]['id'] : $searchInfo['source_id'];
$this->set('sourceId', $sourceId);
$conditions = " and s.website_id=$websiteId";
$conditions .= empty ($sourceId) ? "" : " and s.source_id=$sourceId";
$sql = "select s.* from website_analytics s
where report_date>='$fromTimeDate' and report_date<='$toTimeDate' $conditions
order by s.report_date";
$reportList = $this->db->select($sql);
$colList = array_keys($this->metrics);
$prevRank = [];
$rankDiff = [];
foreach ($colList as $col) {
$prevRank[$col] = 0;
}
// loop through rank
foreach ($reportList as $key => $repInfo) {
// exclude first row
if ($key) {
foreach ($colList as $col) {
$rankDiff[$col] = '';
}
foreach ($colList as $col) {
$rankDiff[$col] = round($repInfo[$col] - $prevRank[$col], 2);
if (empty($rankDiff[$col])) {
continue;
}
if ($col == "bounceRate" ) {
$rankDiff[$col] = $rankDiff[$col] * -1;
}
$rankClass = ($rankDiff[$col] > 0) ? 'green' : 'red';
$rankDiff[$col] = "<font class='$rankClass'>($rankDiff[$col])</font>";
$reportList[$key]['rank_diff_'.$col] = empty($rankDiff[$col]) ? '' : $rankDiff[$col];
}
}
foreach ($colList as $col) {
$prevRank[$col] = $repInfo[$col];
}
}
$this->set('list', array_reverse($reportList, true));
$this->render('analytics/analytics_reports');
}
// func to show analytics reports in graph
function viewAnalyticsGraphReports($searchInfo = '') {
$userId = isLoggedIn();
if (!empty ($searchInfo['from_time'])) {
$fromTimeDate = addslashes($searchInfo['from_time']);
} else {
$fromTimeDate = date('Y-m-d', strtotime('-17 days'));
}
if (!empty ($searchInfo['to_time'])) {
$toTimeDate = addslashes($searchInfo['to_time']);
} else {
$toTimeDate = date('Y-m-d', strtotime('-1 days'));
}
$this->set('fromTime', $fromTimeDate);
$this->set('toTime', $toTimeDate);
$websiteController = New WebsiteController();
$websiteList = $websiteController->__getAllWebsites($userId, true);
$this->set('websiteList', $websiteList);
$websiteId = empty ($searchInfo['website_id']) ? $websiteList[0]['id'] : intval($searchInfo['website_id']);
$this->set('websiteId', $websiteId);
$sourceList = $this->__getWebsiteSourceList($websiteId);
$this->set('sourceList', $sourceList);
$sourceId = empty ($searchInfo['source_id']) ? $sourceList[0]['id'] : $searchInfo['source_id'];
$this->set('sourceId', $sourceId);
$conditions = " and s.website_id=$websiteId";
$conditions .= empty ($sourceId) ? "" : " and s.source_id=$sourceId";
$sql = "select s.* from website_analytics s
where report_date>='$fromTimeDate' and report_date<='$toTimeDate' $conditions
order by s.report_date";
$reportList = $this->db->select($sql);
// if reports not empty
$colList = $this->metrics;
$this->set('colList', $colList);
$this->set('searchInfo', $searchInfo);
$graphColList = array();
if (!empty($searchInfo['attr_type'])) {
$graphColList[$searchInfo['attr_type']] = $colList[$searchInfo['attr_type']];
if ($searchInfo['attr_type'] == 'bounceRate') {
$this->set('reverseDir', true);
}
} else {
$graphColList = $colList;
unset($graphColList['bounceRate']);
}
if (!empty($reportList)) {
$dataArr = "['Date', '" . implode("', '", array_values($graphColList)) . "']";
// loop through data list
foreach ($reportList as $dataInfo) {
$valStr = "";
foreach ($graphColList as $seId => $seVal) {
$valStr .= ", ";
$valStr .= !empty($dataInfo[$seId]) ? $dataInfo[$seId] : 0;
}
$dataArr .= ", ['{$dataInfo['report_date']}' $valStr]";
}
$this->set('dataArr', $dataArr);
$this->set('graphTitle', $this->spTextTools['Website Analytics Summary']);
$graphContent = $this->getViewContent('report/graph');
} else {
$graphContent = showErrorMsg($_SESSION['text']['common']['No Records Found'], false, true);
}
// get graph content
$this->set('graphContent', $graphContent);
$this->render('analytics/graphicalreport');
}
// func to show keyword select box
function showSourceSelectBox($websiteId){
$websiteId = intval($websiteId);
$this->set('sourceList', $this->__getWebsiteSourceList($websiteId));
$this->render('analytics/source_select_box', 'ajax');
}
}
?>