Rev 103 | 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 pagespeed api controller functionsclass PageSpeedController extends Controller{var $colList = array('desktop_speed_score' => 'desktop_speed_score','mobile_speed_score' => 'mobile_speed_score',);// function to get moz rankfunction __getPageSpeedInfo ($url, $params = array(), $apiKey = '', $returnLog = false) {include_once(SP_LIBPATH . "/google-api-php-client/vendor/autoload.php");$pageSpeedInfo = array();$crawlInfo = array();$apiKey = !empty($apiKey) ? $apiKey : SP_GOOGLE_API_KEY;// if empty no need to crawlif (!empty($apiKey)) {$client = new Google_Client();$client->setApplicationName("SP_CHECKER");$client->setDeveloperKey($apiKey);try {// split and select main language if sub language selectedif (stristr($params['locale'], '-')) {list($params['locale'], $tmpVar) = explode('-', $params['locale']);}$service = new Google_Service_Pagespeedonline($client);$pageSpeedInfo = $service->pagespeedapi->runpagespeed($url, $params);$pageSpeedInfo = self::formatPageSpeedData($pageSpeedInfo);} catch (Exception $e) {$err = $e->getMessage();$errData = json_decode($err);$crawlInfo['crawl_status'] = 0;$crawlInfo['log_message'] = $_SESSION['text']['label']['Fail'];$crawlInfo['log_message'] .= !empty($errData->error->errors[0]->reason) ? ": " . $errData->error->errors[0]->reason . " :: " . $errData->error->errors[0]->message : "";}} else {$crawlInfo['crawl_status'] = 0;$crawlInfo['log_message'] = "Google api key not set.";$alertCtler = new AlertController();$alertInfo = array('alert_subject' => "Click here to enter Google API key",'alert_message' => "Error: Google API key not found",'alert_url' => SP_WEBPATH ."/admin-panel.php?sec=google-settings",'alert_type' => "danger",'alert_category' => "reports",);$alertCtler->createAlert($alertInfo, false, true);}return $returnLog ? array($pageSpeedInfo, $crawlInfo) : $pageSpeedInfo;}public static function formatPageSpeedData($pageSpeedInfo) {$pageSpeedData = array('speed_score' => !empty($pageSpeedInfo['lighthouseResult']['categories']['performance']['score']) ? $pageSpeedInfo['lighthouseResult']['categories']['performance']['score'] * 100 : 0,'usability_score' => !empty($pageSpeedInfo['lighthouseResult']['categories']['performance']['score']) ? $pageSpeedInfo['lighthouseResult']['categories']['performance']['score'] * 100 : 0,);$detailsInfo = array();// commented for API v5 version/*foreach ($pageSpeedInfo['formattedResults']['ruleResults'] as $ruleSet => $ruleSetInfo) {$detailsInfo[$ruleSet] = array('localizedRuleName' => $ruleSetInfo['localizedRuleName'],'ruleImpact' => $ruleSetInfo['ruleImpact'],'impactGroup' => implode(',', $ruleSetInfo['groups']),'summary' => self::formatSummaryText($ruleSetInfo['summary']),'urlBlocks' => self::formatUrlBlock($ruleSetInfo['urlBlocks']),);}*/$pageSpeedData['details'] = $detailsInfo;return $pageSpeedData;}public static function formatUrlBlock($urlBlockList) {$urlList = array();foreach ($urlBlockList as $urlBlockInfo) {$info['header'] = self::formatSummaryText($urlBlockInfo['header']);$info['urls'] = array();foreach ($urlBlockInfo['urls'] as $urlInfo) {$info['urls'][] = self::formatSummaryText($urlInfo['result']);}$urlList[] = $info;}return $urlList;}public static function formatSummaryText($summaryInfo) {$formatTxt = $summaryInfo['format'];// loop through arg information listforeach ($summaryInfo['args'] as $argInfo) {switch ($argInfo['type']) {case "HYPERLINK":$formatTxt = str_replace('{{BEGIN_LINK}}', "<a href='{$argInfo['value']}' target='_blank'>", $formatTxt);$formatTxt = str_replace('{{END_LINK}}', "</a>", $formatTxt);break;case "URL":$formatTxt = str_replace('{{' . $argInfo['key'] . '}}', "<a>{$argInfo['value']}</a>" , $formatTxt);break;default:$formatTxt = str_replace('{{' . $argInfo['key'] . '}}', $argInfo['value'], $formatTxt);break;}}return $formatTxt;}// function to show pagespeed checkerfunction showQuickChecker() {$this->render('pagespeed/showquickchecker');}function findPageSpeedInfo($searchInfo) {// check google api setupSettingsController::showCheckCategorySettings('google', true);$urlList = explode("\n", $searchInfo['website_urls']);$list = array();$reportList = array();$i = 1;foreach ($urlList as $url) {$url = sanitizeData($url);if(!preg_match('/\w+/', $url)) continue;if ($i++ > 5) break;$url = addHttpToUrl($url);$list[] = str_replace(array("\n", "\r", "\r\n", "\n\r"), "", trim($url));}// loop through the listforeach ($list as $url) {$reportList[$url] = array();$params = array('screenshot' => false, 'strategy' => 'desktop', 'locale' => $_SESSION['lang_code']);$reportList[$url]['desktop'] = $this->__getPageSpeedInfo($url, $params);$params = array('screenshot' => false, 'strategy' => 'mobile', 'locale' => $_SESSION['lang_code']);$reportList[$url]['mobile'] = $this->__getPageSpeedInfo($url, $params);}$this->set('reportList', $reportList);$this->set('list', $list);$this->render('pagespeed/findpagespeedinfo');}# func to show reportsfunction showReports($searchInfo = '') {$userId = isLoggedIn();if (!empty ($searchInfo['from_time'])) {$fromTime = $searchInfo['from_time'];} else {$fromTime = date('Y-m-d', strtotime('-30 days'));}if (!empty ($searchInfo['to_time'])) {$toTime = $searchInfo['to_time'];} else {$toTime = date('Y-m-d');}$fromTime = addslashes($fromTime);$toTime = addslashes($toTime);$this->set('fromTime', $fromTime);$this->set('toTime', $toTime);$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);$conditions = empty ($websiteId) ? "" : " and s.website_id=$websiteId";$sql = "select s.* ,w.name from pagespeedresults s,websites w where s.website_id=w.idand result_date >= '$fromTime' and result_date <= '$toTime' $conditions order by result_date";$reportList = $this->db->select($sql);$i = 0;$colList = $this->colList;foreach ($colList as $col => $dbCol) {$prevRank[$col] = 0;}# loop throgh rankforeach ($reportList as $key => $repInfo) {foreach ($colList as $col => $dbCol) {$rankDiff[$col] = '';}foreach ($colList as $col => $dbCol) {if ($i > 0) {$rankDiff[$col] = ($prevRank[$col] - $repInfo[$dbCol]) * -1;if ($rankDiff[$col] > 0) {$rankDiff[$col] = "<font class='green'>($rankDiff[$col])</font>";}elseif ($rankDiff[$col] < 0) {$rankDiff[$col] = "<font class='red'>($rankDiff[$col])</font>";}}$reportList[$key]['rank_diff_'.$col] = empty ($rankDiff[$col]) ? '' : $rankDiff[$col];}foreach ($colList as $col => $dbCol) {$prevRank[$col] = $repInfo[$dbCol];}$i++;}$detailsInfo = $this->dbHelper->getRow("pagespeeddetails", "website_id=$websiteId");$this->set('detailsInfo', $detailsInfo);$this->set('fromPopUp', $searchInfo['fromPopUp']);$this->set('list', array_reverse($reportList, true));$this->render('pagespeed/pagespeedreport');}# func to get backlink report for a websitefunction __getWebsitePageSpeedReport($websiteId, $fromTime, $toTime) {$fromTimeLabel = date('Y-m-d', $fromTime);$toTimeLabel = date('Y-m-d', $toTime);$conditions = empty ($websiteId) ? "" : " and s.website_id=$websiteId";$sql = "select s.* ,w.name from pagespeedresults s,websites wwhere s.website_id=w.id" . $conditions . "and (result_date='$fromTimeLabel' or result_date='$toTimeLabel')order by result_date DESC Limit 0,2";$reportList = $this->db->select($sql);$reportList = array_reverse($reportList);$i = 0;$colList = $this->colList;foreach ($colList as $col => $dbCol) {$prevRank[$col] = 0;}# loop throgh rankforeach ($reportList as $key => $repInfo) {foreach ($colList as $col => $dbCol) {$rankDiff[$col] = '';}foreach ($colList as $col => $dbCol) {if ($i > 0) {$rankDiff[$col] = ($prevRank[$col] - $repInfo[$dbCol]) * -1;if ($rankDiff[$col] > 0) {$rankDiff[$col] = "<font class='green'>($rankDiff[$col])</font>";}elseif ($rankDiff[$col] < 0) {$rankDiff[$col] = "<font class='red'>($rankDiff[$col])</font>";}}$reportList[$key]['rank_diff_'.$col] = empty ($rankDiff[$col]) ? '' : $rankDiff[$col];}foreach ($colList as $col => $dbCol) {$prevRank[$col] = $repInfo[$dbCol];}$i++;}$reportList = array_reverse(array_slice($reportList, count($reportList) - 1));return $reportList;}# func to show graphical reportsfunction 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->__getAllWebsites($userId, true);$this->set('websiteList', $websiteList);$websiteId = empty ($searchInfo['website_id']) ? $websiteList[0]['id'] : intval($searchInfo['website_id']);$this->set('websiteId', $websiteId);$conditions = empty ($websiteId) ? "" : " and s.website_id=$websiteId";$sql = "select s.* ,w.name from pagespeedresults s,websites w where s.website_id=w.idand result_date >= '$fromTime' and result_date <= '$toTime' $conditions order by result_date";$reportList = $this->db->select($sql);// if reports not empty$colList = $this->colList;if (!empty($reportList)) {$colLableList = array($this->spTextPS['Desktop Speed'], $this->spTextPS['Mobile Speed']);$dataArr = "['Date', '" . implode("', '", $colLableList) . "']";// loop through data listforeach ($reportList as $dataInfo) {$valStr = "";foreach ($colList as $seId => $seVal) {$valStr .= ", ";$valStr .= !empty($dataInfo[$seId]) ? $dataInfo[$seId] : 0;}$dataArr .= ", ['{$dataInfo['result_date']}' $valStr]";}$this->set('dataArr', $dataArr);$this->set('graphTitle', $this->spTextTools['Backlinks Reports']);$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('pagespeed/graphicalreport');}# func to show genearte reports interfacefunction showGenerateReports($searchInfo = '') {// check google api setupSettingsController::showCheckCategorySettings('google', true);$userId = isLoggedIn();$websiteController = New WebsiteController();$websiteList = $websiteController->__getAllWebsites($userId, true);$this->set('websiteList', $websiteList);$this->render('pagespeed/generatereport');}# func to generate reportsfunction generateReports( $searchInfo='' ) {$userId = isLoggedIn();$websiteId = empty ($searchInfo['website_id']) ? '' : intval($searchInfo['website_id']);$sql = "select id,url from websites where status=1";if(!empty($userId) && !isAdmin()) $sql .= " and user_id=$userId";if(!empty($websiteId)) $sql .= " and id=$websiteId";$sql .= " order by name";$websiteList = $this->db->select($sql);if(count($websiteList) <= 0){echo "<p class='note'>".$_SESSION['text']['common']['nowebsites']."!</p>";exit;}# loop through each websitesforeach ( $websiteList as $websiteInfo ) {$websiteUrl = addHttpToUrl($websiteInfo['url']);$params = array('screenshot' => false, 'strategy' => 'desktop', 'locale' => $_SESSION['lang_code']);$websiteInfo['desktop'] = $this->__getPageSpeedInfo($websiteUrl, $params);$params = array('screenshot' => false, 'strategy' => 'mobile', 'locale' => $_SESSION['lang_code']);$websiteInfo['mobile'] = $this->__getPageSpeedInfo($websiteUrl, $params);$this->savePageSpeedResults($websiteInfo, true);echo "<p class='note notesuccess'>".$this->spTextPS['Saved page speed results of']." <b>$websiteUrl</b>.....</p>";}}# function to save rank detailsfunction savePageSpeedResults($matchInfo, $remove=false) {$resultDate = date('Y-m-d');if($remove){$sql = "delete from pagespeedresults where website_id={$matchInfo['id']} and result_date='$resultDate'";$this->db->query($sql);$sql = "delete from pagespeeddetails where website_id={$matchInfo['id']}";$this->db->query($sql);}$matchInfo['id'] = intval($matchInfo['id']);$matchInfo['desktop']['speed_score'] = intval($matchInfo['desktop']['speed_score']);$matchInfo['mobile']['speed_score'] = intval($matchInfo['mobile']['speed_score']);$matchInfo['mobile']['usability_score'] = intval($matchInfo['mobile']['usability_score']);$sql = "insert into pagespeedresults(website_id, desktop_speed_score, mobile_speed_score, mobile_usability_score, result_date)values({$matchInfo['id']},{$matchInfo['desktop']['speed_score']},{$matchInfo['mobile']['speed_score']},{$matchInfo['mobile']['usability_score']}, '$resultDate')";$this->db->query($sql);$sql = "insert into pagespeeddetails(website_id, desktop_score_details, mobile_score_details, result_date)values({$matchInfo['id']},'" . addslashes(serialize($matchInfo['desktop']['details'])) . "','" . addslashes(serialize($matchInfo['mobile']['details'])) . "', '$resultDate')";$this->db->query($sql);}# function check whether reports already savedfunction isReportsExists($websiteId, $time) {$resultDate = date('Y-m-d', $time);$sql = "select website_id from pagespeedresults where website_id=$websiteId and result_date='$resultDate'";$info = $this->db->select($sql, true);return empty($info['website_id']) ? false : true;}}?>