%PDF- %PDF-
| Direktori : /home1/lightco1/www/ilfanale.com.au/administrator/components/com_jmap/models/ |
| Current File : //home1/lightco1/www/ilfanale.com.au/administrator/components/com_jmap/models/google.php |
<?php
// namespace administrator\components\com_jmap\models;
/**
*
* @package JMAP::GOOGLE::administrator::components::com_jmap
* @subpackage models
* @author Joomla! Extensions Store
* @copyright (C) 2014 - Joomla! Extensions Store
* @license GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html
*/
defined ( '_JEXEC' ) or die ( 'Restricted access' );
/**
* Google model responsibilities for access Google Analytics and Webmasters Tools API
*
* @package JMAP::SOURCES::administrator::components::com_jmap
* @subpackage models
* @since 3.1
*/
interface IJMapModelGoogle {
/**
* Submit a sitemap link using the GWT API
*
* @access public
* @param string $sitemapUri
* @return boolean
*/
public function submitSitemap($sitemapUri);
/**
* Delete a sitemap link using the GWT API
*
* @access public
* @param string $sitemapUri
* @return boolean
*/
public function deleteSitemap($sitemapUri);
/**
* Mark as fixed a certain category of crawl errors
*
* @access public
* @param string $crawlErrorsCategory
* @return boolean
*/
public function markAsFixed($crawlErrorsCategory);
/**
* Get data method for webmasters tools stats
*
* @access public
* @return mixed Returns a data string if success or boolean if exceptions are trigged
*/
public function getDataWebmasters();
/**
* Return the google token
*
* @access public
* @return string
*/
public function getToken();
}
/**
* Sources model concrete implementation <<testable_behavior>>
*
* @package JMAP::GOOGLE::administrator::components::com_jmap
* @subpackage models
* @since 3.1
*/
class JMapModelGoogle extends JMapModel implements IJMapModelGoogle {
/**
* Google_Client object
*
* @access private
* @var Google_Client
*/
private $client;
/**
* Current profile found for Google Analytics
*
* @access private
* @var string
*/
private $currentProfile;
/**
* Track the API connection mode, built in JSitemap Google App or user own
*
* @access private
* @var string
*/
private $hasOwnCredentials;
/**
* Purify and normalize domain protocol
*
* @access private
* @return string
*/
private function purifyDomain($domain) {
return str_replace ( array (
"https://",
"http://",
" "
), "", rtrim ( $domain, "/" ) );
}
/**
* Purify and normalize domain uri for webmasters tools stats
*
* @access private
* @return string
*/
private function purifyWebmastersDomain($domain) {
return str_replace ( array (
" "
), "", rtrim ( $domain, "/" ) );
}
/**
* Manage the authentication form and action
*
* @param Object $params
* @access private
* @return mixed A string when auth is needed, null if performing an auth
*/
private function authentication($params) {
$this->client = new Google_Client ();
$this->client->setAccessType ( 'offline' );
$this->client->setScopes ( array( 'https://www.googleapis.com/auth/analytics.readonly', 'https://www.googleapis.com/auth/webmasters' ));
$this->client->setApplicationName ( 'JSitemap Professional' );
$this->client->setRedirectUri ( 'urn:ietf:wg:oauth:2.0:oob' );
$this->hasOwnCredentials = false;
if ($params->get ( 'ga_api_key' ) and $params->get ( 'ga_client_id' ) and $params->get ( 'ga_client_secret' )) {
$this->client->setClientId ( $params->get ( 'ga_client_id' ) );
$this->client->setClientSecret ( $params->get ( 'ga_client_secret' ) );
$this->client->setDeveloperKey ( $params->get ( 'ga_api_key' ) ); // API key
$this->hasOwnCredentials = true;
} else {
$this->client->setClientId ( '1229958023-v6o02cp8hj71rijdpc110efvsmjd9f9e.apps.googleusercontent.com' );
$this->client->setClientSecret ( 'mkicQ8LsbYyMes2DwF6DhQ-n' );
$this->client->setDeveloperKey ( 'AIzaSyBOXBjtrtYPTQmpupLwY5AhKmazQqVQPzw' );
}
if ($this->getToken ()) { // extract token from session and configure client
$token = $this->getToken ();
$this->client->setAccessToken ( $token );
}
if (! $result = $this->client->getAccessToken ()) { // auth call to google
$authUrl = $this->client->createAuthUrl ();
// Trying to authenticate?
if (!$this->app->input->get('ga_dash_authorize')) {
$JText = 'JText';
$htmlSnippet = <<<HTML
<div>
<p class="well">
<span class="label label-primary">
{$JText::_ ( 'COM_JMAP_GOOGLE_STEP1_CODE_DESC' )}
</span>
<a class="btn btn-primary btn-sm hasPopover google" data-content="{$JText::_ ( 'COM_JMAP_GOOGLE_CODE_INSTUCTIONS' )}" href="$authUrl" target="_blank">
{$JText::_ ( 'COM_JMAP_GOOGLE_CODE' )}
</a>
</p>
<p class="well">
<span class="label label-primary">
{$JText::_ ( 'COM_JMAP_GOOGLE_STEP2_ACCESS_CODE_INSERT' )}
</span>
<input type="text" name="ga_dash_code" value="" size="61">
</p>
<p class="well">
<span class="label label-primary">
{$JText::_ ( 'COM_JMAP_GOOGLE_STEP3_AUTHENTICATE' )}
</span>
<input type="submit" class="btn btn-primary btn-sm waiter" name="ga_dash_authorize" value="{$JText::_ ( 'COM_JMAP_GOOGLE_AUTHENTICATE' )}"/>
</p>
</div>
HTML;
return $htmlSnippet;
} else {
// Yes! This is an authentication attempt let's try it
try {
$this->client->authenticate ( $this->app->input->getString('ga_dash_code'));
} catch ( JMapException $e ) {
$this->app->enqueueMessage ( $e->getMessage (), $e->getErrorLevel () );
return '<a class="btn btn-primary" href="index.php?option=com_jmap&task=google.display">' . JText::_ ( 'COM_JMAP_GOBACK' ) . '</a>';
} catch ( Exception $e ) {
$jmapException = new JMapException ( $e->getMessage (), 'error' );
$this->app->enqueueMessage ( $jmapException->getMessage (), $jmapException->getErrorLevel () );
return '<a class="btn btn-primary" href="index.php?option=com_jmap&task=google.display">' . JText::_ ( 'COM_JMAP_GOBACK' ) . '</a>';
}
// Store the Google token in the DB for further login and authentication
$this->storeToken ( $this->client->getAccessToken () );
return null;
}
}
}
/**
* Store the Google token
*
* @access private
* @return boolean
*/
private function storeToken($token) {
$clientID = (int)$this->app->getClientId();
try {
$query = "INSERT IGNORE INTO #__jmap_google (id, token) VALUES ($clientID, '$token');";
$this->_db->setQuery ( $query );
$result = $this->_db->query ();
// Store logged in status in session
$session = JFactory::getSession();
$session->set('jmap_ga_authenticate', true);
} catch ( JMapException $e ) {
$this->app->enqueueMessage ( $e->getMessage (), $e->getErrorLevel () );
$result = false;
} catch ( Exception $e ) {
$jmapException = new JMapException ( $e->getMessage (), 'error' );
$this->app->enqueueMessage ( $jmapException->getMessage (), $jmapException->getErrorLevel () );
$result = false;
}
return $result;
}
/**
* Delete the Google token
*
* @access private
* @return boolean
*/
private function deleteToken() {
$clientID = (int)$this->app->getClientId();
try {
$query = "DELETE FROM #__jmap_google WHERE id = " . $clientID;
$this->_db->setQuery ( $query )->execute();
// Store logged in status in session
$session = JFactory::getSession();
$session->clear('jmap_ga_authenticate');
} catch ( JMapException $e ) {
$this->app->enqueueMessage ( $e->getMessage (), $e->getErrorLevel () );
return false;
} catch ( Exception $e ) {
$jmapException = new JMapException ( $e->getMessage (), 'error' );
$this->app->enqueueMessage ( $jmapException->getMessage (), $jmapException->getErrorLevel () );
return false;
}
return true;
}
/**
* Get visits
*
* @access private
* @return array
*/
private function getVisitsByCountry($service, $projectId, $from, $to, $params) {
$metrics = 'ga:visits';
$dimensions = 'ga:country';
try {
$serial = 'gadash_qr7' . str_replace ( array (
'ga:',
',',
'-',
date ( 'Y' )
), "", $projectId . $from . $to );
$data = $service->data_ga->get ( 'ga:' . $projectId, $from, $to, $metrics, array (
'dimensions' => $dimensions
) );
} catch ( Exception $e ) {
return "<br /> Error: " . $e->getMessage ();
}
if (! $data ['rows']) {
return 0;
}
$ga_dash_data = "";
for($i = 0; $i < $data ['totalResults']; $i ++) {
$ga_dash_data .= "['" . addslashes ( $data ['rows'] [$i] [0] ) . "'," . $data ['rows'] [$i] [1] . "],";
}
return $ga_dash_data;
}
/**
* Get Traffic Sources
*
* @access private
* @return array
*/
private function getTrafficSources($service, $projectId, $from, $to, $params) {
$metrics = 'ga:visits';
$dimensions = 'ga:medium';
try {
$serial = 'gadash_qr8' . str_replace ( array (
'ga:',
',',
'-',
date ( 'Y' )
), "", $projectId . $from . $to );
$data = $service->data_ga->get ( 'ga:' . $projectId, $from, $to, $metrics, array (
'dimensions' => $dimensions
) );
} catch ( Exception $e ) {
return "<br /> Error: " . $e->getMessage ();
}
if (! $data ['rows']) {
return 0;
}
$ga_dash_data = "";
for($i = 0; $i < $data ['totalResults']; $i ++) {
$ga_dash_data .= "['" . addslashes ( str_replace ( "(none)", "direct", $data ['rows'] [$i] [0] ) ) . "'," . $data ['rows'] [$i] [1] . "],";
}
return $ga_dash_data;
}
/**
* Get New vs. Returning
*
* @access private
* @return array
*/
private function getNewReturnVisitors($service, $projectId, $from, $to, $params) {
$metrics = 'ga:visits';
$dimensions = 'ga:visitorType';
try {
$serial = 'gadash_qr9' . str_replace ( array (
'ga:',
',',
'-',
date ( 'Y' )
), "", $projectId . $from . $to );
$data = $service->data_ga->get ( 'ga:' . $projectId, $from, $to, $metrics, array (
'dimensions' => $dimensions
) );
} catch ( Exception $e ) {
return "<br /> Error: " . $e->getMessage ();
}
if (! $data ['rows']) {
return 0;
}
$ga_dash_data = "";
for($i = 0; $i < $data ['totalResults']; $i ++) {
$ga_dash_data .= "['" . addslashes ( $data ['rows'] [$i] [0] ) . "'," . $data ['rows'] [$i] [1] . "],";
}
return $ga_dash_data;
}
/**
* Get Top Pages
*
* @access private
* @return array
*/
private function getTopPages($service, $projectId, $from, $to, $params) {
$metrics = 'ga:pageviews';
$dimensions = 'ga:pageTitle';
try {
$serial = 'gadash_qr4' . str_replace ( array (
'ga:',
',',
'-',
date ( 'Y' )
), "", $projectId . $from . $to );
$data = $service->data_ga->get ( 'ga:' . $projectId, $from, $to, $metrics, array (
'dimensions' => $dimensions,
'sort' => '-ga:pageviews',
'max-results' => '24',
'filters' => 'ga:pagePath!=/'
) );
} catch ( Exception $e ) {
return "<br /> Error: " . $e->getMessage ();
}
if (! $data ['rows']) {
return 0;
}
$ga_dash_data = "";
$i = 0;
while ( isset ( $data ['rows'] [$i] [0] ) ) {
$ga_dash_data .= "['" . addslashes ( $data ['rows'] [$i] [0] ) . "'," . $data ['rows'] [$i] [1] . "],";
$i ++;
}
return $ga_dash_data;
}
/**
* Get Top referrers
*
* @access private
* @return array
*/
private function getTopReferrers($service, $projectId, $from, $to, $params) {
$metrics = 'ga:visits';
$dimensions = 'ga:source,ga:medium';
try {
$serial = 'gadash_qr5' . str_replace ( array (
'ga:',
',',
'-',
date ( 'Y' )
), "", $projectId . $from . $to );
$data = $service->data_ga->get ( 'ga:' . $projectId, $from, $to, $metrics, array (
'dimensions' => $dimensions,
'sort' => '-ga:visits',
'max-results' => '24',
'filters' => 'ga:medium==referral'
) );
} catch ( Exception $e ) {
return "<br /> Error: " . $e->getMessage ();
}
if (! $data ['rows']) {
return 0;
}
$ga_dash_data = "";
$i = 0;
while ( isset ( $data ['rows'] [$i] [0] ) ) {
$ga_dash_data .= "['" . addslashes ( $data ['rows'] [$i] [0] ) . "'," . $data ['rows'] [$i] [2] . "],";
$i ++;
}
return $ga_dash_data;
}
/**
* Get Top searches
*
* @access private
* @return array
*/
private function getTopSearches($service, $projectId, $from, $to, $params) {
$metrics = 'ga:visits';
$dimensions = 'ga:keyword';
try {
$serial = 'gadash_qr6' . str_replace ( array (
'ga:',
',',
'-',
date ( 'Y' )
), "", $projectId . $from . $to );
$data = $service->data_ga->get ( 'ga:' . $projectId, $from, $to, $metrics, array (
'dimensions' => $dimensions,
'sort' => '-ga:visits',
'max-results' => '24',
'filters' => 'ga:keyword!=(not provided);ga:keyword!=(not set)'
) );
} catch ( Exception $e ) {
return "<br /> Error: " . $e->getMessage ();
}
if (! $data ['rows']) {
return 0;
}
$ga_dash_data = "";
$i = 0;
while ( isset ( $data ['rows'] [$i] [0] ) ) {
$ga_dash_data .= "['" . addslashes ( $data ['rows'] [$i] [0] ) . "'," . $data ['rows'] [$i] [1] . "],";
$i ++;
}
return $ga_dash_data;
}
/**
* Return Google profile identifier object
*
* @access public
* @param string
* @return array
*/
private function getSitesProfiles($service, $client, $params) {
try {
$profile_switch = "";
$serial = 'gadash_qr1';
$profiles = $service->management_profiles->listManagementProfiles ( '~all', '~all' );
} catch ( Exception $e ) {
return $e;
}
$debugBuffer = null;
$items = $profiles->getItems ();
if (count ( $items ) != 0) {
foreach ( $items as &$profile ) {
$profileid = $profile->getId ();
$this->currentProfile = $profile;
$currentProfileUrl = $profile->getwebsiteUrl ();
if($params->get('enable_debug', 0)) {
$debugBuffer .= '<li>' . $currentProfileUrl . '</li>';
}
if ($this->purifyDomain ( $currentProfileUrl ) == $this->purifyDomain ( $params->get ( 'ga_domain', JUri::root () ) )) {
return $profileid;
}
}
// Fallback on the latest added domain to Google Analytics if no match found, with domain dumping if debug is enabled
if($params->get('enable_debug', 0)) {
echo JText::sprintf('COM_JMAP_GOOGLE_ANALYTICS_DEBUGINFO', $debugBuffer);
}
return $profileid;
}
}
/**
* Main get data method
*
* @access public
* @return mixed Returns a data string if success or boolean if exceptions are trigged
*/
public function getData() {
$params = $this->getComponentParams ();
// Perform the authentication management before going on
$authenticationData = $this->authentication ( $params );
if($authenticationData) {
return $authenticationData;
}
// New Service instance for the API, Google_Service_Analytics
$service = new Google_Service_Analytics ( $this->client );
$projectId = $this->getSitesProfiles ( $service, $this->client, $params );
if ( $projectId instanceof Exception ) {
$this->deleteToken();
$this->app->enqueueMessage ( $projectId->getMessage (), 'warning' );
return '<a class="btn btn-primary" href="index.php?option=com_jmap&task=google.display">' . JText::_ ( 'COM_JMAP_GOBACK' ) . '</a>';
}
if ($this->app->input->get('gaquery')) {
$gaquery = $this->app->input->get('gaquery');
} else {
$gaquery = "visits";
}
if ($this->app->input->get('gaperiod')) {
$gaperiod = $this->app->input->get('gaperiod');
} else {
$gaperiod = "last30days";
}
switch ($gaperiod) {
case 'today' :
$from = date ( 'Y-m-d' );
$to = date ( 'Y-m-d' );
$showevery = 5;
break;
case 'yesterday' :
$from = date ( 'Y-m-d', time () - 24 * 60 * 60 );
$to = date ( 'Y-m-d', time () - 24 * 60 * 60 );
$showevery = 5;
break;
case 'last7days' :
$from = date ( 'Y-m-d', time () - 7 * 24 * 60 * 60 );
$to = date ( 'Y-m-d' );
$showevery = 3;
break;
case 'last14days' :
$from = date ( 'Y-m-d', time () - 14 * 24 * 60 * 60 );
$to = date ( 'Y-m-d' );
$showevery = 4;
break;
case 'last3months' :
$from = date ( 'Y-m-d', time () - 90 * 24 * 60 * 60 );
$to = date ( 'Y-m-d' );
$showevery = 4;
break;
case 'last6months' :
$from = date ( 'Y-m-d', time () - 180 * 24 * 60 * 60 );
$to = date ( 'Y-m-d' );
$showevery = 4;
break;
case 'last12months' :
$from = date ( 'Y-m-d', time () - 365 * 24 * 60 * 60 );
$to = date ( 'Y-m-d' );
$showevery = 4;
break;
default :
$from = date ( 'Y-m-d', time () - 30 * 24 * 60 * 60 );
$to = date ( 'Y-m-d' );
$showevery = 6;
break;
}
switch ($gaquery) {
case 'visitors' :
$title = JText::_ ( 'COM_JMAP_GOOGLE_VISITORS' );
break;
case 'pageviews' :
$title = JText::_ ( 'COM_JMAP_GOOGLE_PAGE_VIEWS' );
break;
case 'visitBounceRate' :
$title = JText::_ ( 'COM_JMAP_GOOGLE_BOUNCE_RATE' );
break;
case 'organicSearches' :
$title = JText::_ ( 'COM_JMAP_GOOGLE_ORGANIC_SEARCHES' );
break;
default :
$title = JText::_ ( 'COM_JMAP_GOOGLE_VISITS' );
}
$metrics = 'ga:' . $gaquery;
$dimensions = 'ga:year,ga:month,ga:day';
if ($gaperiod == "today" or $gaperiod == "yesterday") {
$dimensions = 'ga:hour';
} else {
$dimensions = 'ga:year,ga:month,ga:day';
}
try {
$serial = 'gadash_qr2' . str_replace ( array (
'ga:',
',',
'-',
date ( 'Y' )
), "", $projectId . $from . $to . $metrics );
$data = $service->data_ga->get ( 'ga:' . $projectId, $from, $to, $metrics, array (
'dimensions' => $dimensions
) );
} catch ( Exception $e ) {
return "<br /> Error: " . $e->getMessage ();
}
$gadash_data = "";
for($i = 0; $i < $data ['totalResults']; $i ++) {
if ($gaperiod == "today" or $gaperiod == "yesterday") {
$gadash_data .= "['" . $data ['rows'] [$i] [0] . ":00'," . round ( $data ['rows'] [$i] [1], 2 ) . "],";
} else {
$gadash_data .= "['" . $data ['rows'] [$i] [0] . "-" . $data ['rows'] [$i] [1] . "-" . $data ['rows'] [$i] [2] . "'," . round ( $data ['rows'] [$i] [3], 2 ) . "],";
}
}
$metrics = 'ga:visits,ga:visitors,ga:pageviews,ga:visitBounceRate,ga:organicSearches,ga:timeOnSite';
$dimensions = 'ga:year';
try {
$serial = 'gadash_qr3' . str_replace ( array (
'ga:',
',',
'-',
date ( 'Y' )
), "", $projectId . $from . $to );
$data = $service->data_ga->get ( 'ga:' . $projectId, $from, $to, $metrics, array (
'dimensions' => $dimensions
) );
} catch ( Exception $e ) {
return "<br /> Error: " . $e->getMessage ();
}
$code = '<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(ga_dash_callback);
function ga_dash_callback(){
ga_dash_drawstats();
if(typeof ga_dash_drawmap == "function"){
ga_dash_drawmap();
}
if(typeof ga_dash_drawpgd == "function"){
ga_dash_drawpgd();
}
if(typeof ga_dash_drawrd == "function"){
ga_dash_drawrd();
}
if(typeof ga_dash_drawsd == "function"){
ga_dash_drawsd();
}
if(typeof ga_dash_drawtraffic == "function"){
ga_dash_drawtraffic();
}
}
function ga_dash_drawstats() {
var data = google.visualization.arrayToDataTable([' . "
['" . JText::_ ( 'COM_JMAP_GOOGLE_DATE' ) . "', '" . $title . "']," . $gadash_data . "
]);
var options = {
legend: {position: 'none'},
" . "colors:['#3366CC','#2B56AD']," . "
pointSize: 3,
title: '" . $title . "',
chartArea: {width: '95%'},
hAxis: { title: '" . JText::_ ( 'COM_JMAP_GOOGLE_DATE' ) . "', titleTextStyle: {color: 'black'}, showTextEvery: " . $showevery . "},
vAxis: { textPosition: 'none', minValue: 0}
};
var chart = new google.visualization.AreaChart(document.getElementById('gadash_div'));
chart.draw(data, options);
}";
$getVisitsByCountry = $this->getVisitsByCountry ( $service, $projectId, $from, $to, $params );
if ($getVisitsByCountry) {
$code .= '
google.load("visualization", "1", {packages:["geochart"]})
function ga_dash_drawmap() {
var data = google.visualization.arrayToDataTable([' . "
['Country', 'Visits']," . $getVisitsByCountry . "
]);
var options = {
colors: ['white', '" . "blue" . "']
};
var chart = new google.visualization.GeoChart(document.getElementById('ga_dash_mapdata'));
chart.draw(data, options);
}";
}
$getTrafficSources = $this->getTrafficSources ( $service, $projectId, $from, $to, $params );
$getNewReturnVisitors = $this->getNewReturnVisitors ( $service, $projectId, $from, $to, $params );
if ($getTrafficSources && $getNewReturnVisitors) {
$code .= '
google.load("visualization", "1", {packages:["corechart"]})
function ga_dash_drawtraffic() {
var data = google.visualization.arrayToDataTable([' . "
['Source', 'Visits']," . $getTrafficSources . '
]);
var datanvr = google.visualization.arrayToDataTable([' . "
['Type', 'Visits']," . $getNewReturnVisitors . "
]);
var chart = new google.visualization.PieChart(document.getElementById('ga_dash_trafficdata'));
chart.draw(data, {
is3D: false,
tooltipText: 'percentage',
legend: 'none',
title: 'Traffic Sources',
colors: ['" . "#001BB5" . "', '" . "#2D41AF" . "', '" . "#00137F" . "', '" . "blue" . "', '" . "#425AE5" . "']
});
var gadash = new google.visualization.PieChart(document.getElementById('ga_dash_nvrdata'));
gadash.draw(datanvr, {
is3D: false,
tooltipText: 'percentage',
legend: 'none',
title: 'New vs. Returning',
colors: ['" . "#001BB5" . "', '" . "#2D41AF" . "', '" . "#00137F" . "', '" . "blue" . "', '" . "#425AE5" . "']
});
}";
}
$getTopPages = $this->getTopPages ( $service, $projectId, $from, $to, $params );
if ($getTopPages) {
$code .= '
google.load("visualization", "1", {packages:["table"]})
function ga_dash_drawpgd() {
var data = google.visualization.arrayToDataTable([' . "
['Top Pages', 'Visits']," . $getTopPages . "
]);
var options = {
page: 'enable',
pageSize: 6,
width: '100%'
};
var chart = new google.visualization.Table(document.getElementById('ga_dash_pgddata'));
chart.draw(data, options);
}";
}
$getTopReferrers = $this->getTopReferrers ( $service, $projectId, $from, $to, $params );
if ($getTopReferrers) {
$code .= '
google.load("visualization", "1", {packages:["table"]})
function ga_dash_drawrd() {
var datar = google.visualization.arrayToDataTable([' . "
['Top Referrers', 'Visits']," . $getTopReferrers . "
]);
var options = {
page: 'enable',
pageSize: 6,
width: '100%'
};
var chart = new google.visualization.Table(document.getElementById('ga_dash_rdata'));
chart.draw(datar, options);
}";
}
$getTopSearches = $this->getTopSearches ( $service, $projectId, $from, $to, $params );
if ($getTopSearches) {
$code .= '
google.load("visualization", "1", {packages:["table"]})
function ga_dash_drawsd() {
var datas = google.visualization.arrayToDataTable([' . "
['Top Searches', 'Visits']," . $getTopSearches . "
]);
var options = {
page: 'enable',
pageSize: 6,
width: '100%'
};
var chart = new google.visualization.Table(document.getElementById('ga_dash_sdata'));
chart.draw(datas, options);
}";
}
$code .= "
jQuery(window).resize(function(){
if(typeof ga_dash_drawstats == 'function'){
ga_dash_drawstats();
}
if(typeof ga_dash_drawmap == 'function'){
ga_dash_drawmap();
}
if(typeof ga_dash_drawpgd == 'function'){
ga_dash_drawpgd();
}
if(typeof ga_dash_drawrd == 'function'){
ga_dash_drawrd();
}
if(typeof ga_dash_drawsd == 'function'){
ga_dash_drawsd();
}
if(typeof ga_dash_drawtraffic == 'function'){
ga_dash_drawtraffic();
}
});
</script>" .
($this->currentProfile->getWebsiteUrl() ? "<span class='label label-primary label-large'>" . $this->currentProfile->getWebsiteUrl() . "</span>" : null) .
($this->hasOwnCredentials ? null : "<span data-content='" . JText::_('COM_JMAP_GOOGLE_APP_NOTSET_DESC') . "' class='label label-warning hasPopover google pull-right'>" . JText::_('COM_JMAP_GOOGLE_APP_NOTSET') . "</span>") .
'<div id="ga-dash">
<div class="btn-toolbar">
<div class="btn-wrapper"><button class="btn btn-default' . ($gaperiod == "today" ? ' active' : '') . '" onclick="document.getElementById(\'gaperiod\').value=\'today\'">' . JText::_ ( 'COM_JMAP_GOOGLE_TODAY' ) . '</button></div>
<div class="btn-wrapper"><button class="btn btn-default' . ($gaperiod == "yesterday" ? ' active' : '') . '" onclick="document.getElementById(\'gaperiod\').value=\'yesterday\'">' . JText::_ ( 'COM_JMAP_GOOGLE_YESTERDAY' ) . '</button></div>
<div class="btn-wrapper"><button class="btn btn-default' . ($gaperiod == "last7days" ? ' active' : '') . '" onclick="document.getElementById(\'gaperiod\').value=\'last7days\'">' . JText::_ ( 'COM_JMAP_GOOGLE_LAST7DAYS' ) . '</button></div>
<div class="btn-wrapper"><button class="btn btn-default' . ($gaperiod == "last14days" ? ' active' : '') . '" onclick="document.getElementById(\'gaperiod\').value=\'last14days\'">' . JText::_ ( 'COM_JMAP_GOOGLE_LAST14DAYS' ) . '</button></div>
<div class="btn-wrapper"><button class="btn btn-default' . ($gaperiod == "last30days" ? ' active' : '') . '" onclick="document.getElementById(\'gaperiod\').value=\'last30days\'">' . JText::_ ( 'COM_JMAP_GOOGLE_LAST30DAYS' ) . '</button></div>
<div class="btn-wrapper"><button class="btn btn-default' . ($gaperiod == "last3months" ? ' active' : '') . '" onclick="document.getElementById(\'gaperiod\').value=\'last3months\'">' . JText::_ ( 'COM_JMAP_GOOGLE_LAST3MONTHS' ) . '</button></div>
<div class="btn-wrapper"><button class="btn btn-default' . ($gaperiod == "last6months" ? ' active' : '') . '" onclick="document.getElementById(\'gaperiod\').value=\'last6months\'">' . JText::_ ( 'COM_JMAP_GOOGLE_LAST6MONTHS' ) . '</button></div>
<div class="btn-wrapper"><button class="btn btn-default' . ($gaperiod == "last12months" ? ' active' : '') . '" onclick="document.getElementById(\'gaperiod\').value=\'last12months\'">' . JText::_ ( 'COM_JMAP_GOOGLE_LAST12MONTHS' ) . '</button></div>
</div>
<div class="panel panel-info panel-group panel-group-google" id="jmap_googlegraph_accordion">
<div class="panel-heading accordion-toggle" data-toggle="collapse" data-target="#jmap_googlestats_graph">
<h4><span class="glyphicon glyphicon-stats"></span> ' . JText::_ ('COM_JMAP_GOOGLE_STATS' ) . '</h4>
</div>
<div id="jmap_googlestats_graph" class="panel-body panel-collapse collapse" >
<div class="btn-toolbar">
<div class="btn-wrapper"><button class="btn btn-default' . ($gaquery == "visitors" ? ' active' : '') . '" onclick="document.getElementById(\'gaquery\').value=\'visitors\'">' . JText::_ ( 'COM_JMAP_GOOGLE_METRIC_VISITORS' ) . '</button></div>
<div class="btn-wrapper"><button class="btn btn-default' . ($gaquery == "pageviews" ? ' active' : '') . '" onclick="document.getElementById(\'gaquery\').value=\'pageviews\'">' . JText::_ ( 'COM_JMAP_GOOGLE_METRIC_PAGEVIEWS' ) . '</button></div>
<div class="btn-wrapper"><button class="btn btn-default' . ($gaquery == "visitBounceRate" ? ' active' : '') . '" onclick="document.getElementById(\'gaquery\').value=\'visitBounceRate\'">' . JText::_ ( 'COM_JMAP_GOOGLE_METRIC_BOUNCERATE' ) . '</button></div>
<div class="btn-wrapper"><button class="btn btn-default' . ($gaquery == "organicSearches" ? ' active' : '') . '" onclick="document.getElementById(\'gaquery\').value=\'organicSearches\'">' . JText::_ ( 'COM_JMAP_GOOGLE_METRIC_ORGANICSEARCHES' ) . '</button></div>
<div class="btn-wrapper"><button class="btn btn-default' . ($gaquery == "visits" ? ' active' : '') . '" onclick="document.getElementById(\'gaquery\').value=\'visits\'">' . JText::_ ( 'COM_JMAP_GOOGLE_METRIC_VISITS' ) . '</button></div>
</div>
<div id="gadash_div" style="height:350px;"></div>
<table class="gatable" cellpadding="4" width="100%" align="center">
<tr>
<td width="24%">' . JText::_ ( 'COM_JMAP_GOOGLE_VISITS' ) . ':</td>
<td width="12%" class="gavalue"><a href="javascript:void(0);" class="gatable">' . $data ['rows'] [0] [1] . '</td>
<td width="24%">' . JText::_ ( 'COM_JMAP_GOOGLE_VISITORS' ) . ':</td>
<td width="12%" class="gavalue"><a href="javascript:void(0);" class="gatable">' . $data ['rows'] [0] [2] . '</a></td>
<td width="24%">' . JText::_ ( 'COM_JMAP_GOOGLE_PAGE_VIEWS' ) . ':</td>
<td width="12%" class="gavalue"><a href="javascript:void(0);" class="gatable">' . $data ['rows'] [0] [3] . '</a></td>
</tr>
<tr>
<td>' . JText::_ ( 'COM_JMAP_GOOGLE_BOUNCE_RATE' ) . ':</td>
<td class="gavalue"><a href="javascript:void(0);" class="gatable">' . round ( $data ['rows'] [0] [4], 2 ) . '%</a></td>
<td>' . JText::_ ( 'COM_JMAP_GOOGLE_ORGANIC_SEARCHES' ) . ':</td>
<td class="gavalue"><a href="javascript:void(0);" class="gatable">' . $data ['rows'] [0] [5] . '</a></td>
<td>' . JText::_ ( 'COM_JMAP_GOOGLE_PAGES_VISIT' ) . ':</td>
<td class="gavalue"><a href="javascript:void(0);" class="gatable">' . (($data ['rows'] [0] [1]) ? round ( $data ['rows'] [0] [3] / $data ['rows'] [0] [1], 2 ) : '0') . '</a></td>
</tr>
</table>
</div>
</div>';
$JText = 'JText';
$multiReports = <<<MULTIREPORTS
<div class="panel panel-info panel-group panel-group-google" id="jmap_googlegeo_accordion">
<div class="panel-heading accordion-toggle" data-toggle="collapse" data-target="#jmap_googlestats_geo">
<h4><span class="glyphicon glyphicon-picture"></span> {$JText::_ ('COM_JMAP_GOOGLE_MAP' )}</h4>
</div>
<div id="jmap_googlestats_geo" class="panel-body panel-collapse collapse">
<div id="ga_dash_mapdata"></div>
</div>
</div>
<div class="panel panel-info panel-group panel-group-google" id="jmap_googletraffic_accordion">
<div class="panel-heading accordion-toggle" data-toggle="collapse" data-target="#jmap_googlestats_traffic">
<h4><span class="glyphicon glyphicon-sort"></span> {$JText::_ ('COM_JMAP_GOOGLE_TRAFFIC' )}</h4>
</div>
<div id="jmap_googlestats_traffic" class="panel-body panel-collapse collapse">
<div id="ga_dash_trafficdata"></div><div id="ga_dash_nvrdata"></div>
</div>
</div>
<div class="panel panel-info panel-group panel-group-google" id="jmap_googlereferrer_accordion">
<div class="panel-heading accordion-toggle" data-toggle="collapse" data-target="#jmap_googlestats_referrers">
<h4><span class="glyphicon glyphicon-log-in"></span> {$JText::_ ('COM_JMAP_GOOGLE_REFERRERS' )}</h4>
</div>
<div id="jmap_googlestats_referrers" class="panel-body panel-collapse collapse">
<div id="ga_dash_rdata"></div>
</div>
</div>
<div class="panel panel-info panel-group panel-group-google" id="jmap_googlesearches_accordion">
<div class="panel-heading accordion-toggle" data-toggle="collapse" data-target="#jmap_googlestats_searches">
<h4><span class="glyphicon glyphicon-search"></span> {$JText::_ ('COM_JMAP_GOOGLE_SEARCHES' )}</h4>
</div>
<div id="jmap_googlestats_searches" class="panel-body panel-collapse collapse">
<div id="ga_dash_sdata"></div>
</div>
</div>
<div class="panel panel-info panel-group panel-group-google" id="jmap_googlepages_accordion">
<div class="panel-heading accordion-toggle" data-toggle="collapse" data-target="#jmap_googlestats_pages">
<h4><span class="glyphicon glyphicon-file"></span> {$JText::_ ('COM_JMAP_GOOGLE_PAGES' )}</h4>
</div>
<div id="jmap_googlestats_pages" class="panel-body panel-collapse collapse">
<div id="ga_dash_pgddata"></div>
</div>
</div>
MULTIREPORTS;
$code .= $multiReports;
$code .= '</div>';
return $code;
}
/**
* Get data method for webmasters tools stats
*
* @access public
* @return mixed Returns a data string if success or boolean if exceptions are trigged
*/
public function getDataWebmasters() {
$params = $this->getComponentParams ();
// Perform the authentication management before going on
$authenticationData = $this->authentication ( $params );
if($authenticationData) {
$this->state->set('loggedout', true);
$authenticationData .= '<input type="hidden" name="googlestats" value="webmasters" />';
return $authenticationData;
}
// Set the analyzed domain in the model state
$webmastersStatsDomain = $this->purifyWebmastersDomain( $params->get ( 'wm_domain', JUri::root() )) ;
$this->state->set('stats_domain', $webmastersStatsDomain);
$this->state->set('has_own_credentials', $this->hasOwnCredentials);
// New Service instance for the API, Google_Service_Webmasters
$service = new Google_Service_Webmasters ( $this->client );
$results = array();
try {
// Fetch sitemaps stats
$results['sitemaps'] = $service->sitemaps->listSitemaps($webmastersStatsDomain);
// Fetch the number of errors count for all categories
$results['crawlErrorsCount'] = $service->urlcrawlerrorscounts->query($webmastersStatsDomain)->getCountPerTypes();
// Fetch errors count 'not found' -> 404
$results['crawlErrorsNotFound'] = $service->urlcrawlerrorssamples->listUrlcrawlerrorssamples($webmastersStatsDomain, 'notFound', 'web');
// Fetch errors count for 'server errors' -> 500
$results['crawlErrorsServerErrors'] = $service->urlcrawlerrorssamples->listUrlcrawlerrorssamples($webmastersStatsDomain, 'serverError', 'web');
// Fetch errors count for 'soft 404' -> 404
$results['crawlErrorsSoft404'] = $service->urlcrawlerrorssamples->listUrlcrawlerrorssamples($webmastersStatsDomain, 'soft404', 'web');
// Fetch errors count for 'auth permissions'
$results['crawlErrorsNoAuthPermissions'] = $service->urlcrawlerrorssamples->listUrlcrawlerrorssamples($webmastersStatsDomain, 'authPermissions', 'web');
// Fetch errors count for 'other'
$results['crawlErrorsOther'] = array();
$results['crawlErrorsOther'] = $service->urlcrawlerrorssamples->listUrlcrawlerrorssamples($webmastersStatsDomain, 'other', 'web');
// New query request post body object
$postBody = new Google_Service_Webmasters_SearchAnalyticsQueryRequest();
$postBody->setStartDate($this->getState('fromPeriod'));
$postBody->setEndDate($this->getState('toPeriod'));
// Fetch data metric
$postBody->setDimensions(array('query'));
$results['results_query'] = $service->searchanalytics->query($webmastersStatsDomain, $postBody);
// Fetch data metric
$postBody->setDimensions(array('page'));
$results['results_page'] = $service->searchanalytics->query($webmastersStatsDomain, $postBody);
} catch ( Google_Exception $e ) {
$jmapException = new JMapException ( $e->getMessage (), 'error' );
$this->app->enqueueMessage ( $jmapException->getMessage (), $jmapException->getErrorLevel () );
$result = array();
} catch ( Exception $e ) {
$jmapException = new JMapException ( $e->getMessage (), 'error' );
$this->app->enqueueMessage ( $jmapException->getMessage (), $jmapException->getErrorLevel () );
$result = array();
}
return $results;
}
/**
* Return the google token
*
* @access public
* @return string
*/
public function getToken() {
$clientID = (int)$this->app->getClientId();
try {
$query = "SELECT token FROM #__jmap_google WHERE id = " . $clientID;
$this->_db->setQuery ( $query );
$result = $this->_db->loadResult ();
} catch ( JMapException $e ) {
$this->app->enqueueMessage ( $e->getMessage (), $e->getErrorLevel () );
$result = null;
} catch ( Exception $e ) {
$jmapException = new JMapException ( $e->getMessage (), 'error' );
$this->app->enqueueMessage ( $jmapException->getMessage (), $jmapException->getErrorLevel () );
$result = null;
}
return $result;
}
/**
* Return select lists used as filter for editEntity
*
* @access public
* @param Object $record
* @return array
*/
public function getLists($record = null) {
$lists = array ();
return $lists;
}
/**
* Return select lists used as filter for listEntities
*
* @access public
* @return array
*/
public function getFilters() {
$filters = array ();
return $filters;
}
/**
* Delete entity
*
* @param array $ids
* @access public
* @return boolean
*/
public function deleteEntity($ids) {
return $this->deleteToken();
}
/**
* Submit a sitemap link using the GWT API
*
* @access public
* @param string $sitemapUri
* @return boolean
*/
public function submitSitemap($sitemapUri) {
$params = $this->getComponentParams ();
// Perform the authentication management before going on
$authenticationData = $this->authentication ( $params );
if($authenticationData) {
return $authenticationData;
}
// Set the analyzed domain in the model state
$webmastersStatsDomain = $this->purifyWebmastersDomain( $params->get ( 'wm_domain', JUri::root() )) ;
// New Service instance for the API, Google_Service_Webmasters
$service = new Google_Service_Webmasters ( $this->client );
try {
$service->sitemaps->submit($webmastersStatsDomain, $sitemapUri);
} catch ( Google_Exception $e ) {
$jmapException = new JMapException ( $e->getMessage (), 'error' );
$this->setError ( $jmapException );
return false;
} catch ( Exception $e ) {
$jmapException = new JMapException ( $e->getMessage (), 'error' );
$this->setError ( $jmapException );
return false;
}
return true;
}
/**
* Delete a sitemap link using the GWT API
*
* @access public
* @param string $sitemapUri
* @return boolean
*/
public function deleteSitemap($sitemapUri) {
$params = $this->getComponentParams ();
// Perform the authentication management before going on
$authenticationData = $this->authentication ( $params );
if($authenticationData) {
return $authenticationData;
}
// Set the analyzed domain in the model state
$webmastersStatsDomain = $this->purifyWebmastersDomain( $params->get ( 'wm_domain', JUri::root() )) ;
// New Service instance for the API, Google_Service_Webmasters
$service = new Google_Service_Webmasters ( $this->client );
try {
$service->sitemaps->delete($webmastersStatsDomain, $sitemapUri);
} catch ( Google_Exception $e ) {
$jmapException = new JMapException ( $e->getMessage (), 'error' );
$this->setError ( $jmapException );
return false;
} catch ( Exception $e ) {
$jmapException = new JMapException ( $e->getMessage (), 'error' );
$this->setError ( $jmapException );
return false;
}
return true;
}
/**
* Mark as fixed a certain category of crawl errors
*
* @access public
* @param string $crawlErrorsCategory
* @return boolean
*/
public function markAsFixed($crawlErrorsCategory) {
$params = $this->getComponentParams ();
// Perform the authentication management before going on
$authenticationData = $this->authentication ( $params );
if($authenticationData) {
return $authenticationData;
}
// Set the analyzed domain in the model state
$webmastersStatsDomain = $this->purifyWebmastersDomain( $params->get ( 'wm_domain', JUri::root() )) ;
// New Service instance for the API, Google_Service_Webmasters
$service = new Google_Service_Webmasters ( $this->client );
try {
// First of all we must fetch all URLs with errors in the category
$urlsListInThisCategory = $service->urlcrawlerrorssamples->listUrlcrawlerrorssamples($webmastersStatsDomain, $crawlErrorsCategory, 'web');
// Now cycle to fix all URLs
if(count($urlsListInThisCategory)) {
foreach ($urlsListInThisCategory as $url) {
$service->urlcrawlerrorssamples->markAsFixed($webmastersStatsDomain, $url->getPageUrl(), $crawlErrorsCategory, 'web');
}
} else {
throw new JMapException(JText::_('COM_JMAP_GOOGLE_WEBMASTERS_NOERRORS_TOFIX'), 'notice');
}
} catch ( JMapException $e ) {
$this->setError ( $e );
return false;
} catch ( Google_Exception $e ) {
$jmapException = new JMapException ( $e->getMessage (), 'error' );
$this->setError ( $jmapException );
return false;
} catch ( Exception $e ) {
$jmapException = new JMapException ( $e->getMessage (), 'error' );
$this->setError ( $jmapException );
return false;
}
return true;
}
}