joomla_test/libraries/joomla/google/embed/analytics.php
2020-01-02 22:20:31 +07:00

333 lines
7.8 KiB
PHP

<?php
/**
* @package Joomla.Platform
* @subpackage Google
*
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved
* @license GNU General Public License version 2 or later; see LICENSE
*/
defined('JPATH_PLATFORM') or die;
/**
* Google Analytics embed class for the Joomla Platform.
*
* @package Joomla.Platform
* @subpackage Google
* @since 12.3
*/
class JGoogleEmbedAnalytics extends JGoogleEmbed
{
/**
* Method to get the tracking code
*
* @return string The Google Analytics tracking code
*
* @since 12.3
*/
public function getCode()
{
return $this->getOption('code');
}
/**
* Method to set the tracking code
*
* @param string $code The Google Analytics tracking code
*
* @return JGoogleEmbedAnalytics The object for method chaining
*
* @since 12.3
*/
public function setCode($code)
{
$this->setOption('code', $code);
return $this;
}
/**
* Checks if the javascript is set to be asynchronous
*
* @return boolean True if asynchronous
*
* @since 12.3
*/
public function isAsync()
{
return $this->getOption('async') === null ? true : $this->getOption('async');
}
/**
* Load javascript asynchronously
*
* @return JGoogleEmbedAnalytics The object for method chaining
*
* @since 12.3
*/
public function useAsync()
{
$this->setOption('async', true);
return $this;
}
/**
* Load javascript synchronously
*
* @return JGoogleEmbedAnalytics The object for method chaining
*
* @since 12.3
*/
public function useSync()
{
$this->setOption('async', false);
return $this;
}
/**
* Add an analytics call
*
* @param string $method The name of the function
* @param array $params The parameters for the call
*
* @return array The added call
*
* @since 12.3
*/
public function addCall($method, $params = array())
{
$call = array('name' => $method, 'params' => $params);
$calls = $this->listCalls();
$calls[] = $call;
$this->setOption('calls', $calls);
return $call;
}
/**
* List the analytics calls to be executed
*
* @return array A list of calls
*
* @since 12.3
*/
public function listCalls()
{
return $this->getOption('calls') ? $this->getOption('calls') : array();
}
/**
* Delete a call from the stack
*
* @param int $index Index of call to delete (defaults to last added call)
*
* @return array The deleted call
*
* @since 12.3
*/
public function deleteCall($index = null)
{
$calls = $this->listCalls();
if ($index === null)
{
$index = count($calls) - 1;
}
$call = $calls[$index];
unset($calls[$index]);
$calls = array_values($calls);
$this->setOption('calls', $calls);
return $call;
}
/**
* Create a javascript function from the call parameters
*
* @param string $method The name of the function
* @param array $params The parameters for the call
*
* @return string The created call
*
* @since 12.3
*/
public function createCall($method, $params = array())
{
$params = array_values($params);
if ($this->isAsync())
{
$output = "_gaq.push(['{$method}',";
$output .= substr(json_encode($params), 1, -1);
$output .= ']);';
}
else
{
$output = "pageTracker.{$method}(";
$output .= substr(json_encode($params), 1, -1);
$output .= ');';
}
return $output;
}
/**
* Add a custom variable to the analytics
*
* @param int $slot The slot to store the variable in (1-5)
* @param string $name The variable name
* @param string $value The variable value
* @param int $scope The scope of the variable (1: visitor level, 2: session level, 3: page level)
*
* @return array The added call
*
* @since 12.3
*/
public function addCustomVar($slot, $name, $value, $scope = 3)
{
return $this->addCall('_setCustomVar', array($slot, $name, $value, $scope));
}
/**
* Get the code to create a custom analytics variable
*
* @param int $slot The slot to store the variable in (1-5)
* @param string $name The variable name
* @param string $value The variable value
* @param int $scope The scope of the variable (1: visitor level, 2: session level, 3: page level)
*
* @return string The created call
*
* @since 12.3
*/
public function createCustomVar($slot, $name, $value, $scope = 3)
{
return $this->createCall('_setCustomVar', array($slot, $name, $value, $scope));
}
/**
* Track an analytics event
*
* @param string $category The general event category
* @param string $action The event action
* @param string $label The event description
* @param string $value The value of the event
* @param boolean $noninteract Don't allow this event to impact bounce statistics
*
* @return array The added call
*
* @since 12.3
*/
public function addEvent($category, $action, $label = null, $value = null, $noninteract = false)
{
return $this->addCall('_trackEvent', array($category, $action, $label, $value, $noninteract));
}
/**
* Get the code to track an analytics event
*
* @param string $category The general event category
* @param string $action The event action
* @param string $label The event description
* @param string $value The value of the event
* @param boolean $noninteract Don't allow this event to impact bounce statistics
*
* @return string The created call
*
* @since 12.3
*/
public function createEvent($category, $action, $label = null, $value = null, $noninteract = false)
{
return $this->createCall('_trackEvent', array($category, $action, $label, $value, $noninteract));
}
/**
* Get code to load Google Analytics javascript
*
* @return string Javascript code
*
* @since 12.3
*/
public function getHeader()
{
if (!$this->isAsync())
{
// Synchronous code is included only in the body
return '';
}
if (!$this->getOption('code'))
{
throw new UnexpectedValueException('A Google Analytics tracking code is required.');
}
$code = $this->getOption('code');
$output = '<script type="text/javascript">';
$output .= 'var _gaq = _gaq || [];';
$output .= "_gaq.push(['_setAccount', '{$code}']);";
foreach ($this->listCalls() as $call)
{
$output .= $this->createCall($call['name'], $call['params']);
}
$output .= '_gaq.push(["_trackPageview"]);';
$output .= '</script>';
return $output;
}
/**
* Google Analytics only needs to be included in the header
*
* @return null
*
* @since 12.3
*/
public function getBody()
{
if (!$this->getOption('code'))
{
throw new UnexpectedValueException('A Google Analytics tracking code is required.');
}
$prefix = $this->isSecure() ? 'https://ssl' : 'http://www';
$code = $this->getOption('code');
if ($this->isAsync())
{
$output = '<script type="text/javascript">';
$output .= '(function() {';
$output .= 'var ga = document.createElement("script"); ga.type = "text/javascript"; ga.async = true;';
$output .= "ga.src = '{$prefix}.google-analytics.com/ga.js';";
$output .= 'var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ga, s);';
$output .= '})();';
$output .= '</script>';
}
else
{
$output = '<script type="text/javascript">';
$output .= "document.write(unescape(\"%3Cscript src='{$prefix}.google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E\"));";
$output .= '</script>';
$output .= '<script type="text/javascript">';
$output .= 'try{';
$output .= "var pageTracker = _gat._getTracker('{$code}');";
foreach ($this->listCalls() as $call)
{
$output .= $this->createCall($call['name'], $call['params']);
}
$output .= 'pageTracker._trackPageview();';
$output .= '} catch(err) {}</script>';
}
return $output;
}
}