questlab/www/analytics/plugins/DevicesDetection/DevicesDetection.php
2014-05-15 12:35:28 +02:00

380 lines
14 KiB
PHP

<?php
/**
* Piwik - Open source web analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\DevicesDetection;
use Exception;
use Piwik\ArchiveProcessor;
use Piwik\CacheFile;
use Piwik\Common;
use Piwik\Config;
use Piwik\Db;
use Piwik\Menu\MenuAdmin;
use Piwik\Menu\MenuMain;
use Piwik\Piwik;
use Piwik\Plugin\ViewDataTable;
use Piwik\WidgetsList;
use DeviceDetector;
require_once PIWIK_INCLUDE_PATH . '/plugins/DevicesDetection/functions.php';
class DevicesDetection extends \Piwik\Plugin
{
/**
* @see Piwik\Plugin::getInformation
*/
public function getInformation()
{
return array(
'description' => "[Beta Plugin] " . Piwik::translate("DevicesDetection_PluginDescription"),
'authors' => array(array('name' => 'Piwik PRO', 'homepage' => 'http://piwik.pro')),
'version' => '1.14',
'license' => 'GPL v3+',
'license_homepage' => 'http://www.gnu.org/licenses/gpl.html'
);
}
/** The set of related reports displayed under the 'Operating Systems' header. */
private $osRelatedReports = null;
private $browserRelatedReports = null;
public function __construct()
{
parent::__construct();
$this->osRelatedReports = array(
'DevicesDetection.getOsFamilies' => Piwik::translate('DevicesDetection_OperatingSystemFamilies'),
'DevicesDetection.getOsVersions' => Piwik::translate('DevicesDetection_OperatingSystemVersions')
);
$this->browserRelatedReports = array(
'DevicesDetection.getBrowserFamilies' => Piwik::translate('UserSettings_BrowserFamilies'),
'DevicesDetection.getBrowserVersions' => Piwik::translate('DevicesDetection_BrowserVersions')
);
}
protected function getRawMetadataDeviceType()
{
$deviceTypeList = implode(", ", DeviceDetector::$deviceTypes);
$deviceTypeLabelToCode = function ($type) use ($deviceTypeList) {
$index = array_search(strtolower(trim(urldecode($type))), DeviceDetector::$deviceTypes);
if ($index === false) {
throw new Exception("deviceType segment must be one of: $deviceTypeList");
}
return $index;
};
return array(
'DevicesDetection_DevicesDetection',
'DevicesDetection_DeviceType',
'DevicesDetection',
'getType',
'DevicesDetection_DeviceType',
// Segment
'deviceType',
'log_visit.config_device_type',
$deviceTypeList,
$deviceTypeLabelToCode
);
}
/**
* @see Piwik\Plugin::getListHooksRegistered
*/
public function getListHooksRegistered()
{
return array(
'Menu.Reporting.addItems' => 'addMenu',
'Menu.Admin.addItems' => 'addAdminMenu',
'Tracker.newVisitorInformation' => 'parseMobileVisitData',
'WidgetsList.addWidgets' => 'addWidgets',
'API.getReportMetadata' => 'getReportMetadata',
'API.getSegmentDimensionMetadata' => 'getSegmentsMetadata',
'ViewDataTable.configure' => 'configureViewDataTable',
);
}
public function addAdminMenu()
{
MenuAdmin::getInstance()->add(
'CoreAdminHome_MenuDiagnostic', 'DevicesDetection_DeviceDetection',
array('module' => 'DevicesDetection', 'action' => 'deviceDetection'),
Piwik::isUserHasSomeAdminAccess(),
$order = 40
);
}
/**
* Defines API reports.
* Also used to define Widgets, and Segment(s)
*
* @return array Category, Report Name, API Module, API action, Translated column name, & optional segment info
*/
protected function getRawMetadataReports()
{
$report = array(
// device type report (tablet, desktop, mobile...)
$this->getRawMetadataDeviceType(),
// device brands report
array(
'DevicesDetection_DevicesDetection',
'DevicesDetection_DeviceBrand',
'DevicesDetection',
'getBrand',
'DevicesDetection_DeviceBrand',
),
// device model report
array(
'DevicesDetection_DevicesDetection',
'DevicesDetection_DeviceModel',
'DevicesDetection',
'getModel',
'DevicesDetection_DeviceModel',
),
// device OS family report
array(
'DevicesDetection_DevicesDetection',
'DevicesDetection_OperatingSystemFamilies',
'DevicesDetection',
'getOsFamilies',
'DevicesDetection_OperatingSystemFamilies',
),
// device OS version report
array(
'DevicesDetection_DevicesDetection',
'DevicesDetection_OperatingSystemVersions',
'DevicesDetection',
'getOsVersions',
'DevicesDetection_OperatingSystemVersions',
),
// Browser family report
array(
'DevicesDetection_DevicesDetection',
'UserSettings_BrowserFamilies',
'DevicesDetection',
'getBrowserFamilies',
'UserSettings_BrowserFamilies',
),
// Browser versions report
array(
'DevicesDetection_DevicesDetection',
'DevicesDetection_BrowserVersions',
'DevicesDetection',
'getBrowserVersions',
'DevicesDetection_BrowserVersions',
),
);
return $report;
}
public function addWidgets()
{
foreach ($this->getRawMetadataReports() as $report) {
list($category, $name, $controllerName, $controllerAction) = $report;
if ($category == false)
continue;
WidgetsList::add($category, $name, $controllerName, $controllerAction);
}
}
/**
* Get segments meta data
*/
public function getSegmentsMetadata(&$segments)
{
// Note: only one field segmented so far: deviceType
foreach ($this->getRawMetadataReports() as $report) {
@list($category, $name, $apiModule, $apiAction, $columnName, $segment, $sqlSegment, $acceptedValues, $sqlFilter) = $report;
if (empty($segment)) continue;
$segments[] = array(
'type' => 'dimension',
'category' => Piwik::translate('General_Visit'),
'name' => $columnName,
'segment' => $segment,
'acceptedValues' => $acceptedValues,
'sqlSegment' => $sqlSegment,
'sqlFilter' => isset($sqlFilter) ? $sqlFilter : false
);
}
}
public function getReportMetadata(&$reports)
{
$i = 0;
foreach ($this->getRawMetadataReports() as $report) {
list($category, $name, $apiModule, $apiAction, $columnName) = $report;
if ($category == false)
continue;
$report = array(
'category' => Piwik::translate($category),
'name' => Piwik::translate($name),
'module' => $apiModule,
'action' => $apiAction,
'dimension' => Piwik::translate($columnName),
'order' => $i++
);
$translation = $name . 'Documentation';
$translated = Piwik::translate($translation, '<br />');
if ($translated != $translation) {
$report['documentation'] = $translated;
}
$reports[] = $report;
}
}
public function install()
{
// we catch the exception
try {
$q1 = "ALTER TABLE `" . Common::prefixTable("log_visit") . "`
ADD `config_os_version` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL AFTER `config_os` ,
ADD `config_device_type` TINYINT( 100 ) NULL DEFAULT NULL AFTER `config_browser_version` ,
ADD `config_device_brand` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL AFTER `config_device_type` ,
ADD `config_device_model` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL AFTER `config_device_brand`";
Db::exec($q1);
} catch (Exception $e) {
if (!Db::get()->isErrNo($e, '1060')) {
throw $e;
}
}
}
public function parseMobileVisitData(&$visitorInfo, \Piwik\Tracker\Request $request)
{
$userAgent = $request->getUserAgent();
$UAParser = new DeviceDetector($userAgent);
$UAParser->setCache(new CacheFile('tracker', 86400));
$UAParser->parse();
$deviceInfo['config_browser_name'] = $UAParser->getBrowser("short_name");
$deviceInfo['config_browser_version'] = $UAParser->getBrowser("version");
$deviceInfo['config_os'] = $UAParser->getOs("short_name");
$deviceInfo['config_os_version'] = $UAParser->getOs("version");
$deviceInfo['config_device_type'] = $UAParser->getDevice();
$deviceInfo['config_device_model'] = $UAParser->getModel();
$deviceInfo['config_device_brand'] = $UAParser->getBrand();
$visitorInfo = array_merge($visitorInfo, $deviceInfo);
Common::printDebug("Device Detection:");
Common::printDebug($deviceInfo);
}
public function addMenu()
{
MenuMain::getInstance()->add('General_Visitors', 'DevicesDetection_submenu', array('module' => 'DevicesDetection', 'action' => 'index'));
}
public function configureViewDataTable(ViewDataTable $view)
{
switch ($view->requestConfig->apiMethodToRequestDataTable) {
case 'DevicesDetection.getType':
$this->configureViewForGetType($view);
break;
case 'DevicesDetection.getBrand':
$this->configureViewForGetBrand($view);
break;
case 'DevicesDetection.getModel':
$this->configureViewForGetModel($view);
break;
case 'DevicesDetection.getOsFamilies':
$this->configureViewForGetOsFamilies($view);
break;
case 'DevicesDetection.getOsVersions':
$this->configureViewForGetOsVersions($view);
break;
case 'DevicesDetection.getBrowserFamilies':
$this->configureViewForGetBrowserFamilies($view);
break;
case 'DevicesDetection.getBrowserVersions':
$this->configureViewForGetBrowserVersions($view);
break;
}
}
private function configureViewForGetType(ViewDataTable $view)
{
$view->config->show_search = false;
$view->config->show_exclude_low_population = false;
$view->config->addTranslation('label', Piwik::translate("DevicesDetection_dataTableLabelTypes"));
}
private function configureViewForGetBrand(ViewDataTable $view)
{
$view->config->show_search = false;
$view->config->show_exclude_low_population = false;
$view->config->addTranslation('label', Piwik::translate("DevicesDetection_dataTableLabelBrands"));
}
private function configureViewForGetModel(ViewDataTable $view)
{
$view->config->show_search = false;
$view->config->show_exclude_low_population = false;
$view->config->addTranslation('label', Piwik::translate("DevicesDetection_dataTableLabelModels"));
}
private function configureViewForGetOsFamilies(ViewDataTable $view)
{
$view->config->title = Piwik::translate('DevicesDetection_OperatingSystemFamilies');
$view->config->show_search = false;
$view->config->show_exclude_low_population = false;
$view->config->addTranslation('label', Piwik::translate("UserSettings_OperatingSystemFamily"));
$view->config->addRelatedReports($this->getOsRelatedReports());
}
private function configureViewForGetOsVersions(ViewDataTable $view)
{
$view->config->title = Piwik::translate('DevicesDetection_OperatingSystemVersions');
$view->config->show_search = false;
$view->config->show_exclude_low_population = false;
$view->config->addTranslation('label', Piwik::translate("DevicesDetection_dataTableLabelSystemVersion"));
$view->config->addRelatedReports($this->getOsRelatedReports());
}
private function configureViewForGetBrowserFamilies(ViewDataTable $view)
{
$view->config->title = Piwik::translate('UserSettings_BrowserFamilies');
$view->config->show_search = false;
$view->config->show_exclude_low_population = false;
$view->config->addTranslation('label', Piwik::translate("DevicesDetection_dataTableLabelBrowserFamily"));
$view->config->addRelatedReports($this->getBrowserRelatedReports());
}
private function configureViewForGetBrowserVersions(ViewDataTable $view)
{
$view->config->show_search = false;
$view->config->show_exclude_low_population = false;
$view->config->addTranslation('label', Piwik::translate("UserSettings_ColumnBrowserVersion"));
$view->config->addRelatedReports($this->getBrowserRelatedReports());
}
private function getOsRelatedReports()
{
return array(
'DevicesDetection.getOsFamilies' => Piwik::translate('DevicesDetection_OperatingSystemFamilies'),
'DevicesDetection.getOsVersions' => Piwik::translate('DevicesDetection_OperatingSystemVersions')
);
}
private function getBrowserRelatedReports()
{
return array(
'DevicesDetection.getBrowserFamilies' => Piwik::translate('UserSettings_BrowserFamilies'),
'DevicesDetection.getBrowserVersions' => Piwik::translate('DevicesDetection_BrowserVersions')
);
}
}