Go to most recent revision | Blame | Compare with Previous | 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. *
***************************************************************************/
# class defines all report controller functions
class ReportController extends Controller {
var $seLIst;
var $showAll = false;
var $proxyCheckCount = 1;
# func to get keyword report summary
function __getKeywordSearchReport($keywordId, $fromTime, $toTime, $apiCall = false){
$positionInfo = array();
if(empty($this->seLIst)){
$seController = New SearchEngineController();
$this->seLIst = $seController->__getAllSearchEngines();
}
$fromTimeLabel = date('Y-m-d', $fromTime);
$toTimeLabel = date('Y-m-d', $toTime);
foreach($this->seLIst as $seInfo){
$sql = "select min(rank) as rank,result_date from searchresults
where keyword_id=$keywordId and searchengine_id=".$seInfo['id']."
and (result_date='$fromTimeLabel' or result_date='$toTimeLabel')
group by result_date order by result_date DESC limit 0, 2";
$reportList = $this->db->select($sql);
$reportList = array_reverse($reportList);
$prevRank = 0;
$i = 0;
foreach ($reportList as $key => $repInfo) {
$rankDiff = '';
if ($i > 0) {
$rankDiff = $prevRank - $repInfo['rank'];
if ($rankDiff > 0) {
$rankDiff = $apiCall ? $rankDiff : "<font class='green'>($rankDiff)</font>";
} elseif ($rankDiff < 0) {
$rankDiff = $apiCall ? $rankDiff : "<font class='red'>($rankDiff)</font>";
}
}
$positionInfo[$seInfo['id']]['rank_diff'] = empty ($rankDiff) ? '' : $rankDiff;
$positionInfo[$seInfo['id']]['rank'] = $repInfo['rank'];
$positionInfo[$seInfo['id']][$repInfo['result_date']] = $repInfo['rank'];
$prevRank = $repInfo['rank'];
$i++;
}
}
return $positionInfo;
}
# func to show keyword report summary
function showKeywordReportSummary($searchInfo = '') {
$userId = isLoggedIn();
$keywordController = New KeywordController();
$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;
}
if (!empty ($searchInfo['from_time'])) {
$fromTime = strtotime($searchInfo['from_time'] . ' 00:00:00');
} else {
$fromTime = mktime(0, 0, 0, date('m'), date('d') - 1, date('Y'));
}
if (!empty ($searchInfo['to_time'])) {
$toTime = strtotime($searchInfo['to_time'] . ' 00:00:00');
} else {
$toTime = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
}
$fromTimeTxt = date('Y-m-d', $fromTime);
$toTimeTxt = date('Y-m-d', $toTime);
$this->set('fromTime', $fromTimeTxt);
$this->set('toTime', $toTimeTxt);
$websiteController = New WebsiteController();
$websiteList = $websiteController->__getAllWebsitesWithActiveKeywords($userId, true);
$this->set('websiteList', $websiteList);
$websiteId = isset($searchInfo['website_id']) ? $searchInfo['website_id'] : $websiteList[0]['id'];
$websiteId = intval($websiteId);
$this->set('websiteId', $websiteId);
$websiteUrl = "";
foreach ($websiteList as $websiteInfo) {
if ($websiteInfo['id'] == $websiteId) {
$websiteUrl = $websiteInfo['url'];
break;
}
}
$this->set('websiteUrl', $websiteUrl);
$seSearchUserId = isAdmin() ? "" : $userId;
$this->seLIst = $keywordController->getUserKeywordSearchEngineList($seSearchUserId);
$this->set('seList', $this->seLIst);
// to find order col
if (!empty($searchInfo['order_col'])) {
$orderCol = $searchInfo['order_col'];
$orderVal = getOrderByVal($searchInfo['order_val']);
} else {
$orderCol = $this->seLIst[array_keys($this->seLIst)[0]]['id'];
$orderVal = 'ASC';
}
$this->set('orderCol', $orderCol);
$this->set('orderVal', $orderVal);
$scriptPath = SP_WEBPATH."/reports.php?sec=reportsum&website_id=$websiteId";
$scriptPath .= "&from_time=$fromTimeTxt&to_time=$toTimeTxt&search_name=" . $searchInfo['search_name'];
$scriptPath .= "&order_col=$orderCol&order_val=$orderVal";
$conditions = " and w.status=1 and k.status=1";
$conditions .= isAdmin() ? "" : $websiteController->getWebsiteUserAccessCondition($userId);
$conditions .= !empty($websiteId) ? " and w.id=$websiteId" : "";
$conditions .= !empty($searchInfo['search_name']) ? " and k.name like '%".addslashes($searchInfo['search_name'])."%'" : "";
$subSql = "select [col] from keywords k,searchresults r, websites w
where k.id=r.keyword_id and k.website_id=w.id $conditions
and r.searchengine_id=".intval($orderCol)." and r.result_date='" . addslashes($toTimeTxt) . "'
group by k.id";
$unionOrderCol = ($orderCol == "keyword") ? "name" : "rank";
$sql = "(". str_replace("[col]", "k.id,k.name,min(rank) rank,w.name website,w.url weburl", $subSql) .")
UNION
(select k.id,k.name,1000,w.name website,w.url weburl
from keywords k, websites w
where w.id=k.website_id $conditions and k.id not in
(". str_replace("[col]", "distinct(k.id)", $subSql) ."))
order by $unionOrderCol $orderVal";
if ($unionOrderCol != 'name') $sql .= ", name";
# pagination setup
$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']);
if (!in_array($searchInfo['doc_type'], array("pdf", "export"))) {
$sql .= " limit ".$this->paging->start .",". $this->paging->per_page;
}
# set keywords list
$list = $this->db->select($sql);
$indexList = array();
foreach($list as $keywordInfo){
$positionInfo = $this->__getKeywordSearchReport($keywordInfo['id'], $fromTime, $toTime, true);
// check whether the sorting search engine is there
$indexList[$keywordInfo['id']] = empty($positionInfo[$orderCol][$toTimeTxt]) ? 10000 : $positionInfo[$orderCol][$toTimeTxt];
$keywordInfo['position_info'] = $positionInfo;
$keywordList[$keywordInfo['id']] = $keywordInfo;
}
// sort array according the value
if ($orderCol != 'keyword') {
if ($orderVal == 'DESC') {
arsort($indexList);
} else {
asort($indexList);
}
}
$this->set('indexList', $indexList);
if ($exportVersion) {
$spText = $_SESSION['text'];
$reportHeading = $this->spTextTools['Keyword Position Summary']."(".date('Y-m-d', $fromTime)." - ".date('Y-m-d', $toTime).")";
$exportContent .= createExportContent( array('', $reportHeading, ''));
$exportContent .= createExportContent( array());
$headList = array($spText['common']['Website'], $spText['common']['Keyword']);
$pTxt = str_replace("-", "/", substr($fromTimeTxt, -5));
$cTxt = str_replace("-", "/", substr($toTimeTxt, -5));
foreach ($this->seLIst as $seInfo) {
$domainTxt = str_replace("www.", "", $seInfo['domain']);
$headList[] = $domainTxt . "($cTxt)";
$headList[] = $domainTxt . "($pTxt)";
$headList[] = $domainTxt . "(+/-)";
}
$exportContent .= createExportContent( $headList);
foreach($indexList as $keywordId => $rankValue){
$listInfo = $keywordList[$keywordId];
$positionInfo = $listInfo['position_info'];
$valueList = array($listInfo['weburl'], $listInfo['name']);
foreach ($this->seLIst as $index => $seInfo){
$rankInfo = $positionInfo[$seInfo['id']];
$prevRank = isset($rankInfo[$fromTimeTxt]) ? $rankInfo[$fromTimeTxt] : "";
$currRank = isset($rankInfo[$toTimeTxt]) ? $rankInfo[$toTimeTxt] : "";
$rankDiff = "";
// if both ranks are existing
if ($prevRank != '' && $currRank != '') {
$rankDiff = $prevRank - $currRank;
}
$valueList[] = $currRank;
$valueList[] = $prevRank;
$valueList[] = $rankDiff;
}
$exportContent .= createExportContent( $valueList);
}
exportToCsv('keyword_report_summary', $exportContent);
} else {
$this->set('list', $keywordList);
// if pdf export
if ($searchInfo['doc_type'] == "pdf") {
exportToPdf($this->getViewContent('report/reportsummary'), "keyword_report_summary_$fromTimeTxt-$toTimeTxt.pdf");
} else {
$this->set('searchInfo', $searchInfo);
$this->render('report/reportsummary');
}
}
}
# func to show reports
function showReports($searchInfo = '') {
$userId = isLoggedIn();
if (!empty ($searchInfo['from_time'])) {
$fromTime = strtotime($searchInfo['from_time'] . ' 00:00:00');
} else {
$fromTime = @mktime(0, 0, 0, date('m'), date('d') - 30, date('Y'));
}
if (!empty ($searchInfo['to_time'])) {
$toTime = strtotime($searchInfo['to_time'] . ' 23:59:59');
} else {
$toTime = @mktime();
}
$fromTimeDate = date('Y-m-d', $fromTime);
$toTimeDate = date('Y-m-d', $toTime);
$this->set('fromTime', $fromTimeDate);
$this->set('toTime', $toTimeDate);
$keywordController = New KeywordController();
if(!empty($searchInfo['keyword_id']) && !empty($searchInfo['rep'])){
$searchInfo['keyword_id'] = intval($searchInfo['keyword_id']);
$keywordInfo = $keywordController->__getKeywordInfo($searchInfo['keyword_id']);
$searchInfo['website_id'] = $keywordInfo['website_id'];
}
$websiteController = New WebsiteController();
$websiteList = $websiteController->__getAllWebsitesWithActiveKeywords($userId, true);
$this->set('websiteList', $websiteList);
$websiteId = empty ($searchInfo['website_id']) ? $websiteList[0]['id'] : intval($searchInfo['website_id']);
$this->set('websiteId', $websiteId);
$keywordList = $keywordController->__getAllKeywords($userId, $websiteId, true);
$this->set('keywordList', $keywordList);
$keywordId = empty ($searchInfo['keyword_id']) ? $keywordList[0]['id'] : $searchInfo['keyword_id'];
$this->set('keywordId', $keywordId);
$seController = New SearchEngineController();
$seList = $seController->__getAllSearchEngines();
$this->set('seList', $seList);
$seId = empty ($searchInfo['se_id']) ? $seList[0]['id'] : intval($searchInfo['se_id']);
$this->set('seId', $seId);
$this->set('seInfo', $seController->__getsearchEngineInfo($seId));
$conditions = empty ($keywordId) ? "" : " and s.keyword_id=$keywordId";
$conditions .= empty ($seId) ? "" : " and s.searchengine_id=$seId";
$sql = "select s.*,sd.url,sd.title,sd.description from searchresults s,searchresultdetails sd
where s.id=sd.searchresult_id and result_date>='$fromTimeDate' and result_date<='$toTimeDate' $conditions
order by s.result_date";
$repList = $this->db->select($sql);
$reportList = array ();
foreach ($repList as $repInfo) {
$var = 'se' . $seId . $repInfo['keyword_id'] . $repInfo['result_date'];
if (empty ($reportList[$var])) {
$reportList[$var] = $repInfo;
} else {
if ($repInfo['rank'] < $reportList[$var]['rank']) {
$reportList[$var] = $repInfo;
}
}
}
$prevRank = 0;
$i = 0;
foreach ($reportList as $key => $repInfo) {
$rankDiff = '';
if ($i > 0) {
$rankDiff = $prevRank - $repInfo['rank'];
if ($rankDiff > 0) {
$rankDiff = "<font class='green'>($rankDiff)</font>";
}
elseif ($rankDiff < 0) {
$rankDiff = "<font class='red'>($rankDiff)</font>";
}
}
$reportList[$key]['rank_diff'] = empty ($rankDiff) ? '' : $rankDiff;
$prevRank = $repInfo['rank'];
$i++;
}
$this->set('list', array_reverse($reportList, true));
$this->render('report/report');
}
# func to show reports in a time
function showTimeReport($searchInfo = '') {
$fromTime = addslashes($searchInfo['time']);
$toTime = $fromTime + (3600 * 24);
$keywordId = intval($searchInfo['keyId']);
$seId = intval($searchInfo['seId']);
$seController = New SearchEngineController();
$this->set('seInfo', $seController->__getsearchEngineInfo($seId));
$conditions = empty ($keywordId) ? "" : " and s.keyword_id=$keywordId";
$conditions .= empty ($seId) ? "" : " and s.searchengine_id=$seId";
$fromTimeDate = date('Y-m-d', $fromTime);
$toTimeDate = date('Y-m-d', $toTime);
$sql = "select s.*,sd.url,sd.title,sd.description from searchresults s,searchresultdetails sd
where s.id=sd.searchresult_id and result_date>='$fromTimeDate' and result_date<'$toTimeDate' $conditions
order by s.rank";
$reportList = $this->db->select($sql);
$this->set('list', $reportList);
$this->render('report/timereport');
}
# func to show graphical reports
function showGraphicalReports($searchInfo = '') {
$userId = isLoggedIn();
$fromTime = !empty($searchInfo['from_time']) ? $searchInfo['from_time'] : date('Y-m-d', strtotime('-30 days'));
$toTime = !empty ($searchInfo['to_time']) ? $searchInfo['to_time'] : date("Y-m-d");
$this->set('fromTime', $fromTime);
$this->set('toTime', $toTime);
$websiteController = New WebsiteController();
$websiteList = $websiteController->__getAllWebsitesWithActiveKeywords($userId, true);
$this->set('websiteList', $websiteList);
$websiteId = empty ($searchInfo['website_id']) ? $websiteList[0]['id'] : intval($searchInfo['website_id']);
$this->set('websiteId', $websiteId);
$keywordController = New KeywordController();
$keywordList = $keywordController->__getAllKeywords($userId, $websiteId, true);
$this->set('keywordList', $keywordList);
$keywordId = empty ($searchInfo['keyword_id']) ? $keywordList[0]['id'] : intval($searchInfo['keyword_id']);
$this->set('keywordId', $keywordId);
$seController = New SearchEngineController();
$seList = $seController->__getAllSearchEngines();
$this->set('seList', $seList);
$seId = empty ($searchInfo['se_id']) ? '' : intval($searchInfo['se_id']);
$this->set('seId', $seId);
$this->set('seNull', true);
// get graph content
$graphCtrler = new GraphController();
$graphCtrler->spTextKeyword = $this->spTextKeyword;
$graphContent = $graphCtrler->showKeywordPostionGraph($keywordId, $fromTime, $toTime, $seId);
$this->set('graphContent', $graphContent);
$this->render('report/graphicalreport');
}
# function to show an message in graph when no records exist
function showMessageAsImage($msg='', $width=700, $height=30, $red=233, $green=14, $blue=91) {
$im = imagecreate($width, $height);
$bgColor = imagecolorallocate($im, 245, 248, 250);
$textColor = imagecolorallocate($im, 233, 14, 91);
$fontFile = ($_SESSION['lang_code'] == 'ja') ? "fonts/M+1P+IPAG.ttf" : "fonts/tahoma.ttf";
imagettftext($im, 10, 0, 260, 20, $textColor, $fontFile, $msg);
imagepng($im);
imagedestroy($im);
exit;
}
# function to show graph
function showGraph($searchInfo = '') {
$fromTimeDate = date('Y-m-d', $searchInfo['fromTime']);
$toTimeDate = date('Y-m-d', $searchInfo['toTime']);
$conditions = empty ($searchInfo['keywordId']) ? "" : " and s.keyword_id=".intval($searchInfo['keywordId']);
$conditions .= empty ($searchInfo['seId']) ? "" : " and s.searchengine_id=".intval($searchInfo['seId']);
$sql = "select s.*,se.domain from searchresults s,searchengines se
where s.searchengine_id=se.id and result_date>='$fromTimeDate' and result_date<='$toTimeDate'
$conditions order by s.result_date";
$repList = $this->db->select($sql);
$reportList = array ();
$seList = array();
foreach ($repList as $repInfo) {
$var = $repInfo['searchengine_id'] . $repInfo['keyword_id'] . $repInfo['result_date'];
if (empty ($reportList[$var])) {
$reportList[$var] = $repInfo;
} else {
if ($repInfo['rank'] < $reportList[$var]['rank']) {
$reportList[$var] = $repInfo;
}
}
if(empty($seList[$repInfo['searchengine_id']])){
$seList[$repInfo['searchengine_id']] = $repInfo['domain'];
}
}
asort($seList);
$dataList = array();
$maxValue = 0;
foreach($reportList as $repInfo){
$seId = $repInfo['searchengine_id'];
$dataList[$repInfo['result_date']][$seId] = $repInfo['rank'];
$maxValue = ($repInfo['rank'] > $maxValue) ? $repInfo['rank'] : $maxValue;
}
// check whether the records are available for drawing graph
if(empty($dataList) || empty($maxValue)) {
$kpText = ($_SESSION['lang_code'] == 'ja') ? $_SESSION['text']['common']['No Records Found']."!" : "No Records Found!";
$this->showMessageAsImage($kpText);
}
# Dataset definition
$dataSet = new pData;
foreach($dataList as $dataInfo){
$i = 1;
foreach($seList as $seId => $seVal){
$val = empty($dataInfo[$seId]) ? 0 : $dataInfo[$seId];
$dataSet->AddPoint($val, "Serie".$i++);
}
}
$i = 1;
foreach($seList as $seDomain){
$dataSet->AddSerie("Serie$i");
$dataSet->SetSerieName($seDomain, "Serie$i");
$i++;
}
$serieCount = count($seList) + 1;
$dataSet->AddPoint(array_keys($dataList), "Serie$serieCount");
$dataSet->SetAbsciseLabelSerie("Serie$serieCount");
# if language is japanese
if ($_SESSION['lang_code'] == 'ja') {
$fontFile = "fonts/M+1P+IPAG.ttf";
$dataSet->SetXAxisName($_SESSION['text']['common']["Date"]);
$dataSet->SetYAxisName($_SESSION['text']['common']["Rank"]);
} else {
$fontFile = "fonts/tahoma.ttf";
$dataSet->SetXAxisName("Date");
$dataSet->SetYAxisName("Rank");
}
/* commented to fix invalid date in graphical reports x axis issue */
// $dataSet->SetXAxisFormat("date");
# Initialise the graph
$chart = new pChart(720, 520);
$chart->setFixedScale($maxValue, 1);
$chart->setFontProperties($fontFile, 8);
$chart->setGraphArea(85, 30, 670, 425);
$chart->drawFilledRoundedRectangle(7, 7, 713, 513, 5, 240, 240, 240);
$chart->drawRoundedRectangle(5, 5, 715, 515, 5, 230, 230, 230);
$chart->drawGraphArea(255, 255, 255, TRUE);
$getData = $dataSet->GetData();
$getDataDes = $dataSet->GetDataDescription();
$chart->drawScale($getData, $getDataDes, SCALE_NORMAL, 150, 150, 150, TRUE, 90, 2);
$chart->drawGrid(4, TRUE, 230, 230, 230, 50);
# Draw the 0 line
$chart->setFontProperties($fontFile, 6);
$chart->drawTreshold(0, 143, 55, 72, TRUE, TRUE);
# Draw the line graph
$getData = $dataSet->GetData();
$getDataDes = $dataSet->GetDataDescription();
$chart->drawLineGraph($getData, $getDataDes);
$getData = $dataSet->GetData();
$getDataDes = $dataSet->GetDataDescription();
$chart->drawPlotGraph($getData, $getDataDes, 3, 2, 255, 255, 255);
$j = 1;
$chart->setFontProperties($fontFile, 10);
foreach($seList as $seDomain){
$getData = $dataSet->GetData();
$getDataDes = $dataSet->GetDataDescription();
$chart->writeValues($getData, $getDataDes, "Serie".$j++);
}
# Finish the graph
$chart->setFontProperties("fonts/tahoma.ttf", 8);
$getDataDes = $dataSet->GetDataDescription();
$chart->drawLegend(90, 35, $getDataDes, 255, 255, 255);
$chart->setFontProperties($fontFile, 10);
$kpText = ($_SESSION['lang_code'] == 'ja') ? $this->spTextKeyword["Keyword Position Report"] : "Keyword Position Report";
$chart->drawTitle(60, 22, $kpText, 50, 50, 50, 585);
$chart->stroke();
}
# func to show genearte reports interface
function showGenerateReports($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);
$keywordController = New KeywordController();
$keywordList = $keywordController->__getAllKeywords($userId, $websiteId, true);
$this->set('keywordList', $keywordList);
$this->set('keyNull', false);
$keywordId = empty ($searchInfo['keyword_id']) ? '' : $searchInfo['keyword_id'];
$this->set('keywordId', $keywordId);
$seController = New SearchEngineController();
$seList = $seController->__getAllSearchEngines();
$this->set('seList', $seList);
$seId = empty ($searchInfo['se_id']) ? '' : $searchInfo['se_id'];
$this->set('seId', $seId);
$this->set('seNull', true);
$this->set('seStyle', 170);
$this->render('report/generatereport');
}
# func to generate reports
function generateReports( $searchInfo='' ) {
$userId = isLoggedIn();
$keywordId = empty ($searchInfo['keyword_id']) ? '' : intval($searchInfo['keyword_id']);
$websiteId = empty ($searchInfo['website_id']) ? '' : intval($searchInfo['website_id']);
$seId = empty ($searchInfo['se_id']) ? '' : intval($searchInfo['se_id']);
$seController = New SearchEngineController();
$this->seList = $seController->__getAllCrawlFormatedSearchEngines();
$sql = "select k.*,w.url from keywords k,websites w where k.website_id=w.id and k.status=1";
if(!empty($userId) && !isAdmin()) $sql .= " and w.user_id=$userId";
if(!empty($websiteId)) $sql .= " and k.website_id=$websiteId";
if(!empty($keywordId)) $sql .= " and k.id=$keywordId";
$sql .= " order by k.name";
$keywordList = $this->db->select($sql);
if(count($keywordList) <= 0){
echo "<p class='note error'>".$_SESSION['text']['common']['No Keywords Found']."</p>";
exit;
}
# loop through each keyword
foreach ( $keywordList as $keywordInfo ) {
$this->seFound = 0;
$crawlResult = $this->crawlKeyword($keywordInfo, $seId);
foreach($crawlResult as $sengineId => $matchList){
if($matchList['status']){
foreach($matchList['matched'] as $i => $matchInfo){
$remove = ($i == 0) ? true : false;
$matchInfo['se_id'] = $sengineId;
$matchInfo['keyword_id'] = $keywordInfo['id'];
$this->saveMatchedKeywordInfo($matchInfo, $remove);
}
echo "<p class='note notesuccess'>".$this->spTextKeyword['Successfully crawled keyword']." <b>{$keywordInfo['name']}</b> ".$this->spTextKeyword['results from']." <b>".$this->seList[$sengineId]['domain']."</b>.....</p>";
}else{
echo "<p class='note notefailed'>".$this->spTextKeyword['Crawling keyword']." <b>{$keywordInfo['name']}</b> ".$this->spTextKeyword['results from']." <b>".$this->seList[$sengineId]['domain']."</b> ".$_SESSION['text']['common']['failed']."......</p>";
}
}
if(empty($this->seFound)){
echo "<p class='note notefailed'>".$_SESSION['text']['common']['Keyword']." <b>{$keywordInfo['name']}</b> ".$this->spTextKeyword['not assigned to required search engines']."........</p>";
}
sleep(SP_CRAWL_DELAY);
}
}
# function to format pagecontent
function formatPageContent($seInfoId, $pageContent) {
if (!empty($this->seList[$seInfoId]['from_pattern']) && $this->seList[$seInfoId]['to_pattern']) {
$pattern = $this->seList[$seInfoId]['from_pattern']."(.*)".$this->seList[$seInfoId]['to_pattern'];
if (preg_match("/$pattern/is", $pageContent, $matches)) {
if (!empty($matches[1])) {
$pageContent = $matches[1];
}
}
}
return $pageContent;
}
# func to crawl keyword
function crawlKeyword( $keywordInfo, $seId='', $cron=false, $removeDuplicate=true) {
$crawlResult = array();
$websiteUrl = formatUrl($keywordInfo['url'], false);
if(empty($websiteUrl)) return $crawlResult;
if(empty($keywordInfo['name'])) return $crawlResult;
$time = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
$seList = explode(':', $keywordInfo['searchengines']);
foreach($seList as $seInfoId){
// function to execute only passed search engine
if(!empty($seId) && ($seInfoId != $seId)) continue;
// if search engine not found continue
if (empty($this->seList[$seInfoId])) continue;
$this->seFound = 1;
// if execution from cron check whether cron already executed
/*if ($cron) {
if (SP_MULTIPLE_CRON_EXEC && $this->isCronExecuted($keywordInfo['id'], $seInfoId, $time)) continue;
}*/
$searchUrl = str_replace('[--keyword--]', urlencode(stripslashes($keywordInfo['name'])), $this->seList[$seInfoId]['url']);
$searchUrl = str_replace('[--country--]', $keywordInfo['country_code'], $searchUrl);
if (empty($keywordInfo['country_code']) && stristr($searchUrl, '&cr=country&')) {
$searchUrl = str_replace('&cr=country&', '&cr=&', $searchUrl);
}
$seUrl = str_replace('[--start--]', $this->seList[$seInfoId]['start'], $searchUrl);
// if google add special parameters
$isGoogle = false;
if (stristr($this->seList[$seInfoId]['url'], 'google')) {
$isGoogle = true;
$seUrl .= "&ie=utf-8&pws=0&gl=".$keywordInfo['country_code'];
$seUrl = str_replace('[--lang--]', '', $seUrl);
} else {
$seUrl = str_replace('[--lang--]', $keywordInfo['lang_code'], $seUrl);
}
if(!empty($this->seList[$seInfoId]['cookie_send'])){
$this->seList[$seInfoId]['cookie_send'] = str_replace('[--lang--]', $keywordInfo['lang_code'], $this->seList[$seInfoId]['cookie_send']);
$this->spider->_CURLOPT_COOKIE = $this->seList[$seInfoId]['cookie_send'];
}
$result = $this->spider->getContent($seUrl);
$pageContent = $this->formatPageContent($seInfoId, $result['page']);
// testing code for regex
/*$testFileName = SP_TMPPATH . "/google.html";
$myfile = fopen($testFileName, "w") or die("Unable to open file!");
fwrite($myfile, $pageContent);
fclose($myfile);
exit;
$myfile = fopen($testFileName, "r") or die("Unable to open file!");
$pageContent = fread($myfile,filesize($testFileName));
fclose($myfile);*/
$crawlLogCtrl = new CrawlLogController();
$crawlInfo = [];
$crawlInfo['crawl_type'] = 'keyword';
$crawlInfo['ref_id'] = empty($keywordInfo['id']) ? $keywordInfo['name'] : $keywordInfo['id'];
$crawlInfo['subject'] = $seInfoId;
$seStart = $this->seList[$seInfoId]['start'] + $this->seList[$seInfoId]['start_offset'];
while(empty($result['error']) && ($seStart < $this->seList[$seInfoId]['max_results']) ){
$logId = $result['log_id'];
if(SP_DEBUG){
$crawlInfo['log_message'] = "Started at: $seStart";
}
$crawlLogCtrl->updateCrawlLog($logId, $crawlInfo);
sleep(SP_CRAWL_DELAY);
$seUrl = str_replace('[--start--]', $seStart, $searchUrl);
$result = $this->spider->getContent($seUrl);
$pageContent .= $this->formatPageContent($seInfoId, $result['page']);
$seStart += $this->seList[$seInfoId]['start_offset'];
}
# to check whether utf8 conversion needed
if(!empty($this->seList[$seInfoId]['encoding'])){
$pageContent = mb_convert_encoding($pageContent, "UTF-8", $this->seList[$seInfoId]['encoding']);
}
$crawlStatus = 0;
if(empty($result['error'])){
// to update cron that report executed for akeyword on a search engine
if (SP_MULTIPLE_CRON_EXEC && $cron) $this->saveCronTrackInfo($keywordInfo['id'], $seInfoId, $time);
// verify the urls existing in the result
preg_match_all($this->seList[$seInfoId]['regex'], $pageContent, $matches);
if (!empty($matches[$this->seList[$seInfoId]['url_index']])) {
$urlList = $matches[$this->seList[$seInfoId]['url_index']];
$crawlResult[$seInfoId]['matched'] = array();
$rank = 1;
$previousDomain = "";
foreach($urlList as $i => $url){
$url = urldecode(strip_tags($url));
// add special condition for baidu
if (stristr($this->seList[$seInfoId]['domain'], "baidu")) {
$url = addHttpToUrl($url);
$url = str_replace("...", "", $url);
}
// if google engine, format the urls
if ($isGoogle && stristr($url, '/url?q=')) {
$url = preg_replace(array('/\/url\?q=/i', '/\&sa=U.*$/i'), array("", ""), $url);
}
if(!preg_match('/^http:\/\/|^https:\/\//i', $url)) continue;
// check for to remove bing ad links in page
if(stristr($url, 'bat.bing.com')) continue;
// check to remove duplicates from same domain if google is the search engine
if ($removeDuplicate && $isGoogle) {
$currentDomain = parse_url($url, PHP_URL_HOST);
if ($previousDomain == $currentDomain) {
continue;
}
$previousDomain = $currentDomain;
}
if($this->showAll || (stristr($url, "http://" . $websiteUrl) || stristr($url, "https://" . $websiteUrl)) ){
if ($this->showAll && (stristr($url, "http://" . $websiteUrl) || stristr($url, "https://" . $websiteUrl)) ) {
$matchInfo['found'] = 1;
} else {
$matchInfo['found'] = 0;
}
$matchInfo['url'] = $url;
$matchInfo['title'] = strip_tags($matches[$this->seList[$seInfoId]['title_index']][$i]);
$matchInfo['description'] = strip_tags($matches[$this->seList[$seInfoId]['description_index']][$i]);
$matchInfo['rank'] = $rank;
$crawlResult[$seInfoId]['matched'][] = $matchInfo;
}
$rank++;
}
$crawlStatus = 1;
} else {
// set crawl log info
$crawlInfo['crawl_status'] = 0;
$crawlInfo['log_message'] = SearchEngineController::isCaptchInSearchResults($pageContent) ? "<font class=error>Captcha found</font> in search result page" : "Regex not matched error occured while parsing search results!";
if(SP_DEBUG){
echo "<p class='note' style='text-align:left;'>Error occured while parsing $seUrl ".formatErrorMsg("Regex not matched <br>\n")."</p>";
}
}
} else {
if (SP_DEBUG) {
echo "<p class='note' style='text-align:left;'>Error occured while crawling $seUrl ".formatErrorMsg($result['errmsg']."<br>\n")."</p>";
}
}
$crawlResult[$seInfoId]['status'] = $crawlStatus;
sleep(SP_CRAWL_DELAY);
// update crawl log
$logId = $result['log_id'];
$crawlLogCtrl->updateCrawlLog($logId, $crawlInfo);
// if proxy enabled if crawl failed try to check next item
if (!$crawlResult[$seInfoId]['status'] && SP_ENABLE_PROXY && CHECK_WITH_ANOTHER_PROXY_IF_FAILED) {
// max proxy checked in one execution is exeeded
if ($this->proxyCheckCount < CHECK_MAX_PROXY_COUNT_IF_FAILED) {
// if proxy is available for execution
$proxyCtrler = New ProxyController();
if ($proxyInfo = $proxyCtrler->getRandomProxy()) {
$this->proxyCheckCount++;
sleep(SP_CRAWL_DELAY);
$crawlResult = array_merge($crawlResult, $this->crawlKeyword($keywordInfo, $seInfoId, $cron, $removeDuplicate));
}
} else {
$this->proxyCheckCount = 1;
}
}
}
return $crawlResult;
}
# func to save the report
function saveMatchedKeywordInfo($matchInfo, $remove=false) {
$time = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
$resultDate = date('Y-m-d');
$this->checkDBConn();
if($remove){
$sql = "select id from searchresults where keyword_id={$matchInfo['keyword_id']}
and searchengine_id={$matchInfo['se_id']} and result_date='$resultDate'";
$recordList = $this->db->select($sql);
if(count($recordList) > 0){
foreach($recordList as $recordInfo){
$sql = "delete from searchresultdetails where searchresult_id=".$recordInfo['id'];
$this->db->query($sql);
}
$sql = "delete from searchresults where keyword_id={$matchInfo['keyword_id']}
and searchengine_id={$matchInfo['se_id']} and result_date='$resultDate'";
$this->db->query($sql);
}
}
$sql = "insert into searchresults(keyword_id,searchengine_id,rank,time,result_date)
values({$matchInfo['keyword_id']},{$matchInfo['se_id']},{$matchInfo['rank']},$time,'$resultDate')";
$this->db->query($sql);
$recordId = $this->db->getMaxId('searchresults');
$sql = "insert into searchresultdetails(searchresult_id,url,title,description)
values($recordId,'{$matchInfo['url']}','".addslashes($matchInfo['title'])."','".addslashes($matchInfo['description'])."')";
$this->db->query($sql);
}
# func to check keyword rank
function quickRankChecker() {
$seController = New SearchEngineController();
$seList = $seController->__getAllSearchEngines();
$this->set('seList', $seList);
$this->set('seStyle', 230);
$seId = empty ($searchInfo['se_id']) ? '' : $searchInfo['se_id'];
$this->set('seId', $seId);
$langController = New LanguageController();
$this->set('langNull', true);
$this->set('langStyle', 230);
$this->set('langList', $langController->__getAllLanguages());
$countryController = New CountryController();
$this->set('countryList', $countryController->__getAllCountries());
$this->set('countryNull', true);
$this->set('countryStyle', 230);
$this->render('report/quickrankchecker');
}
# func to show quick rank report
function showQuickRankChecker($keywordInfo='') {
$keywordInfo['searchengines'] = $keywordInfo['se_id'];
$this->showAll = $keywordInfo['show_all'];
$seController = New SearchEngineController();
$this->seList = $seController->__getAllCrawlFormatedSearchEngines();
$crawlResult = $this->crawlKeyword($keywordInfo);
$resultList = array();
if(!empty($crawlResult[$keywordInfo['se_id']]['status'])){
$resultList = $crawlResult[$keywordInfo['se_id']]['matched'];
}
$this->set('list', $resultList);
$this->render('report/showquickrankchecker');
}
#function to save keyword cron trcker for multiple execution of cron same day
function saveCronTrackInfo($keywordId, $seId, $time) {
$sql = "Insert into keywordcrontracker(keyword_id,searchengine_id,time) values($keywordId,$seId,$time)";
$this->db->query($sql);
}
# function to check whether cron executed for a particular keyword and search engine
function isCronExecuted($keywordId, $seId, $time) {
$sql = "select keyword_id from keywordcrontracker where keyword_id=$keywordId and searchengine_id=$seId and time=$time";
$info = $this->db->select($sql, true);
return empty($info['keyword_id']) ? false : true;
}
# function to show system reports
function showOverallReportSummary($searchInfo='', $cronUserId=false) {
$spTextHome = $this->getLanguageTexts('home', $_SESSION['lang_code']);
$this->set('spTextHome', $spTextHome);
$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;
}
$this->set('sectionHead', $spTextHome['Overall Report Summary']);
$userId = empty($cronUserId) ? isLoggedIn() : $cronUserId;
$isAdmin = isAdmin();
$keywordController = New KeywordController();
$websiteCtrler = New WebsiteController();
$websiteList = $websiteCtrler->__getAllWebsites($userId, true);
$this->set('siteList', $websiteList);
$websiteId = isset($searchInfo['website_id']) ? $searchInfo['website_id'] : $websiteList[0]['id'];
$websiteId = intval($websiteId);
$this->set('websiteId', $websiteId);
$urlarg = "website_id=$websiteId";
$websiteUrl = "";
foreach ($websiteList as $websiteInfo) {
if ($websiteInfo['id'] == $websiteId) {
$websiteUrl = $websiteInfo['url'];
break;
}
}
$this->set('websiteUrl', $websiteUrl);
$reportTypes = array(
'keyword-position' => $this->spTextTools["Keyword Position Summary"],
'website-stats' => $spTextHome["Website Statistics"],
'website-search-reports' => $this->spTextTools['Website Search Summary'],
'sitemap-reports' => $this->spTextTools['Sitemap Reports Summary'],
'keyword-search-reports' => $this->spTextTools['Keyword Search Summary'],
'social-media-reports' => $this->spTextTools['Social Media Report Summary'],
'analytics-reports' => $this->spTextTools['Website Analytics Summary'],
'review-reports' => $this->spTextTools['Review Report Summary'],
);
$this->set('reportTypes', $reportTypes);
$urlarg .= "&report_type=".$searchInfo['report_type'];
if (!empty ($searchInfo['from_time'])) {
$fromTime = strtotime($searchInfo['from_time'] . ' 00:00:00');
} else {
$fromTime = mktime(0, 0, 0, date('m'), date('d') - 1, date('Y'));
}
if (!empty ($searchInfo['to_time'])) {
$toTime = strtotime($searchInfo['to_time'] . ' 00:00:00');
} else {
$toTime = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
}
$fromTimeShort = date('Y-m-d', $fromTime);
$this->set('fromTime', $fromTimeShort);
$toTimeShort = date('Y-m-d', $toTime);
$this->set('toTime', $toTimeShort);
$urlarg .= "&from_time=$fromTimeShort&to_time=$toTimeShort&search_name=" . $searchInfo['search_name'];
$seSearchUserId = isAdmin() ? "" : $userId;
$this->seLIst = $keywordController->getUserKeywordSearchEngineList($seSearchUserId);
$this->set('seList', $this->seLIst);
$this->set('isAdmin', $isAdmin);
$this->set('urlarg', $urlarg);
$scriptPath = SP_WEBPATH."/archive.php?website_id=$websiteId";
$scriptPath .= "&from_time=$fromTimeShort&to_time=$toTimeShort&search_name=" . $searchInfo['search_name'];
# keyword position report section
if (empty($searchInfo['report_type']) || ($searchInfo['report_type'] == 'keyword-position')) {
// to find order col
if (!empty($searchInfo['order_col'])) {
$orderCol = $searchInfo['order_col'];
$orderVal = getOrderByVal($searchInfo['order_val']);
} else {
$orderCol = $this->seLIst[array_keys($this->seLIst)[0]]['id'];
$orderVal = 'ASC';
}
$this->set('orderCol', $orderCol);
$this->set('orderVal', $orderVal);
$scriptPath .= "&report_type=keyword-position&order_col=$orderCol&order_val=$orderVal";
$conditions = " and w.status=1 and k.status=1";
$conditions .= isAdmin() ? "" : $websiteCtrler->getWebsiteUserAccessCondition($userId);
$conditions .= !empty($websiteId) ? " and w.id=$websiteId" : "";
$conditions .= !empty($searchInfo['search_name']) ? " and k.name like '%".addslashes($searchInfo['search_name'])."%'" : "";
$subSql = "select [col] from keywords k,searchresults r, websites w
where k.id=r.keyword_id and k.website_id=w.id $conditions
and r.searchengine_id=".intval($orderCol)." and r.result_date='" . addslashes($toTimeShort) . "'
group by k.id";
$unionOrderCol = ($orderCol == "keyword") ? "name" : "rank";
$sql = "(". str_replace("[col]", "k.id,k.name,min(rank) rank,w.name website,w.url weburl", $subSql) .")
UNION
(select k.id,k.name,1000,w.name website,w.url weburl
from keywords k, websites w
where w.id=k.website_id $conditions and k.id not in
(". str_replace("[col]", "distinct(k.id)", $subSql) ."))
order by $unionOrderCol $orderVal";
if ($unionOrderCol != 'name') $sql .= ", name";
// pagination setup, if not from cron job email send function, pdf and export action
if (!in_array($searchInfo['doc_type'], array("pdf", "export")) && !$cronUserId) {
$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('keywordPagingDiv', $pagingDiv);
$this->set('pageNo', $searchInfo['pageno']);
$sql .= " limit ".$this->paging->start .",". $this->paging->per_page;
}
# set keywords list
$list = $this->db->select($sql);
$indexList = array();
foreach($list as $keywordInfo){
$positionInfo = $this->__getKeywordSearchReport($keywordInfo['id'], $fromTime, $toTime, true);
// check whether the sorting search engine is there
$indexList[$keywordInfo['id']] = empty($positionInfo[$orderCol][$toTimeShort]) ? 10000 : $positionInfo[$orderCol][$toTimeShort];
$keywordInfo['position_info'] = $positionInfo;
$keywordList[$keywordInfo['id']] = $keywordInfo;
}
// sort array according the value
if ($orderCol != 'keyword') {
if ($orderVal == 'DESC') {
arsort($indexList);
} else {
asort($indexList);
}
}
$this->set('indexList', $indexList);
if ($exportVersion) {
$spText = $_SESSION['text'];
$reportHeading = $this->spTextTools['Keyword Position Summary']."($fromTimeShort - $toTimeShort)";
$exportContent .= createExportContent( array('', $reportHeading, ''));
$exportContent .= createExportContent( array());
$headList = array($spText['common']['Website'], $spText['common']['Keyword']);
$pTxt = str_replace("-", "/", substr($fromTimeShort, -5));
$cTxt = str_replace("-", "/", substr($toTimeShort, -5));
foreach ($this->seLIst as $seInfo) {
$domainTxt = str_replace("www.", "", $seInfo['domain']);
$headList[] = $domainTxt . "($cTxt)";
$headList[] = $domainTxt . "($pTxt)";
$headList[] = $domainTxt . "(+/-)";
}
$exportContent .= createExportContent( $headList);
foreach($indexList as $keywordId => $rankValue){
$listInfo = $keywordList[$keywordId];
$positionInfo = $listInfo['position_info'];
$valueList = array($listInfo['weburl'], $listInfo['name']);
foreach ($this->seLIst as $index => $seInfo){
$rankInfo = $positionInfo[$seInfo['id']];
$prevRank = isset($rankInfo[$fromTimeShort]) ? $rankInfo[$fromTimeShort] : "";
$currRank = isset($rankInfo[$toTimeShort]) ? $rankInfo[$toTimeShort] : "";
$rankDiff = "";
// if both ranks are existing
if ($prevRank != '' && $currRank != '') {
$rankDiff = $prevRank - $currRank;
}
$valueList[] = $currRank;
$valueList[] = $prevRank;
$valueList[] = $rankDiff;
}
$exportContent .= createExportContent( $valueList);
}
} else {
$this->set('list', $keywordList);
$this->set('keywordPos', true);
}
}
# website report section
if (empty($searchInfo['report_type']) || ($searchInfo['report_type'] == 'website-stats')) {
// pagination setup
if (!in_array($searchInfo['doc_type'], array('export', 'pdf')) && !$cronUserId) {
$scriptPath .= "&report_type=website-stats";
$info['pageno'] = intval($info['pageno']);
$sql = "select * from websites w where w.status=1";
$sql .= isAdmin() ? "" : $websiteCtrler->getWebsiteUserAccessCondition($userId);
$sql .= !empty($websiteId) ? " and w.id=$websiteId" : "";
// search for user name
if (!empty($searchInfo['search_name'])) {
$sql .= " and (w.name like '%".addslashes($searchInfo['search_name'])."%'
or w.url like '%".addslashes($searchInfo['search_name'])."%')";
}
$sql .= " order by w.name";
$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('websitePagingDiv', $pagingDiv);
$sql .= " limit ".$this->paging->start .",". $this->paging->per_page;
$this->set('pageNo', $searchInfo['pageno']);
$websiteList = $this->db->select($sql);
}
include_once(SP_CTRLPATH."/saturationchecker.ctrl.php");
include_once(SP_CTRLPATH."/rank.ctrl.php");
include_once(SP_CTRLPATH."/backlink.ctrl.php");
include_once(SP_CTRLPATH."/directory.ctrl.php");
include_once(SP_CTRLPATH."/pagespeed.ctrl.php");
$rankCtrler = New RankController();
$backlinlCtrler = New BacklinkController();
$saturationCtrler = New SaturationCheckerController();
$dirCtrler = New DirectoryController();
$pageSpeedCtrler = New PageSpeedController();
$spTextPS = $this->getLanguageTexts('pagespeed', $_SESSION['lang_code']);
$this->set('spTextPS', $spTextPS);
$websiteRankList = array();
foreach($websiteList as $listInfo){
// if only needs to show onewebsite selected
if (!empty($websiteId) && ($listInfo['id'] != $websiteId)) continue;
# rank reports
$report = $rankCtrler->__getWebsiteRankReport($listInfo['id'], $fromTime, $toTime);
$report = $report[0];
$listInfo['alexarank'] = empty($report['alexa_rank']) ? "-" : $report['alexa_rank']." ".$report['rank_diff_alexa'];
$listInfo['mozrank'] = empty($report['moz_rank']) ? "-" : $report['moz_rank']." ".$report['rank_diff_moz'];
$listInfo['domain_authority'] = empty($report['domain_authority']) ? "-" : $report['domain_authority']." ".$report['rank_diff_domain_authority'];
$listInfo['page_authority'] = empty($report['page_authority']) ? "-" : $report['page_authority']." ".$report['rank_diff_page_authority'];
# back links reports
$report = $backlinlCtrler->__getWebsitebacklinkReport($listInfo['id'], $fromTime, $toTime);
$report = $report[0];
$listInfo['google']['backlinks'] = empty($report['google']) ? "-" : $report['google']." ".$report['rank_diff_google'];
$listInfo['alexa']['backlinks'] = empty($report['alexa']) ? "-" : $report['alexa']." ".$report['rank_diff_alexa'];
$listInfo['msn']['backlinks'] = empty($report['msn']) ? "-" : $report['msn']." ".$report['rank_diff_msn'];
# rank reports
$report = $saturationCtrler->__getWebsiteSaturationReport($listInfo['id'], $fromTime, $toTime);
$report = $report[0];
$listInfo['google']['indexed'] = empty($report['google']) ? "-" : $report['google']." ".$report['rank_diff_google'];
$listInfo['msn']['indexed'] = empty($report['msn']) ? "-" : $report['msn']." ".$report['rank_diff_msn'];
# pagespeed reports
$report = $pageSpeedCtrler->__getWebsitePageSpeedReport($listInfo['id'], $fromTime, $toTime);
$report = $report[0];
$listInfo['desktop_speed_score'] = empty($report['desktop_speed_score']) ? "-" : $report['desktop_speed_score']." ".$report['rank_diff_desktop_speed_score'];
$listInfo['mobile_speed_score'] = empty($report['mobile_speed_score']) ? "-" : $report['mobile_speed_score']." ".$report['rank_diff_mobile_speed_score'];
$listInfo['mobile_usability_score'] = empty($report['mobile_usability_score']) ? "-" : $report['mobile_usability_score']." ".$report['rank_diff_mobile_usability_score'];
$listInfo['dirsub']['total'] = $dirCtrler->__getTotalSubmitInfo($listInfo['id']);
$listInfo['dirsub']['active'] = $dirCtrler->__getTotalSubmitInfo($listInfo['id'], true);
$websiteRankList[] = $listInfo;
}
// if export function called
if ($exportVersion) {
$exportContent .= createExportContent( array());
$exportContent .= createExportContent( array());
$exportContent .= createExportContent( array('', $spTextHome['Website Statistics']."($fromTimeShort - $toTimeShort)", ''));
if ((isAdmin() && !empty($webUserId))) {
$exportContent .= createExportContent( array());
$exportContent .= createExportContent( array());
$userInfo = $userCtrler->__getUserInfo($webUserId);
$exportContent .= createExportContent( array($_SESSION['text']['common']['User'], $userInfo['username']));
}
$exportContent .= createExportContent( array());
$headList = array(
$_SESSION['text']['common']['Website'],
$_SESSION['text']['common']['MOZ Rank'],
$_SESSION['text']['common']['Domain Authority'],
$_SESSION['text']['common']['Page Authority'],
$_SESSION['text']['common']['Alexa Rank'],
'Google '.$spTextHome['Backlinks'],
'alexa '.$spTextHome['Backlinks'],
'Bing '.$spTextHome['Backlinks'],
'Google '.$spTextHome['Indexed'],
'Bing '.$spTextHome['Indexed'],
$spTextPS['Desktop Speed'],
$spTextPS['Mobile Speed'],
$spTextPS['Mobile Usability'],
$_SESSION['text']['common']['Total'].' Submission',
$_SESSION['text']['common']['Active'].' Submission',
);
$exportContent .= createExportContent( $headList);
foreach ($websiteRankList as $websiteInfo) {
$valueList = array(
$websiteInfo['url'],
strip_tags($websiteInfo['mozrank']),
strip_tags($websiteInfo['domain_authority']),
strip_tags($websiteInfo['page_authority']),
strip_tags($websiteInfo['alexarank']),
strip_tags($websiteInfo['google']['backlinks']),
strip_tags($websiteInfo['alexa']['backlinks']),
strip_tags($websiteInfo['msn']['backlinks']),
strip_tags($websiteInfo['google']['indexed']),
strip_tags($websiteInfo['msn']['indexed']),
strip_tags($websiteInfo['desktop_speed_score']),
strip_tags($websiteInfo['mobile_speed_score']),
strip_tags($websiteInfo['mobile_usability_score']),
$websiteInfo['dirsub']['total'],
$websiteInfo['dirsub']['active'],
);
$exportContent .= createExportContent( $valueList);
}
}else {
$this->set('websiteRankList', $websiteRankList);
$this->set('websiteStats', true);
}
}
# website search report section
if (empty($searchInfo['report_type']) || in_array($searchInfo['report_type'], array('review-reports', 'social-media-reports', 'website-search-reports', 'keyword-search-reports', 'sitemap-reports', 'analytics-reports')) ) {
include_once(SP_CTRLPATH."/analytics.ctrl.php");
$webMasterCtrler = new WebMasterController();
$socialMediaCtrler = New SocialMediaController();
$reviewCtrler = New ReviewManagerController();
$webMasterCtrler->set('spTextTools', $this->spTextTools);
$webMasterCtrler->spTextTools = $this->spTextTools;
$filterList = $searchInfo;
$wmMaxFromTime = strtotime('-3 days');
$wmMaxEndTime = strtotime('-2 days');
$filterList['from_time'] = $fromTime > $wmMaxFromTime ? $wmMaxFromTime : $fromTime;
$filterList['to_time'] = $toTime > $wmMaxEndTime ? $wmMaxEndTime : $toTime;
$filterList['from_time'] = date('Y-m-d', $filterList['from_time']);
$filterList['to_time'] = date('Y-m-d', $filterList['to_time']);
$filterList['website_id'] = $websiteId;
// if website search reports
if (empty($searchInfo['report_type']) || ($searchInfo['report_type'] == 'website-search-reports')) {
$websiteSearchReport = $webMasterCtrler->viewWebsiteSearchSummary($filterList, true, $cronUserId);
}
// if keyword search reports
if (empty($searchInfo['report_type']) || ($searchInfo['report_type'] == 'keyword-search-reports')) {
$keywordSearchReport = $webMasterCtrler->viewKeywordSearchSummary($filterList, true, $cronUserId);
}
// if sitemap reports
if (empty($searchInfo['report_type']) || ($searchInfo['report_type'] == 'sitemap-reports')) {
$websiteCtrler->set('spTextPanel', $this->spTextPanel);
$sitemapReport = $websiteCtrler->listSitemap($filterList, true, $cronUserId);
}
// if website analytics reports
if (empty($searchInfo['report_type']) || ($searchInfo['report_type'] == 'analytics-reports')) {
$analyticsCtrler = new AnalyticsController();
$analyticsCtrler->set('spTextTools', $this->spTextTools);
$analyticsCtrler->spTextTools = $this->spTextTools;
$wmMaxFromTime = strtotime('-2 days');
$wmMaxEndTime = strtotime('-1 days');
$filterList['from_time'] = $fromTime > $wmMaxFromTime ? $wmMaxFromTime : $fromTime;
$filterList['to_time'] = $toTime > $wmMaxEndTime ? $wmMaxEndTime : $toTime;
$filterList['from_time'] = date('Y-m-d', $filterList['from_time']);
$filterList['to_time'] = date('Y-m-d', $filterList['to_time']);
$analyticsReport = $analyticsCtrler->viewAnalyticsSummary($filterList, true, $cronUserId);
}
// if social media reports
if (empty($searchInfo['report_type']) || ($searchInfo['report_type'] == 'social-media-reports')) {
$filterList['from_time'] = $fromTimeShort;
$filterList['to_time'] = $toTimeShort;
$socialMediaCtrler->set('spTextTools', $this->spTextTools);
$socialMediaCtrler->set('spTextPanel', $this->spTextPanel);
$socialMediaCtrler->spTextTools = $this->spTextTools;
$socialMediaReport = $socialMediaCtrler->viewReportSummary($filterList, true, $cronUserId);
}
// if social media reports
if (empty($searchInfo['report_type']) || ($searchInfo['report_type'] == 'review-reports')) {
$filterList['from_time'] = $fromTimeShort;
$filterList['to_time'] = $toTimeShort;
$reviewCtrler->set('spTextTools', $this->spTextTools);
$reviewCtrler->set('spTextPanel', $this->spTextPanel);
$reviewCtrler->spTextTools = $this->spTextTools;
$reviewReport = $reviewCtrler->viewReportSummary($filterList, true, $cronUserId);
}
if ($exportVersion) {
$exportContent .= $websiteSearchReport;
$exportContent .= $keywordSearchReport;
$exportContent .= $socialMediaReport;
} else {
$this->set('websiteSearchReport', $websiteSearchReport);
$this->set('keywordSearchReport', $keywordSearchReport);
$this->set('sitemapReport', $sitemapReport);
$this->set('socialMediaReport', $socialMediaReport);
$this->set('reviewReport', $reviewReport);
$this->set('analyticsReport', $analyticsReport);
}
}
if ($exportVersion) {
exportToCsv('archived_report', $exportContent);
} else {
$this->set('searchInfo', $searchInfo);
// if execution through cron job then just return the content to send through mail
if (!empty($cronUserId)) {
$this->set('cronUserId', $cronUserId);
return $this->getViewContent('report/archive');
} else {
// if pdf export
if ($searchInfo['doc_type'] == "pdf") {
exportToPdf($this->getViewContent('report/archive'), "overall_summary_$fromTimeShort-$toTimeShort.pdf");
} else {
$this->render('report/archive');
}
}
}
}
# func to get report settings data
function getUserReportSettings($userId) {
$userId = intval($userId);
$sql = "select * from reports_settings where user_id=$userId";
$repSetInfo = $this->db->select($sql, true);
// if report settings are empty add default interval
if (empty($repSetInfo)) {
$repSetInfo['user_id'] = $userId;
$repSetInfo['report_interval'] = SP_SYSTEM_REPORT_INTERVAL;
$repSetInfo['email_notification'] = SP_REPORT_EMAIL_NOTIFICATION;
$lastGeneratedDay = (SP_SYSTEM_REPORT_INTERVAL == 30) ? 1 : (date('d') - SP_SYSTEM_REPORT_INTERVAL);
$repSetInfo['last_generated'] = mktime(0, 0, 0, date('m'), $lastGeneratedDay, date('Y'));
$this->createUserReportSettings($repSetInfo);
$repSetInfo['id'] = $this->db->getMaxId('reports_settings');
}
return $repSetInfo;
}
# func to insert report settings
function createUserReportSettings($setInfo) {
$sql = "Insert into reports_settings(user_id,report_interval,email_notification,last_generated)
values({$setInfo['user_id']},{$setInfo['report_interval']},{$setInfo['email_notification']},'{$setInfo['last_generated']}')";
$this->db->query($sql);
}
# func to update user report generate interval
function updateUserReportSetting($userId, $col, $val) {
$sql = "Update reports_settings set $col='".addslashes($val)."' where user_id=$userId";
$this->db->query($sql);
}
# func to update user report generation logs
function updateUserReportGenerationLogs($userId, $generateDate) {
$dataList = array(
'user_id|int' => $userId,
'report_date' => $generateDate,
);
$this->dbHelper->insertRow("user_report_logs", $dataList);
}
# func to schedule reports
function showReportsScheduler($success=false, $postInfo='') {
$userId = isLoggedIn();
if (isAdmin()) {
$userId = empty($postInfo['user_id']) ? $userId : $postInfo['user_id'];
}
$repSetInfo = $this->getUserReportSettings($userId);
$this->set('repSetInfo', $repSetInfo);
$reportInterval = !isset($postInfo['report_interval']) ? $repSetInfo['report_interval'] : $postInfo['report_interval'];
$this->set('reportInterval', $reportInterval);
if ($reportInterval == 30) {
$nextGenTime = mktime(0, 0, 0, date('m') + 1, 1, date('Y'));
} else {
$nextGenTime = $repSetInfo['last_generated'] + ( $repSetInfo['report_interval'] * 86400);
}
$this->set('nextReportTime', date('d M Y', $nextGenTime));
$scheduleList = array(
1 => $_SESSION['text']['label']['Daily'],
2 => $this->spTextReport['2 Days'],
7 => $_SESSION['text']['label']['Weekly'],
30 => $_SESSION['text']['label']['Monthly'],
);
$userCtrler = New UserController();
$userList = $userCtrler->__getAllUsers();
$this->set('userList', $userList);
$this->set('success', $success);
$this->set('scheduleList', $scheduleList);
$this->render('report/reportscheduler');
}
# func to save Report Schedule
function saveReportSchedule($info) {
$userId = isAdmin() ? $info['user_id'] : isLoggedIn();
$repSetInfo = $this->getUserReportSettings($userId);
$this->updateUserReportSetting($userId, 'report_interval', $info['report_interval']);
$this->updateUserReportSetting($userId, 'email_notification', $info['email_notification']);
$this->showReportsScheduler(true, $info);
}
# func to check whether report can be generated for user
function isGenerateReportsForUser($userId) {
$genReport = false;
$repSetInfo = $this->getUserReportSettings($userId);
if ($repSetInfo['report_interval'] > 0) {
$lastGeneratedTime = $repSetInfo['last_generated'];
$currentDateTime = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
if ($lastGeneratedTime < $currentDateTime) {
// if monthly interval generate on first of each month
if ($repSetInfo['report_interval'] == 30) {
$genReport = (date('d') == 1) ? true : false;
} else {
$nextGenTime = $lastGeneratedTime + ( $repSetInfo['report_interval'] * 86400);
$genReport = (mktime() > $nextGenTime) ? true : false;
}
}
}
$repSetInfo['generate_report'] = $genReport;
return $repSetInfo;
}
# function to sent Email Notification For ReportGeneration
function sentEmailNotificationForReportGen($userInfo, $fromTime, $toTime) {
$fromTime = !empty($fromTime) ? $fromTime : date('Y-m-d', strtotime('-1 days'));
$searchInfo = array(
'website_id' => 0,
'report_type' => '',
'from_time' => date('Y-m-d', $fromTime),
'to_time' => date('Y-m-d', $toTime),
'doc_type' => 'print',
);
$this->spTextPanel = $this->getLanguageTexts('panel', $_SESSION['lang_code']);
$reportContent = $this->showOverallReportSummary($searchInfo, $userInfo['id']);
$this->set('reportContent', $reportContent);
$reportTexts = $this->getLanguageTexts('reports', $userInfo['lang_code']);
$this->set('reportTexts', $reportTexts);
$this->set('commonTexts', $this->getLanguageTexts('common', $userInfo['lang_code']));
$this->set('loginTexts', $this->getLanguageTexts('login', $userInfo['lang_code']));
$name = $userInfo['first_name'].' '.$userInfo['last_name'];
$this->set('name', $name);
$subject = $reportTexts['report_email_subject'];
$content = $this->getViewContent('email/emailnotificationreportgen');
$userController = New UserController();
$adminInfo = $userController->__getAdminInfo();
$adminName = $adminInfo['first_name']."-".$adminInfo['last_name'];
$this->set('adminName', $adminName);
if (!sendMail($adminInfo['email'], $adminName, $userInfo['email'], $subject, $content)) {
echo 'An internal error occured while sending mail!';
} else {
echo "Reports send successfully to ".$userInfo['email']."\n";
}
}
# func to show user report generation logs
function showReportGenerationLogs($searchInfo = '') {
$userCtrler = New UserController();
$fromTimeDate = !empty ($searchInfo['from_time']) ? addslashes($searchInfo['from_time']) : date('Y-m-d', strtotime('-1 days'));
$toTimeDate = !empty ($searchInfo['to_time']) ? addslashes($searchInfo['to_time']) : date('Y-m-d');
$this->set('fromTime', $fromTimeDate);
$this->set('toTime', $toTimeDate);
$userList = $userCtrler->__getAllUsersHavingWebsite();
$this->set('userList', $userList);
$userTypeCtrler = new UserTypeController();
$typeList = $userTypeCtrler->__getAllUserTypeList();
foreach ($typeList as $info) $userTypeList[$info['id']] = $info;
$this->set('userTypeList', $userTypeList);
if (!empty($searchInfo['user_id'])) {
$logUserList = array($userCtrler->__getUserInfo($searchInfo['user_id']));
$this->set('userId', intval($searchInfo['user_id']));
} else {
$logUserList = $userList;
}
$this->set('logUserList', $logUserList);
$whereCond = "report_date >='$fromTimeDate 00:00:00' and report_date<='$toTimeDate 23:59:59'";
$whereCond .= !empty($searchInfo['user_id']) ? " and user_id=" . intval($searchInfo['user_id']) : "";
$whereCond .= " order by report_date desc";
$list = $this->dbHelper->getAllRows("user_report_logs", $whereCond, "id,user_id,date(report_date) as report_date");
// loop through the list
$logList = array();
foreach ($list as $listInfo) {
$logList[$listInfo['report_date']][$listInfo['user_id']] = 1;
}
$this->set('logDateList', getDateRange($fromTimeDate, $toTimeDate));
$this->set('logList', $logList);
$this->set('spTextUser', $this->getLanguageTexts('user', $_SESSION['lang_code']));
$this->render('report/report_generation_logs');
}
}
?>