diff options
58 files changed, 2601 insertions, 680 deletions
diff --git a/core/Db/Schema/Mysql.php b/core/Db/Schema/Mysql.php index a85fbe62d1..ef7d87b4dd 100644 --- a/core/Db/Schema/Mysql.php +++ b/core/Db/Schema/Mysql.php @@ -156,20 +156,12 @@ class Mysql implements SchemaInterface visitor_days_since_first SMALLINT(5) UNSIGNED NOT NULL, visit_first_action_time DATETIME NOT NULL, visit_last_action_time DATETIME NOT NULL, - visit_exit_idaction_url INTEGER(11) UNSIGNED NULL DEFAULT 0, - visit_exit_idaction_name INTEGER(11) UNSIGNED NOT NULL, - visit_entry_idaction_url INTEGER(11) UNSIGNED NOT NULL, - visit_entry_idaction_name INTEGER(11) UNSIGNED NOT NULL, visit_total_actions SMALLINT(5) UNSIGNED NOT NULL, visit_total_searches SMALLINT(5) UNSIGNED NOT NULL, visit_total_events SMALLINT(5) UNSIGNED NOT NULL, visit_total_time SMALLINT(5) UNSIGNED NOT NULL, visit_goal_converted TINYINT(1) NOT NULL, visit_goal_buyer TINYINT(1) NOT NULL, - referer_type TINYINT(1) UNSIGNED NULL, - referer_name VARCHAR(70) NULL, - referer_url TEXT NOT NULL, - referer_keyword VARCHAR(255) NULL, config_id BINARY(8) NOT NULL, config_resolution VARCHAR(9) NOT NULL, config_pdf TINYINT(1) NOT NULL, @@ -263,9 +255,7 @@ class Mysql implements SchemaInterface idvisitor BINARY(8) NOT NULL, server_time DATETIME NOT NULL, idvisit INTEGER(10) UNSIGNED NOT NULL, - idaction_url INTEGER(10) UNSIGNED DEFAULT NULL, idaction_url_ref INTEGER(10) UNSIGNED NULL DEFAULT 0, - idaction_name INTEGER(10) UNSIGNED, idaction_name_ref INTEGER(10) UNSIGNED NOT NULL, idaction_event_category INTEGER(10) UNSIGNED DEFAULT NULL, idaction_event_action INTEGER(10) UNSIGNED DEFAULT NULL, diff --git a/core/Menu/MenuReporting.php b/core/Menu/MenuReporting.php index 08dcc23e82..c30e04016b 100644 --- a/core/Menu/MenuReporting.php +++ b/core/Menu/MenuReporting.php @@ -8,6 +8,7 @@ */ namespace Piwik\Menu; use Piwik\Piwik; +use Piwik\Plugin\Report; /** * Contains menu entries for the Reporting menu (the menu displayed under the Piwik logo). @@ -70,6 +71,10 @@ class MenuReporting extends MenuAbstract foreach ($this->getAvailableMenus() as $menu) { $menu->configureReportingMenu($this); } + + foreach (Report::getAllReports() as $report) { + $report->configureReportingMenu($this); + } } return parent::getMenu(); diff --git a/core/Plugin/ActionDimension.php b/core/Plugin/ActionDimension.php new file mode 100644 index 0000000000..1380fae6bc --- /dev/null +++ b/core/Plugin/ActionDimension.php @@ -0,0 +1,113 @@ +<?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\Plugin; + +use Piwik\Common; +use Piwik\Db; +use Piwik\Tracker\Request; +use Piwik\Plugin\Manager as PluginManager; + +/** + * @api + */ +abstract class ActionDimension +{ + protected $name; + + protected $fieldName = ''; + protected $fieldType = ''; + + protected $segments = array(); + + public function __construct() + { + $this->init(); + } + + protected function init() + { + + } + + public function install() + { + if (empty($this->fieldName) || empty($this->fieldType)) { + return; + } + + try { + $sql = "ALTER TABLE `" . Common::prefixTable("log_link_visit_action") . "` ADD `$this->fieldName` $this->fieldType"; + Db::exec($sql); + + } catch (\Exception $e) { + if (!Db::get()->isErrNo($e, '1060')) { + throw $e; + } + } + } + + public function shouldHandle() + { + return false; + } + + protected function addSegment(Segment $segment) + { + if (!empty($this->fieldName)) { + $segment->setSqlSegment('log_link_visit_action.' . $this->fieldName); + } + + $segment->setType('dimension'); + + $this->segments[] = $segment; + } + + /** + * @return Segment[] + */ + public function getSegments() + { + return $this->segments; + } + + public function getFieldName() + { + return $this->fieldName; + } + + abstract public function getName(); + + /** @return \Piwik\Plugin\ActionDimension[] */ + public static function getAllDimensions() + { + $plugins = PluginManager::getInstance()->getLoadedPlugins(); + $instances = array(); + foreach ($plugins as $plugin) { + foreach (self::getDimensions($plugin) as $instance) { + $instances[] = $instance; + } + } + + return $instances; + } + + /** @return \Piwik\Plugin\ActionDimension[] */ + public static function getDimensions(\Piwik\Plugin $plugin) + { + $dimensions = $plugin->findMultipleComponents('Columns', '\\Piwik\\Plugin\\ActionDimension'); + $instances = array(); + + foreach ($dimensions as $dimension) { + $instances[] = new $dimension(); + } + + return $instances; + } + +} diff --git a/core/Plugin/Report.php b/core/Plugin/Report.php new file mode 100644 index 0000000000..b06ef0a828 --- /dev/null +++ b/core/Plugin/Report.php @@ -0,0 +1,205 @@ +<?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\Plugin; + +use Piwik\API\Proxy; +use Piwik\Menu\MenuReporting; +use Piwik\Metrics; +use Piwik\Plugin\Manager as PluginManager; +use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable; +use Piwik\WidgetsList; +use Piwik\ViewDataTable\Factory as ViewDataTableFactory; + +class Report +{ + protected $module; + protected $action; + protected $name; + protected $title; + protected $category; + protected $widgetTitle; + protected $menuTitle; + protected $processedMetrics = false; + protected $metrics = array(); + + /** + * @var \Piwik\Plugin\VisitDimension + */ + protected $dimension; + protected $documentation; + + /** + * @var null|Report + */ + protected $actionToLoadSubTables; + protected $order = 1; + + public function __construct() + { + $classname = get_class($this); + $parts = explode('\\', $classname); + $this->module = $parts[2]; + $this->action = lcfirst($parts[4]); + + $this->init(); + } + + protected function init() + { + } + + public function isEnabled() + { + return true; + } + + public function getDefaultTypeViewDataTable() + { + return HtmlTable::ID; + } + + public function configureView(ViewDataTable $view) + { + + } + + public function render() + { + $apiProxy = Proxy::getInstance(); + + if (!$apiProxy->isExistingApiAction($this->module, $this->action)) { + throw new \Exception("Invalid action name '$this->action' for '$this->module' plugin."); + } + + $apiAction = $apiProxy->buildApiActionName($this->module, $this->action); + + $view = ViewDataTableFactory::build(null, $apiAction, 'CoreHome.renderWidget'); + $rendered = $view->render(); + + return $rendered; + } + + public function configureWidget(WidgetsList $widget) + { + if ($this->widgetTitle) { + $widget->add($this->category, $this->widgetTitle, 'CoreHome', 'renderWidget', array('reportModule' => $this->module, 'reportAction' => $this->action)); + } + } + + public function configureReportingMenu(MenuReporting $menu) + { + if ($this->menuTitle) { + $menu->add($this->category, + $this->menuTitle, + array('module' => 'CoreHome', 'action' => 'renderMenuReport', 'reportModule' => $this->module, 'reportAction' => $this->action), + $this->isEnabled(), + $this->order); + } + } + + protected function getMetrics() + { + // TODO not all will be defined there... later in Columns directory + $translations = Metrics::getDefaultMetricTranslations(); + $metrics = array(); + + foreach ($this->metrics as $metric) { + if (!empty( $translations[$metric])) { + $metric[$metric] = $translations[$metric]; + } else { + $metric[$metric] = 'To be defined'; + } + } + + return $metrics; + } + + protected function getMetricsDocumentation() + { + // TODO not all will be defined there... later in Columns directory + $translations = Metrics::getDefaultMetricsDocumentation(); + $documentation = array(); + + foreach ($this->metrics as $metric) { + if (!empty( $translations[$metric])) { + $metric[$metric] = $translations[$metric]; + } else { + $metric[$metric] = 'To be defined see todo'; + } + } + + return $documentation; + } + + public function toArray() + { + $report = array( + 'category' => $this->category, + 'name' => $this->name, + 'module' => $this->module, + 'action' => $this->action, + 'metrics' => $this->getMetrics(), + 'metricsDocumentation' => $this->getMetricsDocumentation(), + 'documentation' => $this->documentation, + 'processedMetrics' => $this->processedMetrics, + 'order' => $this->order + ); + + if (!empty($this->dimension)) { + $report['dimension'] = $this->dimension->getName(); + } + + if (!empty($this->actionToLoadSubTables)) { + $report['actionToLoadSubTables'] = $this->actionToLoadSubTables; + } + + return $report; + } + + public function getName() + { + return $this->name; + } + + public function getAction() + { + return $this->action; + } + + public static function factory($moduleOnlyOrModuleAndAction, $action = '') + { + if (empty($action) && strpos($moduleOnlyOrModuleAndAction, '.') > 0) { + $parts = explode('.', $moduleOnlyOrModuleAndAction); + $module = $parts[0]; + $action = $parts[1]; + } else { + $module = $moduleOnlyOrModuleAndAction; + } + + foreach (self::getAllReports() as $report) { + if ($report->module === $module && $report->action === $action) { + return $report; + } + } + } + + /** @return \Piwik\Plugin\Report[] */ + public static function getAllReports() + { + $reports = PluginManager::getInstance()->findMultipleComponents('Reports', '\\Piwik\\Plugin\\Report'); + $instances = array(); + + foreach ($reports as $report) { + $instances[] = new $report(); + } + + return $instances; + } + +} diff --git a/core/Plugin/Segment.php b/core/Plugin/Segment.php new file mode 100644 index 0000000000..41933a142b --- /dev/null +++ b/core/Plugin/Segment.php @@ -0,0 +1,123 @@ +<?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\Plugin; + +/** + * @api + */ +class Segment +{ + private $type; + private $category; + private $name; + private $segment; + private $sqlSegment; + private $sqlFilter; + private $sqlFilterValue; + private $acceptValues; + + public function __construct() + { + $this->init(); + } + + protected function init() + { + + } + + /** + * @param mixed $acceptValues + */ + public function setAcceptValues($acceptValues) + { + $this->acceptValues = $acceptValues; + } + + /** + * @param mixed $category + */ + public function setCategory($category) + { + $this->category = $category; + } + + /** + * @param mixed $name + */ + public function setName($name) + { + $this->name = $name; + } + + /** + * @param mixed $segment + */ + public function setSegment($segment) + { + $this->segment = $segment; + } + + /** + * @param mixed $sqlFilter + */ + public function setSqlFilter($sqlFilter) + { + $this->sqlFilter = $sqlFilter; + } + + /** + * @param mixed $sqlFilterValue + */ + public function setSqlFilterValue($sqlFilterValue) + { + $this->sqlFilterValue = $sqlFilterValue; + } + + /** + * @param mixed $sqlSegment + */ + public function setSqlSegment($sqlSegment) + { + $this->sqlSegment = $sqlSegment; + } + + /** + * @param mixed $type + */ + public function setType($type) + { + $this->type = $type; + } + + public function toArray() + { + $segment = array( + 'type' => $this->type, + 'category' => $this->category, + 'name' => $this->name, + 'segment' => $this->segment, + 'sqlSegment' => $this->sqlSegment, + ); + + if (!empty($this->sqlFilter)) { + $segment['sqlFilter'] = $this->sqlFilter; + } + + if (!empty($this->sqlFilterValue)) { + $segment['sqlFilterValue'] = $this->sqlFilterValue; + } + + if (!empty($this->acceptValues)) { + $segment['acceptedValues'] = $this->acceptValues; + } + + return $segment; + } +} diff --git a/core/Plugin/ViewDataTable.php b/core/Plugin/ViewDataTable.php index 1643fd03ee..eb821dcb5c 100644 --- a/core/Plugin/ViewDataTable.php +++ b/core/Plugin/ViewDataTable.php @@ -191,6 +191,12 @@ abstract class ViewDataTable implements ViewInterface $this->requestConfig->apiMethodToRequestDataTable = $apiMethodToRequestDataTable; + $report = Report::factory($this->requestConfig->apiMethodToRequestDataTable); + + if (!empty($report)) { + $report->configureView($this); + } + /** * Triggered during {@link ViewDataTable} construction. Subscribers should customize * the view based on the report that is being displayed. diff --git a/core/Plugin/VisitDimension.php b/core/Plugin/VisitDimension.php index 73b454305c..b24420daad 100644 --- a/core/Plugin/VisitDimension.php +++ b/core/Plugin/VisitDimension.php @@ -20,15 +20,27 @@ abstract class VisitDimension { protected $name; - protected $trackerParam = ''; - protected $trackerType = ''; - protected $trackerDefault = ''; - protected $fieldName = ''; protected $fieldType = ''; + protected $segments = array(); + + public function __construct() + { + $this->init(); + } + + protected function init() + { + + } + public function install() { + if (empty($this->fieldName) || empty($this->fieldType)) { + return; + } + try { $sql = "ALTER TABLE `" . Common::prefixTable("log_visit") . "` ADD `$this->fieldName` $this->fieldType"; Db::exec($sql); @@ -40,12 +52,23 @@ abstract class VisitDimension } } - public function onNewVisit(Request $request, $visit) + protected function addSegment(Segment $segment) { - $params = array(); - // TODO $params = $request->getParams() - $value = Common::getRequestVar($this->trackerParam, $this->trackerDefault, $this->trackerType, $params); - return $value; + if (!empty($this->fieldName)) { + $segment->setSqlSegment('log_visit.' . $this->fieldName); + } + + $segment->setType('dimension'); + + $this->segments[] = $segment; + } + + /** + * @return Segment[] + */ + public function getSegments() + { + return $this->segments; } public function getFieldName() @@ -58,12 +81,12 @@ abstract class VisitDimension /** @return \Piwik\Plugin\VisitDimension[] */ public static function getAllDimensions() { - $manager = PluginManager::getInstance(); - $dimensions = $manager->findMultipleComponents('Dimensions', '\\Piwik\\Plugin\\VisitDimension'); - $instances = array(); - - foreach ($dimensions as $dimension) { - $instances[] = new $dimension(); + $plugins = PluginManager::getInstance()->getLoadedPlugins(); + $instances = array(); + foreach ($plugins as $plugin) { + foreach (self::getDimensions($plugin) as $instance) { + $instances[] = $instance; + } } return $instances; @@ -72,7 +95,7 @@ abstract class VisitDimension /** @return \Piwik\Plugin\VisitDimension[] */ public static function getDimensions(\Piwik\Plugin $plugin) { - $dimensions = $plugin->findMultipleComponents('Dimensions', '\\Piwik\\Plugin\\VisitDimension'); + $dimensions = $plugin->findMultipleComponents('Columns', '\\Piwik\\Plugin\\VisitDimension'); $instances = array(); foreach ($dimensions as $dimension) { diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php index 5174b48882..15950702fe 100644 --- a/core/Tracker/Visit.php +++ b/core/Tracker/Visit.php @@ -93,9 +93,9 @@ class Visit implements VisitInterface /** * Triggered after visits are tested for exclusion so plugins can modify the IP address * persisted with a visit. - * + * * This event is primarily used by the **PrivacyManager** plugin to anonymize IP addresses. - * + * * @param string &$ip The visitor's IP address. */ Piwik::postEvent('Tracker.setVisitorIp', array(&$this->visitorInfo['location_ip'])); @@ -253,10 +253,10 @@ class Visit implements VisitInterface /** * Triggered before a [visit entity](/guides/persistence-and-the-mysql-backend#visits) is updated when * tracking an action for an existing visit. - * + * * This event can be used to modify the visit properties that will be updated before the changes * are persisted. - * + * * @param array &$valuesToUpdate Visit entity properties that will be updated. * @param array $visit The entire visit entity. Read [this](/guides/persistence-and-the-mysql-backend#visits) * to see what it contains. @@ -307,7 +307,7 @@ class Visit implements VisitInterface /** * Triggered before a new [visit entity](/guides/persistence-and-the-mysql-backend#visits) is persisted. - * + * * This event can be used to modify the visit entity or add new information to it before it is persisted. * The UserCountry plugin, for example, uses this event to add location information for each visit. * @@ -319,7 +319,10 @@ class Visit implements VisitInterface $dimensions = VisitDimension::getAllDimensions(); foreach ($dimensions as $dimension) { - $this->visitorInfo[$dimension->getFieldName()] = $dimension->onNewVisit($this->request, $this->visitorInfo); + if (!method_exists($dimension, 'onNewVisit')) { + continue; + } + $this->visitorInfo[$dimension->getFieldName()] = $dimension->onNewVisit($this->request, $this->visitorInfo, $action); } $this->request->overrideLocation($this->visitorInfo); @@ -505,10 +508,8 @@ class Visit implements VisitInterface protected function getNewVisitorInformation($action) { - $actionType = $idActionName = $idActionUrl = false; + $actionType = false; if($action) { - $idActionUrl = $action->getIdActionUrlForEntryAndExitIds(); - $idActionName = $action->getIdActionNameForEntryAndExitIds(); $actionType = $action->getActionType(); } @@ -527,12 +528,6 @@ class Visit implements VisitInterface $userInfo = $this->getSettingsObject(); $userInfo = $userInfo->getInfo(); - // Referrer data - $referrer = new Referrer(); - $referrerUrl = $this->request->getParam('urlref'); - $currentUrl = $this->request->getParam('url'); - $referrerInfo = $referrer->getReferrerInformation($referrerUrl, $currentUrl, $this->request->getIdSite()); - $visitorReturning = $isReturningCustomer ? 2 /* Returning customer */ : ($visitCount > 1 || $this->isVisitorKnown() || $daysSinceLastVisit > 0 @@ -551,10 +546,6 @@ class Visit implements VisitInterface 'visitor_days_since_first' => $daysSinceFirstVisit, 'visit_first_action_time' => Tracker::getDatetimeFromTimestamp($this->request->getCurrentTimestamp()), 'visit_last_action_time' => Tracker::getDatetimeFromTimestamp($this->request->getCurrentTimestamp()), - 'visit_entry_idaction_url' => (int)$idActionUrl, - 'visit_entry_idaction_name' => (int)$idActionName, - 'visit_exit_idaction_url' => (int)$idActionUrl, - 'visit_exit_idaction_name' => (int)$idActionName, 'visit_total_actions' => in_array($actionType, array(Action::TYPE_PAGE_URL, Action::TYPE_DOWNLOAD, @@ -566,10 +557,6 @@ class Visit implements VisitInterface 'visit_total_events' => $actionType == Action::TYPE_EVENT ? 1 : 0, 'visit_total_time' => self::cleanupVisitTotalTime($defaultTimeOnePageVisit), 'visit_goal_buyer' => $this->goalManager->getBuyerType(), - 'referer_type' => $referrerInfo['referer_type'], - 'referer_name' => $referrerInfo['referer_name'], - 'referer_url' => $referrerInfo['referer_url'], - 'referer_keyword' => $referrerInfo['referer_keyword'], 'config_id' => $userInfo['config_id'], 'config_resolution' => $userInfo['config_resolution'], 'config_pdf' => $userInfo['config_pdf'], @@ -599,19 +586,15 @@ class Visit implements VisitInterface $valuesToUpdate = array(); if ($action) { + $actionType = $action->getActionType(); $idActionUrl = $action->getIdActionUrlForEntryAndExitIds(); - $idActionName = $action->getIdActionNameForEntryAndExitIds(); - $actionType = $action->getActionType(); - - if ($idActionName !== false) { - $valuesToUpdate['visit_exit_idaction_name'] = $idActionName; - } $incrementActions = false; + if ($idActionUrl !== false) { - $valuesToUpdate['visit_exit_idaction_url'] = $idActionUrl; $incrementActions = true; } + if ($actionType == Action::TYPE_SITE_SEARCH) { $valuesToUpdate['visit_total_searches'] = 'visit_total_searches + 1'; $incrementActions = true; @@ -659,6 +642,18 @@ class Visit implements VisitInterface $valuesToUpdate['visit_goal_buyer'] = $visitEcommerceStatus; } + $dimensions = VisitDimension::getAllDimensions(); + foreach ($dimensions as $dimension) { + if (!method_exists($dimension, 'onExistingVisit')) { + continue; + } + $value = $dimension->onExistingVisit($this->request, $this->visitorInfo, $action); + + if (false !== $value) { + $valuesToUpdate[$dimension->getFieldName()] = $value; + } + } + // Custom Variables overwrite previous values on each page view $valuesToUpdate = array_merge($valuesToUpdate, $this->visitorCustomVariables); return $valuesToUpdate; diff --git a/core/WidgetsList.php b/core/WidgetsList.php index 095c54cfd7..4051d8948a 100644 --- a/core/WidgetsList.php +++ b/core/WidgetsList.php @@ -9,6 +9,7 @@ namespace Piwik; use Piwik\Plugin\Manager as PluginManager; +use Piwik\Plugin\Report; /** * Manages the global list of reports that can be displayed as dashboard widgets. @@ -83,6 +84,10 @@ class WidgetsList extends Singleton $widgets = PluginManager::getInstance()->findComponents('Widgets', 'Piwik\\Plugin\\Widgets'); $widgetsList = self::getInstance(); + foreach (Report::getAllReports() as $report) { + $report->configureWidget($widgetsList); + } + foreach ($widgets as $widget) { $widget->configure($widgetsList); } diff --git a/plugins/API/API.php b/plugins/API/API.php index 0b972b9f61..726e92a3c0 100644 --- a/plugins/API/API.php +++ b/plugins/API/API.php @@ -15,15 +15,21 @@ use Piwik\DataTable; use Piwik\DataTable\Filter\ColumnDelete; use Piwik\DataTable\Row; use Piwik\Date; +use Piwik\Filesystem; +use Piwik\Menu\MenuReporting; use Piwik\Menu\MenuTop; use Piwik\Metrics; use Piwik\Period; use Piwik\Period\Range; use Piwik\Piwik; +use Piwik\Plugin\ActionDimension; +use Piwik\Plugin\VisitDimension; use Piwik\Plugins\CoreAdminHome\CustomLogo; +use Piwik\Tracker\Action; use Piwik\Tracker\GoalManager; use Piwik\Translate; use Piwik\Version; +use Piwik\WidgetsList; require_once PIWIK_INCLUDE_PATH . '/core/Config.php'; @@ -82,6 +88,18 @@ class API extends \Piwik\Plugin\API { $segments = array(); + foreach (VisitDimension::getAllDimensions() as $dimension) { + foreach ($dimension->getSegments() as $segment) { + $segments[] = $segment->toArray(); + } + } + + foreach (ActionDimension::getAllDimensions() as $dimension) { + foreach ($dimension->getSegments() as $segment) { + $segments[] = $segment->toArray(); + } + } + /** * Triggered when gathering all available segment dimensions. * @@ -396,6 +414,267 @@ class API extends \Piwik\Plugin\API return $metadata; } + public function gener() + { + $reports = array(); + $parameters = array(); + Piwik::postEvent('API.getReportMetadata', array(&$reports, $parameters)); + + $widgets = WidgetsList::getInstance()->get(); + $menus = MenuReporting::getInstance()->getMenu(); + + $path = PIWIK_INCLUDE_PATH . '/tmp/files'; + Filesystem::unlinkRecursive($path, true); + Filesystem::mkdir($path); + foreach ($reports as $report) { + $module = $report['module']; + $action = $report['action']; + $order = $report['order']; + + $className = ucfirst($action); + $moduleDir = $path . '/' . $module; + Filesystem::mkdir($moduleDir); + + + $configureView = "public function configureView(ViewDataTable \$view) + { + }"; + try { + $plugin = \Piwik\Plugin\Manager::getInstance()->getLoadedPlugin($module); + if (!empty($plugin)) { + $reflection = new \ReflectionObject($plugin); + $viewMethodToFind = 'configureViewFor' . ucfirst($action); + if ($reflection->hasMethod($viewMethodToFind)) { + $method = $reflection->getMethod($viewMethodToFind); + $method->setAccessible(true); + + $file = new \SplFileObject($method->getFileName()); + $fileIterator = new \LimitIterator($file, $method->getStartLine() - 1, $method->getEndLine() - $method->getStartLine() + 1); + $configureView = ''; + foreach($fileIterator as $line) { + $configureView .= $line; + } + $configureView = str_replace($viewMethodToFind, 'configureView', $configureView); + $configureView = str_replace('private function', 'public function', $configureView); + $configureView = ltrim($configureView); + + } + + } + } catch (\Exception $e) { + $plugin = null; + } + + $doc = ''; + if (!empty($report['documentation'])) { + $doc = $report['documentation']; + $doc = addslashes($doc); + } + + $subtable = ''; + if (!empty($report['actionToLoadSubTables'])) { + $subtable = $report['actionToLoadSubTables']; + } + + if (!empty($report['metrics'])) { + $metrics = "'" . implode("', '", array_keys($report['metrics'])) . "'"; + } else { + $metrics = ''; + } + + + $widgetTitle = ''; + foreach ($widgets as $widget) { + foreach ($widget as $item) { + if (empty($item['parameters']['module']) || empty($item['name']) || empty($item['parameters']['action'])) { + continue; + } + + if ($item['parameters']['module'] === $module && $item['parameters']['action'] === $action) { + $widgetTitle = $this->findTranslationKeyForFeatureName($item['name']); + break 2; + } + } + + } +/* + $menuTitle = ''; + foreach ($menus as $key => $submenu) { + foreach ($submenu as $menuItem) { + if (empty($menuItem['_url']) || empty($menuItem['_name'])) { + continue; + } + + if (empty($menuItem['_url']['module']) || empty($menuItem['_url']['action'])) { + continue; + } + + $action1 = $menuItem['_url']['action']; + $action2 = str_replace('get', 'index', $action); + + if ($menuItem['_url']['module'] === $module && in_array($action, array($action1, $action2))) { + $menuTitle = $this->findTranslationKeyForFeatureName($menuItem['_name']); + break 2; + } + } + } +var_dump($menuTitle);*/ + + $nameTranslationKey = $this->getEnglishTranslationForFeatureName($report['name']); + + $dimClass = null; + $dimension = null; + if (!empty($report['dimension'])) { + $dimension = $report['dimension']; + $columnsDir = $moduleDir . '/Columns'; + Filesystem::mkdir($columnsDir); + $dimClass = ucfirst(str_replace(' ' ,'', $dimension)); + $transKEy = $this->getEnglishTranslationForFeatureName($dimension); + + $content = <<<REF + <?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\\$module\Columns; + +use Piwik\Piwik; +use Piwik\Plugin\VisitDimension; + +class $dimClass extends VisitDimension +{ + public function getName() + { + return Piwik::translate('$transKEy'); + } +} +REF; + + file_put_contents($columnsDir . '/' . $dimClass . '.php', ltrim($content)); + + } + + $content = <<<OBJ +<?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\\$module\Reports; + +use Piwik\Piwik; +use Piwik\Plugin\ViewDataTable; +use Piwik\Plugins\\$module\Columns\\$dimClass; + +class $className extends Base +{ + protected function init() + { + parent::init(); +OBJ; + +$content = ltrim($content); + if (!empty($dimClass)) { + + $content .= " + \$this->dimension = new $dimClass();"; + } + + $content .= " + \$this->name = Piwik::translate('$nameTranslationKey'); + \$this->documentation = '$doc';"; + if (!empty($metrics)) { + $content .= " + \$this->metrics = array($metrics);"; + } + if (!empty($subtable)) { + $content .= " + \$this->actionToLoadSubTables = '$subtable';"; + } + $content .= " + \$this->order = $order;"; + if (!empty($widgetTitle)) { + $content .= " + \$this->widgetTitle = '$widgetTitle';"; + } + $content .= " + } + + " . $configureView . " +} +"; + + $dir = $moduleDir . '/Reports'; + Filesystem::mkdir($dir); + + file_put_contents($dir . '/' . $className . '.php', ltrim($content)); + + + + if (!file_exists($dir . '/Base.php')) { + $category = $this->findTranslationKeyForFeatureName($report['category']); +$baseContent = <<<OBJ +<?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\\$module\Reports; + +abstract class Base extends \Piwik\Plugin\Report +{ + protected function init() + { + \$this->category = '$category'; + } + +} + +OBJ; + + file_put_contents($dir . '/Base.php', ltrim($baseContent)); + + } + } + } + + private function getEnglishTranslationForFeatureName($featureName) + { + Translate::reloadLanguage('en'); + + $translationKeyForFeature = $this->findTranslationKeyForFeatureName($featureName); + + if (!empty($translationKeyForFeature)) { + return $translationKeyForFeature; + } + + return $featureName; + } + + private function findTranslationKeyForFeatureName($featureName) + { + if (empty($GLOBALS['Piwik_translations'])) { + return; + } + + foreach ($GLOBALS['Piwik_translations'] as $key => $translations) { + $possibleKey = array_search($featureName, $translations); + if (!empty($possibleKey)) { + return $key . '_' . $possibleKey; + } + } + } + public function getProcessedReport($idSite, $period, $date, $apiModule, $apiAction, $segment = false, $apiParameters = false, $idGoal = false, $language = false, $showTimer = true, $hideMetricsDoc = false, $idSubtable = false, $showRawMetrics = false) diff --git a/plugins/API/ProcessedReport.php b/plugins/API/ProcessedReport.php index 5c655d323c..c178f9f8e6 100644 --- a/plugins/API/ProcessedReport.php +++ b/plugins/API/ProcessedReport.php @@ -20,6 +20,7 @@ use Piwik\Metrics; use Piwik\MetricsFormatter; use Piwik\Period; use Piwik\Piwik; +use Piwik\Plugin\Report; use Piwik\Site; use Piwik\Timer; use Piwik\Url; @@ -152,6 +153,10 @@ class ProcessedReport $availableReports = array(); + foreach (Report::getAllReports() as $report) { + $availableReports[] = $report->toArray(); + } + /** * Triggered when gathering metadata for all available reports. * @@ -198,6 +203,7 @@ class ProcessedReport * TODO: put dimensions section in all about analytics data */ Piwik::postEvent('API.getReportMetadata', array(&$availableReports, $parameters)); + foreach ($availableReports as &$availableReport) { if (!isset($availableReport['metrics'])) { $availableReport['metrics'] = Metrics::getDefaultMetrics(); diff --git a/plugins/Actions/Actions.php b/plugins/Actions/Actions.php index 5df2b98ec3..139c8f93cb 100644 --- a/plugins/Actions/Actions.php +++ b/plugins/Actions/Actions.php @@ -35,7 +35,6 @@ class Actions extends \Piwik\Plugin { $hooks = array( 'API.getReportMetadata' => 'getReportMetadata', - 'API.getSegmentDimensionMetadata' => 'getSegmentsMetadata', 'ViewDataTable.configure' => 'configureViewDataTable', 'AssetManager.getStylesheetFiles' => 'getStylesheetFiles', 'AssetManager.getJavaScriptFiles' => 'getJsFiles', @@ -61,294 +60,8 @@ class Actions extends \Piwik\Plugin $jsFiles[] = "plugins/Actions/javascripts/actionsDataTable.js"; } - public function getSegmentsMetadata(&$segments) - { - $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment'; - - // entry and exit pages of visit - $segments[] = array( - 'type' => 'dimension', - 'category' => 'General_Actions', - 'name' => 'Actions_ColumnEntryPageURL', - 'segment' => 'entryPageUrl', - 'sqlSegment' => 'log_visit.visit_entry_idaction_url', - 'sqlFilter' => $sqlFilter, - ); - $segments[] = array( - 'type' => 'dimension', - 'category' => 'General_Actions', - 'name' => 'Actions_ColumnEntryPageTitle', - 'segment' => 'entryPageTitle', - 'sqlSegment' => 'log_visit.visit_entry_idaction_name', - 'sqlFilter' => $sqlFilter, - ); - $segments[] = array( - 'type' => 'dimension', - 'category' => 'General_Actions', - 'name' => 'Actions_ColumnExitPageURL', - 'segment' => 'exitPageUrl', - 'sqlSegment' => 'log_visit.visit_exit_idaction_url', - 'sqlFilter' => $sqlFilter, - ); - $segments[] = array( - 'type' => 'dimension', - 'category' => 'General_Actions', - 'name' => 'Actions_ColumnExitPageTitle', - 'segment' => 'exitPageTitle', - 'sqlSegment' => 'log_visit.visit_exit_idaction_name', - 'sqlFilter' => $sqlFilter, - ); - - // single pages - $segments[] = array( - 'type' => 'dimension', - 'category' => 'General_Actions', - 'name' => 'Actions_ColumnPageURL', - 'segment' => 'pageUrl', - 'sqlSegment' => 'log_link_visit_action.idaction_url', - 'sqlFilter' => $sqlFilter, - 'acceptedValues' => "All these segments must be URL encoded, for example: " . urlencode('http://example.com/path/page?query'), - ); - $segments[] = array( - 'type' => 'dimension', - 'category' => 'General_Actions', - 'name' => 'Actions_ColumnPageName', - 'segment' => 'pageTitle', - 'sqlSegment' => 'log_link_visit_action.idaction_name', - 'sqlFilter' => $sqlFilter, - ); - $segments[] = array( - 'type' => 'dimension', - 'category' => 'General_Actions', - 'name' => 'Actions_SiteSearchKeyword', - 'segment' => 'siteSearchKeyword', - 'sqlSegment' => 'log_link_visit_action.idaction_name', - 'sqlFilter' => $sqlFilter, - ); - } - public function getReportMetadata(&$reports) { - $reports[] = array( - 'category' => Piwik::translate('General_Actions'), - 'name' => Piwik::translate('General_Actions') . ' - ' . Piwik::translate('General_MainMetrics'), - 'module' => 'Actions', - 'action' => 'get', - 'metrics' => array( - 'nb_pageviews' => Piwik::translate('General_ColumnPageviews'), - 'nb_uniq_pageviews' => Piwik::translate('General_ColumnUniquePageviews'), - 'nb_downloads' => Piwik::translate('General_Downloads'), - 'nb_uniq_downloads' => Piwik::translate('Actions_ColumnUniqueDownloads'), - 'nb_outlinks' => Piwik::translate('General_Outlinks'), - 'nb_uniq_outlinks' => Piwik::translate('Actions_ColumnUniqueOutlinks'), - 'nb_searches' => Piwik::translate('Actions_ColumnSearches'), - 'nb_keywords' => Piwik::translate('Actions_ColumnSiteSearchKeywords'), - 'avg_time_generation' => Piwik::translate('General_ColumnAverageGenerationTime'), - ), - 'metricsDocumentation' => array( - 'nb_pageviews' => Piwik::translate('General_ColumnPageviewsDocumentation'), - 'nb_uniq_pageviews' => Piwik::translate('General_ColumnUniquePageviewsDocumentation'), - 'nb_downloads' => Piwik::translate('Actions_ColumnClicksDocumentation'), - 'nb_uniq_downloads' => Piwik::translate('Actions_ColumnUniqueClicksDocumentation'), - 'nb_outlinks' => Piwik::translate('Actions_ColumnClicksDocumentation'), - 'nb_uniq_outlinks' => Piwik::translate('Actions_ColumnUniqueClicksDocumentation'), - 'nb_searches' => Piwik::translate('Actions_ColumnSearchesDocumentation'), - 'avg_time_generation' => Piwik::translate('General_ColumnAverageGenerationTimeDocumentation'), -// 'nb_keywords' => Piwik::translate('Actions_ColumnSiteSearchKeywords'), - ), - 'processedMetrics' => false, - 'order' => 1 - ); - - $metrics = array( - 'nb_hits' => Piwik::translate('General_ColumnPageviews'), - 'nb_visits' => Piwik::translate('General_ColumnUniquePageviews'), - 'bounce_rate' => Piwik::translate('General_ColumnBounceRate'), - 'avg_time_on_page' => Piwik::translate('General_ColumnAverageTimeOnPage'), - 'exit_rate' => Piwik::translate('General_ColumnExitRate'), - 'avg_time_generation' => Piwik::translate('General_ColumnAverageGenerationTime') - ); - - $documentation = array( - 'nb_hits' => Piwik::translate('General_ColumnPageviewsDocumentation'), - 'nb_visits' => Piwik::translate('General_ColumnUniquePageviewsDocumentation'), - 'bounce_rate' => Piwik::translate('General_ColumnPageBounceRateDocumentation'), - 'avg_time_on_page' => Piwik::translate('General_ColumnAverageTimeOnPageDocumentation'), - 'exit_rate' => Piwik::translate('General_ColumnExitRateDocumentation'), - 'avg_time_generation' => Piwik::translate('General_ColumnAverageGenerationTimeDocumentation'), - ); - - // pages report - $reports[] = array( - 'category' => Piwik::translate('General_Actions'), - 'name' => Piwik::translate('Actions_PageUrls'), - 'module' => 'Actions', - 'action' => 'getPageUrls', - 'dimension' => Piwik::translate('Actions_ColumnPageURL'), - 'metrics' => $metrics, - 'metricsDocumentation' => $documentation, - 'documentation' => Piwik::translate('Actions_PagesReportDocumentation', '<br />') - . '<br />' . Piwik::translate('General_UsePlusMinusIconsDocumentation'), - 'processedMetrics' => false, - 'actionToLoadSubTables' => 'getPageUrls', - 'order' => 2 - ); - - // entry pages report - $reports[] = array( - 'category' => Piwik::translate('General_Actions'), - 'name' => Piwik::translate('Actions_SubmenuPagesEntry'), - 'module' => 'Actions', - 'action' => 'getEntryPageUrls', - 'dimension' => Piwik::translate('Actions_ColumnPageURL'), - 'metrics' => array( - 'entry_nb_visits' => Piwik::translate('General_ColumnEntrances'), - 'entry_bounce_count' => Piwik::translate('General_ColumnBounces'), - 'bounce_rate' => Piwik::translate('General_ColumnBounceRate'), - ), - 'metricsDocumentation' => array( - 'entry_nb_visits' => Piwik::translate('General_ColumnEntrancesDocumentation'), - 'entry_bounce_count' => Piwik::translate('General_ColumnBouncesDocumentation'), - 'bounce_rate' => Piwik::translate('General_ColumnBounceRateForPageDocumentation') - ), - 'documentation' => Piwik::translate('Actions_EntryPagesReportDocumentation', '<br />') - . ' ' . Piwik::translate('General_UsePlusMinusIconsDocumentation'), - 'processedMetrics' => false, - 'actionToLoadSubTables' => 'getEntryPageUrls', - 'order' => 3 - ); - - // exit pages report - $reports[] = array( - 'category' => Piwik::translate('General_Actions'), - 'name' => Piwik::translate('Actions_SubmenuPagesExit'), - 'module' => 'Actions', - 'action' => 'getExitPageUrls', - 'dimension' => Piwik::translate('Actions_ColumnPageURL'), - 'metrics' => array( - 'exit_nb_visits' => Piwik::translate('General_ColumnExits'), - 'nb_visits' => Piwik::translate('General_ColumnUniquePageviews'), - 'exit_rate' => Piwik::translate('General_ColumnExitRate') - ), - 'metricsDocumentation' => array( - 'exit_nb_visits' => Piwik::translate('General_ColumnExitsDocumentation'), - 'nb_visits' => Piwik::translate('General_ColumnUniquePageviewsDocumentation'), - 'exit_rate' => Piwik::translate('General_ColumnExitRateDocumentation') - ), - 'documentation' => Piwik::translate('Actions_ExitPagesReportDocumentation', '<br />') - . ' ' . Piwik::translate('General_UsePlusMinusIconsDocumentation'), - 'processedMetrics' => false, - 'actionToLoadSubTables' => 'getExitPageUrls', - 'order' => 4 - ); - - // page titles report - $reports[] = array( - 'category' => Piwik::translate('General_Actions'), - 'name' => Piwik::translate('Actions_SubmenuPageTitles'), - 'module' => 'Actions', - 'action' => 'getPageTitles', - 'dimension' => Piwik::translate('Actions_ColumnPageName'), - 'metrics' => $metrics, - 'metricsDocumentation' => $documentation, - 'documentation' => Piwik::translate('Actions_PageTitlesReportDocumentation', array('<br />', htmlentities('<title>'))), - 'processedMetrics' => false, - 'actionToLoadSubTables' => 'getPageTitles', - 'order' => 5, - - ); - - // entry page titles report - $reports[] = array( - 'category' => Piwik::translate('General_Actions'), - 'name' => Piwik::translate('Actions_EntryPageTitles'), - 'module' => 'Actions', - 'action' => 'getEntryPageTitles', - 'dimension' => Piwik::translate('Actions_ColumnPageName'), - 'metrics' => array( - 'entry_nb_visits' => Piwik::translate('General_ColumnEntrances'), - 'entry_bounce_count' => Piwik::translate('General_ColumnBounces'), - 'bounce_rate' => Piwik::translate('General_ColumnBounceRate'), - ), - 'metricsDocumentation' => array( - 'entry_nb_visits' => Piwik::translate('General_ColumnEntrancesDocumentation'), - 'entry_bounce_count' => Piwik::translate('General_ColumnBouncesDocumentation'), - 'bounce_rate' => Piwik::translate('General_ColumnBounceRateForPageDocumentation') - ), - 'documentation' => Piwik::translate('Actions_ExitPageTitlesReportDocumentation', '<br />') - . ' ' . Piwik::translate('General_UsePlusMinusIconsDocumentation'), - 'processedMetrics' => false, - 'actionToLoadSubTables' => 'getEntryPageTitles', - 'order' => 6 - ); - - // exit page titles report - $reports[] = array( - 'category' => Piwik::translate('General_Actions'), - 'name' => Piwik::translate('Actions_ExitPageTitles'), - 'module' => 'Actions', - 'action' => 'getExitPageTitles', - 'dimension' => Piwik::translate('Actions_ColumnPageName'), - 'metrics' => array( - 'exit_nb_visits' => Piwik::translate('General_ColumnExits'), - 'nb_visits' => Piwik::translate('General_ColumnUniquePageviews'), - 'exit_rate' => Piwik::translate('General_ColumnExitRate') - ), - 'metricsDocumentation' => array( - 'exit_nb_visits' => Piwik::translate('General_ColumnExitsDocumentation'), - 'nb_visits' => Piwik::translate('General_ColumnUniquePageviewsDocumentation'), - 'exit_rate' => Piwik::translate('General_ColumnExitRateDocumentation') - ), - 'documentation' => Piwik::translate('Actions_EntryPageTitlesReportDocumentation', '<br />') - . ' ' . Piwik::translate('General_UsePlusMinusIconsDocumentation'), - 'processedMetrics' => false, - 'actionToLoadSubTables' => 'getExitPageTitles', - 'order' => 7 - ); - - $documentation = array( - 'nb_visits' => Piwik::translate('Actions_ColumnUniqueClicksDocumentation'), - 'nb_hits' => Piwik::translate('Actions_ColumnClicksDocumentation') - ); - - // outlinks report - $reports[] = array( - 'category' => Piwik::translate('General_Actions'), - 'name' => Piwik::translate('General_Outlinks'), - 'module' => 'Actions', - 'action' => 'getOutlinks', - 'dimension' => Piwik::translate('Actions_ColumnClickedURL'), - 'metrics' => array( - 'nb_visits' => Piwik::translate('Actions_ColumnUniqueClicks'), - 'nb_hits' => Piwik::translate('Actions_ColumnClicks') - ), - 'metricsDocumentation' => $documentation, - 'documentation' => Piwik::translate('Actions_OutlinksReportDocumentation') . ' ' - . Piwik::translate('Actions_OutlinkDocumentation') . '<br />' - . Piwik::translate('General_UsePlusMinusIconsDocumentation'), - 'processedMetrics' => false, - 'actionToLoadSubTables' => 'getOutlinks', - 'order' => 8, - ); - - // downloads report - $reports[] = array( - 'category' => Piwik::translate('General_Actions'), - 'name' => Piwik::translate('General_Downloads'), - 'module' => 'Actions', - 'action' => 'getDownloads', - 'dimension' => Piwik::translate('Actions_ColumnDownloadURL'), - 'metrics' => array( - 'nb_visits' => Piwik::translate('Actions_ColumnUniqueDownloads'), - 'nb_hits' => Piwik::translate('General_Downloads') - ), - 'metricsDocumentation' => $documentation, - 'documentation' => Piwik::translate('Actions_DownloadsReportDocumentation', '<br />'), - 'processedMetrics' => false, - 'actionToLoadSubTables' => 'getDownloads', - 'order' => 9, - ); - if ($this->isSiteSearchEnabled()) { // Search Keywords $reports[] = array( @@ -496,15 +209,6 @@ class Actions extends \Piwik\Plugin public function configureViewDataTable(ViewDataTable $view) { switch ($view->requestConfig->apiMethodToRequestDataTable) { - case 'Actions.getPageUrls': - $this->configureViewForPageUrls($view); - break; - case 'Actions.getEntryPageUrls': - $this->configureViewForEntryPageUrls($view); - break; - case 'Actions.getExitPageUrls': - $this->configureViewForExitPageUrls($view); - break; case 'Actions.getSiteSearchKeywords': $this->configureViewForSiteSearchKeywords($view); break; @@ -520,21 +224,6 @@ class Actions extends \Piwik\Plugin case 'Actions.getPageTitlesFollowingSiteSearch': $this->configureViewForGetPageUrlsOrTitlesFollowingSiteSearch($view, true); break; - case 'Actions.getPageTitles': - $this->configureViewForGetPageTitles($view); - break; - case 'Actions.getEntryPageTitles': - $this->configureViewForGetEntryPageTitles($view); - break; - case 'Actions.getExitPageTitles': - $this->configureViewForGetExitPageTitles($view); - break; - case 'Actions.getDownloads': - $this->configureViewForGetDownloads($view); - break; - case 'Actions.getOutlinks': - $this->configureViewForGetOutlinks($view); - break; } if ($this->pluginName == $view->requestConfig->getApiModuleToRequest()) { @@ -611,113 +300,6 @@ class Actions extends \Piwik\Plugin } } - private function addPageDisplayProperties(ViewDataTable $view) - { - $view->config->addTranslations(array( - 'nb_hits' => Piwik::translate('General_ColumnPageviews'), - 'nb_visits' => Piwik::translate('General_ColumnUniquePageviews'), - 'avg_time_on_page' => Piwik::translate('General_ColumnAverageTimeOnPage'), - 'bounce_rate' => Piwik::translate('General_ColumnBounceRate'), - 'exit_rate' => Piwik::translate('General_ColumnExitRate'), - 'avg_time_generation' => Piwik::translate('General_ColumnAverageGenerationTime'), - )); - - // prettify avg_time_on_page column - $getPrettyTimeFromSeconds = '\Piwik\MetricsFormatter::getPrettyTimeFromSeconds'; - $view->config->filters[] = array('ColumnCallbackReplace', array('avg_time_on_page', $getPrettyTimeFromSeconds)); - - // prettify avg_time_generation column - $avgTimeCallback = function ($time) { - return $time ? MetricsFormatter::getPrettyTimeFromSeconds($time, true, true, false) : "-"; - }; - $view->config->filters[] = array('ColumnCallbackReplace', array('avg_time_generation', $avgTimeCallback)); - - // add avg_generation_time tooltip - $tooltipCallback = function ($hits, $min, $max) { - if (!$hits) { - return false; - } - - return Piwik::translate("Actions_AvgGenerationTimeTooltip", array( - $hits, - "<br />", - MetricsFormatter::getPrettyTimeFromSeconds($min), - MetricsFormatter::getPrettyTimeFromSeconds($max) - )); - }; - $view->config->filters[] = array('ColumnCallbackAddMetadata', - array( - array('nb_hits_with_time_generation', 'min_time_generation', 'max_time_generation'), - 'avg_time_generation_tooltip', - $tooltipCallback - ) - ); - - $this->addExcludeLowPopDisplayProperties($view); - } - - public function configureViewForPageUrls(ViewDataTable $view) - { - $view->config->addTranslation('label', Piwik::translate('Actions_ColumnPageURL')); - $view->config->columns_to_display = array('label', 'nb_hits', 'nb_visits', 'bounce_rate', - 'avg_time_on_page', 'exit_rate', 'avg_time_generation'); - - $this->addPageDisplayProperties($view); - $this->addBaseDisplayProperties($view); - } - - public function configureViewForEntryPageUrls(ViewDataTable $view) - { - // link to the page, not just the report, but only if not a widget - $widget = Common::getRequestVar('widget', false); - - $view->config->self_url = Request::getCurrentUrlWithoutGenericFilters(array( - 'module' => 'Actions', - 'action' => $widget === false ? 'indexEntryPageUrls' : 'getEntryPageUrls' - )); - - $view->config->addTranslations(array( - 'label' => Piwik::translate('Actions_ColumnEntryPageURL'), - 'entry_bounce_count' => Piwik::translate('General_ColumnBounces'), - 'entry_nb_visits' => Piwik::translate('General_ColumnEntrances')) - ); - - $view->config->title = Piwik::translate('Actions_SubmenuPagesEntry'); - $view->config->addRelatedReport('Actions.getEntryPageTitles', Piwik::translate('Actions_EntryPageTitles')); - $view->config->columns_to_display = array('label', 'entry_nb_visits', 'entry_bounce_count', 'bounce_rate'); - $view->requestConfig->filter_sort_column = 'entry_nb_visits'; - $view->requestConfig->filter_sort_order = 'desc'; - - $this->addPageDisplayProperties($view); - $this->addBaseDisplayProperties($view); - } - - public function configureViewForExitPageUrls(ViewDataTable $view) - { - // link to the page, not just the report, but only if not a widget - $widget = Common::getRequestVar('widget', false); - - $view->config->self_url = Request::getCurrentUrlWithoutGenericFilters(array( - 'module' => 'Actions', - 'action' => $widget === false ? 'indexExitPageUrls' : 'getExitPageUrls' - )); - - $view->config->addTranslations(array( - 'label' => Piwik::translate('Actions_ColumnExitPageURL'), - 'exit_nb_visits' => Piwik::translate('General_ColumnExits')) - ); - - $view->config->title = Piwik::translate('Actions_SubmenuPagesExit'); - $view->config->addRelatedReport('Actions.getExitPageTitles', Piwik::translate('Actions_ExitPageTitles')); - - $view->config->columns_to_display = array('label', 'exit_nb_visits', 'nb_visits', 'exit_rate'); - $view->requestConfig->filter_sort_column = 'exit_nb_visits'; - $view->requestConfig->filter_sort_order = 'desc'; - - $this->addPageDisplayProperties($view); - $this->addBaseDisplayProperties($view); - } - private function addSiteSearchDisplayProperties(ViewDataTable $view) { $view->config->addTranslations(array( @@ -790,101 +372,5 @@ class Actions extends \Piwik\Plugin $this->addBaseDisplayProperties($view); } - public function configureViewForGetPageTitles(ViewDataTable $view) - { - // link to the page, not just the report, but only if not a widget - $widget = Common::getRequestVar('widget', false); - - $view->config->self_url = Request::getCurrentUrlWithoutGenericFilters(array( - 'module' => 'Actions', - 'action' => $widget === false ? 'indexPageTitles' : 'getPageTitles' - )); - - $view->config->title = Piwik::translate('Actions_SubmenuPageTitles'); - $view->config->addRelatedReports(array( - 'Actions.getEntryPageTitles' => Piwik::translate('Actions_EntryPageTitles'), - 'Actions.getExitPageTitles' => Piwik::translate('Actions_ExitPageTitles'), - )); - - $view->config->addTranslation('label', Piwik::translate('Actions_ColumnPageName')); - $view->config->columns_to_display = array('label', 'nb_hits', 'nb_visits', 'bounce_rate', - 'avg_time_on_page', 'exit_rate', 'avg_time_generation'); - - $this->addPageDisplayProperties($view); - $this->addBaseDisplayProperties($view); - } - - public function configureViewForGetEntryPageTitles(ViewDataTable $view) - { - $entryPageUrlAction = - Common::getRequestVar('widget', false) === false ? 'indexEntryPageUrls' : 'getEntryPageUrls'; - - $view->config->addTranslations(array( - 'label' => Piwik::translate('Actions_ColumnEntryPageTitle'), - 'entry_bounce_count' => Piwik::translate('General_ColumnBounces'), - 'entry_nb_visits' => Piwik::translate('General_ColumnEntrances'), - )); - $view->config->addRelatedReports(array( - 'Actions.getPageTitles' => Piwik::translate('Actions_SubmenuPageTitles'), - "Actions.$entryPageUrlAction" => Piwik::translate('Actions_SubmenuPagesEntry') - )); - - $view->config->columns_to_display = array('label', 'entry_nb_visits', 'entry_bounce_count', 'bounce_rate'); - $view->config->title = Piwik::translate('Actions_EntryPageTitles'); - - $view->requestConfig->filter_sort_column = 'entry_nb_visits'; - - $this->addPageDisplayProperties($view); - $this->addBaseDisplayProperties($view); - } - - public function configureViewForGetExitPageTitles(ViewDataTable $view) - { - $exitPageUrlAction = - Common::getRequestVar('widget', false) === false ? 'indexExitPageUrls' : 'getExitPageUrls'; - - $view->config->addTranslations(array( - 'label' => Piwik::translate('Actions_ColumnExitPageTitle'), - 'exit_nb_visits' => Piwik::translate('General_ColumnExits'), - )); - $view->config->addRelatedReports(array( - 'Actions.getPageTitles' => Piwik::translate('Actions_SubmenuPageTitles'), - "Actions.$exitPageUrlAction" => Piwik::translate('Actions_SubmenuPagesExit'), - )); - - $view->config->title = Piwik::translate('Actions_ExitPageTitles'); - $view->config->columns_to_display = array('label', 'exit_nb_visits', 'nb_visits', 'exit_rate'); - - $this->addPageDisplayProperties($view); - $this->addBaseDisplayProperties($view); - } - - public function configureViewForGetDownloads(ViewDataTable $view) - { - $view->config->addTranslations(array( - 'label' => Piwik::translate('Actions_ColumnDownloadURL'), - 'nb_visits' => Piwik::translate('Actions_ColumnUniqueDownloads'), - 'nb_hits' => Piwik::translate('General_Downloads'), - )); - - $view->config->columns_to_display = array('label', 'nb_visits', 'nb_hits'); - $view->config->show_exclude_low_population = false; - - $this->addBaseDisplayProperties($view); - } - - public function configureViewForGetOutlinks(ViewDataTable $view) - { - $view->config->addTranslations(array( - 'label' => Piwik::translate('Actions_ColumnClickedURL'), - 'nb_visits' => Piwik::translate('Actions_ColumnUniqueClicks'), - 'nb_hits' => Piwik::translate('Actions_ColumnClicks'), - )); - - $view->config->columns_to_display = array('label', 'nb_visits', 'nb_hits'); - $view->config->show_exclude_low_population = false; - - $this->addBaseDisplayProperties($view); - } } diff --git a/plugins/Actions/Columns/ClickedUrl.php b/plugins/Actions/Columns/ClickedUrl.php new file mode 100644 index 0000000000..f5d14fb5df --- /dev/null +++ b/plugins/Actions/Columns/ClickedUrl.php @@ -0,0 +1,48 @@ +<?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\Actions\Columns; + +use Piwik\Piwik; +use Piwik\Plugin\ActionDimension; +use Piwik\Plugin\VisitDimension; +use Piwik\Tracker\Request; +use Piwik\Tracker\TableLogAction; + +class ClickedUrl extends ActionDimension +{ + public function getName() + { + return Piwik::translate('Actions_ColumnClickedURL'); + } +/* + public function shouldHandleAction(Request $request) + { + $link = $request->getParam('link'); + + return !empty($link); + } + + public function getValue(Request $request) + { + $url = $request->getParam('link'); + + $ids = TableLogAction::loadIdsAction(array('idaction_url' => array($url, $this->getActionId()))); + + if (empty($ids['idaction_url'])) { + return false; + } + + return (int) $ids['idaction_url']; + } + + public function getActionId() + { + return 2; + }*/ +} diff --git a/plugins/Actions/Columns/DownloadUrl.php b/plugins/Actions/Columns/DownloadUrl.php new file mode 100644 index 0000000000..bfccd19d44 --- /dev/null +++ b/plugins/Actions/Columns/DownloadUrl.php @@ -0,0 +1,48 @@ +<?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\Actions\Columns; + +use Piwik\Piwik; +use Piwik\Plugin\ActionDimension; +use Piwik\Plugin\VisitDimension; +use Piwik\Tracker\Request; +use Piwik\Tracker\TableLogAction; + +class DownloadUrl extends ActionDimension +{ + public function getName() + { + return Piwik::translate('Actions_ColumnDownloadURL'); + } +/* + public function shouldHandleAction(Request $request) + { + $download = $request->getParam('download'); + + return !empty($download); + } + + public function getValue(Request $request) + { + $url = $request->getParam('download'); + + $ids = TableLogAction::loadIdsAction(array('idaction_url' => array($url, $this->getActionId()))); + + if (empty($ids['idaction_url'])) { + return false; + } + + return (int) $ids['idaction_url']; + } + + public function getActionId() + { + return 3; + }*/ +} diff --git a/plugins/Actions/Columns/EntryPageTitle.php b/plugins/Actions/Columns/EntryPageTitle.php new file mode 100644 index 0000000000..5df614f9e1 --- /dev/null +++ b/plugins/Actions/Columns/EntryPageTitle.php @@ -0,0 +1,51 @@ +<?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\Actions\Columns; + +use Piwik\Piwik; +use Piwik\Plugins\Actions\Segment; +use Piwik\Plugin\VisitDimension; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; + +class EntryPageTitle extends VisitDimension +{ + protected $fieldName = 'visit_entry_idaction_name'; + protected $fieldType = 'INTEGER(11) UNSIGNED NOT NULL'; + + protected function init() + { + $segment = new Segment(); + $segment->setSegment('entryPageTitle'); + $segment->setName('Actions_ColumnEntryPageTitle'); + $this->addSegment($segment); + } + + /** + * @param Request $request + * @param $visit + * @param Action|null $action + * @return bool + */ + public function onNewVisit(Request $request, $visit, $action) + { + $idActionName = false; + + if (!empty($action)) { + $idActionName = $action->getIdActionNameForEntryAndExitIds(); + } + + return (int) $idActionName; + } + + public function getName() + { + return Piwik::translate('Actions_ColumnEntryPageTitle'); + } +} diff --git a/plugins/Actions/Columns/EntryPageUrl.php b/plugins/Actions/Columns/EntryPageUrl.php new file mode 100644 index 0000000000..b2b9ea0c5c --- /dev/null +++ b/plugins/Actions/Columns/EntryPageUrl.php @@ -0,0 +1,52 @@ +<?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\Actions\Columns; + +use Piwik\Piwik; +use Piwik\Plugins\Actions\Segment; +use Piwik\Plugin\VisitDimension; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; + +class EntryPageUrl extends VisitDimension +{ + protected $fieldName = 'visit_entry_idaction_url'; + protected $fieldType = 'INTEGER(11) UNSIGNED NOT NULL'; + + protected function init() + { + $segment = new Segment(); + $segment->setSegment('entryPageUrl'); + $segment->setName('Actions_ColumnEntryPageURL'); + $this->addSegment($segment); + } + + /** + * @param Request $request + * @param $visit + * @param Action|null $action + * @return bool + */ + public function onNewVisit(Request $request, $visit, $action) + { + $idActionUrl = false; + + if (!empty($action)) { + $idActionUrl = $action->getIdActionUrlForEntryAndExitIds(); + } + + return (int) $idActionUrl; + } + + public function getName() + { + return Piwik::translate('Actions_ColumnEntryPageURL'); + } + +} diff --git a/plugins/Actions/Columns/ExitPageTitle.php b/plugins/Actions/Columns/ExitPageTitle.php new file mode 100644 index 0000000000..7890c49a09 --- /dev/null +++ b/plugins/Actions/Columns/ExitPageTitle.php @@ -0,0 +1,60 @@ +<?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\Actions\Columns; + +use Piwik\Piwik; +use Piwik\Plugins\Actions\Segment; +use Piwik\Plugin\VisitDimension; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; + +class ExitPageTitle extends VisitDimension +{ + protected $fieldName = 'visit_exit_idaction_name'; + protected $fieldType = 'INTEGER(11) UNSIGNED NOT NULL'; + + protected function init() + { + $segment = new Segment(); + $segment->setSegment('exitPageTitle'); + $segment->setName('Actions_ColumnExitPageTitle'); + $this->addSegment($segment); + } + + /** + * @param Request $request + * @param $visit + * @param Action|null $action + * @return bool + */ + public function onNewVisit(Request $request, $visit, $action) + { + $idActionName = false; + + if (!empty($action)) { + $idActionName = $action->getIdActionNameForEntryAndExitIds(); + } + + return (int) $idActionName; + } + + public function onExistingVisit(Request $request, $visit, $action) + { + if (!empty($action)) { + return (int) $action->getIdActionNameForEntryAndExitIds(); + } + + return false; + } + + public function getName() + { + return Piwik::translate('Actions_ColumnExitPageTitle'); + } +} diff --git a/plugins/Actions/Columns/ExitPageUrl.php b/plugins/Actions/Columns/ExitPageUrl.php new file mode 100644 index 0000000000..e8267dd537 --- /dev/null +++ b/plugins/Actions/Columns/ExitPageUrl.php @@ -0,0 +1,60 @@ +<?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\Actions\Columns; + +use Piwik\Piwik; +use Piwik\Plugins\Actions\Segment; +use Piwik\Plugin\VisitDimension; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; + +class ExitPageUrl extends VisitDimension +{ + protected $fieldName = 'visit_exit_idaction_url'; + protected $fieldType = 'INTEGER(11) UNSIGNED NULL DEFAULT 0'; + + protected function init() + { + $segment = new Segment(); + $segment->setSegment('exitPageUrl'); + $segment->setName('Actions_ColumnExitPageURL'); + $this->addSegment($segment); + } + + /** + * @param Request $request + * @param $visit + * @param Action|null $action + * @return bool + */ + public function onNewVisit(Request $request, $visit, $action) + { + $idActionUrl = false; + + if (!empty($action)) { + $idActionUrl = $action->getIdActionUrlForEntryAndExitIds(); + } + + return (int) $idActionUrl; + } + + public function onExistingVisit(Request $request, $visit, $action) + { + if (!empty($action)) { + return (int) $action->getIdActionUrlForEntryAndExitIds(); + } + + return false; + } + + public function getName() + { + return Piwik::translate('Actions_ColumnExitPageURL'); + } +} diff --git a/plugins/Actions/Columns/PageTitle.php b/plugins/Actions/Columns/PageTitle.php new file mode 100644 index 0000000000..2b0385717b --- /dev/null +++ b/plugins/Actions/Columns/PageTitle.php @@ -0,0 +1,43 @@ +<?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\Actions\Columns; + +use Piwik\Piwik; +use Piwik\Plugin\ActionDimension; +use Piwik\Plugins\Actions\Segment; +use Piwik\Tracker\Request; + +class PageTitle extends ActionDimension +{ + protected $fieldName = 'idaction_name'; + protected $fieldType = 'INTEGER(10) UNSIGNED'; + + protected function init() + { + $segment = new Segment(); + $segment->setSegment('pageTitle'); + $segment->setName('Actions_ColumnPageName'); + $this->addSegment($segment); + } + + public function getName() + { + return Piwik::translate('Actions_ColumnPageName'); + } +/* + public function shouldHandleAction(Request $request) + { + return true; + } + + public function getActionId() + { + return 4; + }*/ +} diff --git a/plugins/Actions/Columns/PageUrl.php b/plugins/Actions/Columns/PageUrl.php new file mode 100644 index 0000000000..0d0d5504f4 --- /dev/null +++ b/plugins/Actions/Columns/PageUrl.php @@ -0,0 +1,44 @@ +<?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\Actions\Columns; + +use Piwik\Piwik; +use Piwik\Plugin\ActionDimension; +use Piwik\Plugins\Actions\Segment; + +class PageUrl extends ActionDimension +{ + protected $fieldName = 'idaction_url'; + protected $fieldType = 'INTEGER(10) UNSIGNED DEFAULT NULL'; + + protected function init() + { + $segment = new Segment(); + $segment->setSegment('pageUrl'); + $segment->setName('Actions_ColumnPageURL'); + $segment->setAcceptValues('All these segments must be URL encoded, for example: ' . urlencode('http://example.com/path/page?query')); + $this->addSegment($segment); + } + + public function getName() + { + return Piwik::translate('Actions_ColumnPageURL'); + } + + /* + public function shouldHandleAction(Request $request) + { + return true; + } + + public function getActionId() + { + return 1; + }*/ +} diff --git a/plugins/Actions/Columns/SearchCategory.php b/plugins/Actions/Columns/SearchCategory.php new file mode 100644 index 0000000000..6879d3b2a8 --- /dev/null +++ b/plugins/Actions/Columns/SearchCategory.php @@ -0,0 +1,20 @@ +<?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\Actions\Columns; + +use Piwik\Piwik; +use Piwik\Plugin\VisitDimension; + +class SearchCategory extends VisitDimension +{ + public function getName() + { + return Piwik::translate('Actions_ColumnSearchCategory'); + } +} diff --git a/plugins/Actions/Columns/SearchDestinationPage.php b/plugins/Actions/Columns/SearchDestinationPage.php new file mode 100644 index 0000000000..efb3b104b5 --- /dev/null +++ b/plugins/Actions/Columns/SearchDestinationPage.php @@ -0,0 +1,20 @@ +<?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\Actions\Columns; + +use Piwik\Piwik; +use Piwik\Plugin\VisitDimension; + +class SearchDestinationPage extends VisitDimension +{ + public function getName() + { + return Piwik::translate('General_ColumnDestinationPage'); + } +} diff --git a/plugins/Actions/Columns/SearchKeyword.php b/plugins/Actions/Columns/SearchKeyword.php new file mode 100644 index 0000000000..ab80e0c765 --- /dev/null +++ b/plugins/Actions/Columns/SearchKeyword.php @@ -0,0 +1,30 @@ +<?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\Actions\Columns; + +use Piwik\Piwik; +use Piwik\Plugin\ActionDimension; +use Piwik\Plugins\Actions\Segment; + +class SearchKeyword extends ActionDimension +{ + protected function init() + { + $segment = new Segment(); + $segment->setSegment('siteSearchKeyword'); + $segment->setName('Actions_SiteSearchKeyword'); + $segment->setSqlSegment('log_link_visit_action.idaction_name'); + $this->addSegment($segment); + } + + public function getName() + { + return Piwik::translate('General_ColumnKeyword'); + } +} diff --git a/plugins/Actions/Columns/SearchNoResultKeyword.php b/plugins/Actions/Columns/SearchNoResultKeyword.php new file mode 100644 index 0000000000..1f067fcec6 --- /dev/null +++ b/plugins/Actions/Columns/SearchNoResultKeyword.php @@ -0,0 +1,20 @@ +<?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\Actions\Columns; + +use Piwik\Piwik; +use Piwik\Plugin\VisitDimension; + +class SearchNoResultKeyword extends VisitDimension +{ + public function getName() + { + return Piwik::translate('Actions_ColumnNoResultKeyword'); + } +} diff --git a/plugins/Actions/Controller.php b/plugins/Actions/Controller.php index 054eff8287..f5fc875c18 100644 --- a/plugins/Actions/Controller.php +++ b/plugins/Actions/Controller.php @@ -21,27 +21,6 @@ class Controller extends \Piwik\Plugin\Controller // Actions that render whole pages // - public function indexPageUrls() - { - return View::singleReport( - Piwik::translate('General_Pages'), - $this->getPageUrls(true)); - } - - public function indexEntryPageUrls() - { - return View::singleReport( - Piwik::translate('Actions_SubmenuPagesEntry'), - $this->getEntryPageUrls(true)); - } - - public function indexExitPageUrls() - { - return View::singleReport( - Piwik::translate('Actions_SubmenuPagesExit'), - $this->getExitPageUrls(true)); - } - public function indexSiteSearch() { $view = new View('@Actions/indexSiteSearch'); @@ -58,46 +37,6 @@ class Controller extends \Piwik\Plugin\Controller return $view->render(); } - public function indexPageTitles() - { - return View::singleReport( - Piwik::translate('Actions_SubmenuPageTitles'), - $this->getPageTitles(true)); - } - - public function indexDownloads() - { - return View::singleReport( - Piwik::translate('General_Downloads'), - $this->getDownloads(true)); - } - - public function indexOutlinks() - { - return View::singleReport( - Piwik::translate('General_Outlinks'), - $this->getOutlinks(true)); - } - - // - // Actions that render individual reports - // - - public function getPageUrls() - { - return $this->renderReport(__FUNCTION__); - } - - public function getEntryPageUrls() - { - return $this->renderReport(__FUNCTION__); - } - - public function getExitPageUrls() - { - return $this->renderReport(__FUNCTION__); - } - public function getSiteSearchKeywords() { return $this->renderReport(__FUNCTION__); @@ -122,29 +61,4 @@ class Controller extends \Piwik\Plugin\Controller { return $this->renderReport(__FUNCTION__); } - - public function getPageTitles() - { - return $this->renderReport(__FUNCTION__); - } - - public function getEntryPageTitles() - { - return $this->renderReport(__FUNCTION__); - } - - public function getExitPageTitles() - { - return $this->renderReport(__FUNCTION__); - } - - public function getDownloads() - { - return $this->renderReport(__FUNCTION__); - } - - public function getOutlinks() - { - return $this->renderReport(__FUNCTION__); - } } diff --git a/plugins/Actions/Menu.php b/plugins/Actions/Menu.php index 3c3030462a..ac56e4d2fb 100644 --- a/plugins/Actions/Menu.php +++ b/plugins/Actions/Menu.php @@ -15,13 +15,14 @@ class Menu extends \Piwik\Plugin\Menu public function configureReportingMenu(MenuReporting $menu) { $menu->add('General_Actions', '', array('module' => 'Actions', 'action' => 'indexPageUrls'), true, 15); + /* $menu->add('General_Actions', 'General_Pages', array('module' => 'Actions', 'action' => 'indexPageUrls'), true, 1); $menu->add('General_Actions', 'Actions_SubmenuPagesEntry', array('module' => 'Actions', 'action' => 'indexEntryPageUrls'), true, 2); $menu->add('General_Actions', 'Actions_SubmenuPagesExit', array('module' => 'Actions', 'action' => 'indexExitPageUrls'), true, 3); $menu->add('General_Actions', 'Actions_SubmenuPageTitles', array('module' => 'Actions', 'action' => 'indexPageTitles'), true, 4); $menu->add('General_Actions', 'General_Outlinks', array('module' => 'Actions', 'action' => 'indexOutlinks'), true, 6); $menu->add('General_Actions', 'General_Downloads', array('module' => 'Actions', 'action' => 'indexDownloads'), true, 7); - +*/ $actions = new Actions(); if ($actions->isSiteSearchEnabled()) { $menu->add('General_Actions', 'Actions_SubmenuSitesearch', array('module' => 'Actions', 'action' => 'indexSiteSearch'), true, 5); diff --git a/plugins/Actions/Reports/Base.php b/plugins/Actions/Reports/Base.php new file mode 100644 index 0000000000..c94cb33503 --- /dev/null +++ b/plugins/Actions/Reports/Base.php @@ -0,0 +1,118 @@ +<?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\Actions\Reports; + +use Piwik\Common; +use Piwik\MetricsFormatter; +use Piwik\Piwik; +use Piwik\Plugin\ViewDataTable; +use Piwik\Plugins\Actions\Actions; +use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable; +use Piwik\API\Request; + +abstract class Base extends \Piwik\Plugin\Report +{ + protected function init() + { + $this->category = 'General_Actions'; + } + + protected function addBaseDisplayProperties(ViewDataTable $view) + { + $view->config->datatable_js_type = 'ActionsDataTable'; + $view->config->search_recursive = true; + $view->config->show_table_all_columns = false; + $view->requestConfig->filter_limit = Actions::ACTIONS_REPORT_ROWS_DISPLAY; + $view->config->show_all_views_icons = false; + + if ($view->isViewDataTableId(HtmlTable::ID)) { + $view->config->show_embedded_subtable = true; + } + + if (Request::shouldLoadExpanded()) { + + if ($view->isViewDataTableId(HtmlTable::ID)) { + $view->config->show_expanded = true; + } + + $view->config->filters[] = function ($dataTable) { + Actions::setDataTableRowLevels($dataTable); + }; + } + + $view->config->filters[] = function ($dataTable) use ($view) { + if ($view->isViewDataTableId(HtmlTable::ID)) { + $view->config->datatable_css_class = 'dataTableActions'; + } + }; + } + + protected function addPageDisplayProperties(ViewDataTable $view) + { + $view->config->addTranslations(array( + 'nb_hits' => Piwik::translate('General_ColumnPageviews'), + 'nb_visits' => Piwik::translate('General_ColumnUniquePageviews'), + 'avg_time_on_page' => Piwik::translate('General_ColumnAverageTimeOnPage'), + 'bounce_rate' => Piwik::translate('General_ColumnBounceRate'), + 'exit_rate' => Piwik::translate('General_ColumnExitRate'), + 'avg_time_generation' => Piwik::translate('General_ColumnAverageGenerationTime'), + )); + + // prettify avg_time_on_page column + $getPrettyTimeFromSeconds = '\Piwik\MetricsFormatter::getPrettyTimeFromSeconds'; + $view->config->filters[] = array('ColumnCallbackReplace', array('avg_time_on_page', $getPrettyTimeFromSeconds)); + + // prettify avg_time_generation column + $avgTimeCallback = function ($time) { + return $time ? MetricsFormatter::getPrettyTimeFromSeconds($time, true, true, false) : "-"; + }; + $view->config->filters[] = array('ColumnCallbackReplace', array('avg_time_generation', $avgTimeCallback)); + + // add avg_generation_time tooltip + $tooltipCallback = function ($hits, $min, $max) { + if (!$hits) { + return false; + } + + return Piwik::translate("Actions_AvgGenerationTimeTooltip", array( + $hits, + "<br />", + MetricsFormatter::getPrettyTimeFromSeconds($min), + MetricsFormatter::getPrettyTimeFromSeconds($max) + )); + }; + $view->config->filters[] = array('ColumnCallbackAddMetadata', + array( + array('nb_hits_with_time_generation', 'min_time_generation', 'max_time_generation'), + 'avg_time_generation_tooltip', + $tooltipCallback + ) + ); + + $this->addExcludeLowPopDisplayProperties($view); + } + + protected function addExcludeLowPopDisplayProperties(ViewDataTable $view) + { + if (Common::getRequestVar('enable_filter_excludelowpop', '0', 'string') != '0') { + $view->requestConfig->filter_excludelowpop = 'nb_hits'; + $view->requestConfig->filter_excludelowpop_value = function () { + // computing minimum value to exclude (2 percent of the total number of actions) + $visitsInfo = \Piwik\Plugins\VisitsSummary\Controller::getVisitsSummary()->getFirstRow(); + $nbActions = $visitsInfo->getColumn('nb_actions'); + $nbActionsLowPopulationThreshold = floor(0.02 * $nbActions); + + // we remove 1 to make sure some actions/downloads are displayed in the case we have a very few of them + // and each of them has 1 or 2 hits... + return min($visitsInfo->getColumn('max_actions') - 1, $nbActionsLowPopulationThreshold - 1); + }; + } + } + +} diff --git a/plugins/Actions/Reports/Get.php b/plugins/Actions/Reports/Get.php new file mode 100644 index 0000000000..5a7ba73eaf --- /dev/null +++ b/plugins/Actions/Reports/Get.php @@ -0,0 +1,37 @@ +<?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\Actions\Reports; + +use Piwik\Piwik; +use Piwik\Plugin\ViewDataTable; +use Piwik\Plugins\Actions\API; + +class Get extends Base +{ + protected function init() + { + parent::init(); + + $this->name = Piwik::translate('General_Actions') . ' - ' . Piwik::translate('General_MainMetrics'); + $this->documentation = Piwik::translate('Actions_PagesReportDocumentation', '<br />') + . '<br />' . Piwik::translate('General_UsePlusMinusIconsDocumentation'); + $this->order = 1; + $this->metrics = array( + 'nb_pageviews', + 'nb_uniq_pageviews', + 'nb_downloads', + 'nb_uniq_downloads', + 'nb_outlinks', + 'nb_uniq_outlinks', + 'nb_searches', + 'nb_keywords', + 'avg_time_generation' + ); + } +} diff --git a/plugins/Actions/Reports/GetDownloads.php b/plugins/Actions/Reports/GetDownloads.php new file mode 100644 index 0000000000..adb5d2db67 --- /dev/null +++ b/plugins/Actions/Reports/GetDownloads.php @@ -0,0 +1,46 @@ +<?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\Actions\Reports; + +use Piwik\Piwik; +use Piwik\Plugin\ViewDataTable; +use Piwik\Plugins\Actions\Columns\DownloadUrl; + +class GetDownloads extends Base +{ + protected function init() + { + parent::init(); + + $this->dimension = new DownloadUrl(); + $this->name = Piwik::translate('General_Downloads'); + $this->documentation = Piwik::translate('Actions_DownloadsReportDocumentation', '<br />'); + $this->metrics = array('nb_visits', 'nb_hits'); + + $this->actionToLoadSubTables = $this->action; + $this->order = 9; + + $this->menuTitle = 'General_Downloads'; + $this->widgetTitle = 'General_Downloads'; + } + + public function configureView(ViewDataTable $view) + { + $view->config->addTranslations(array( + 'label' => $this->dimension->getName(), + 'nb_visits' => Piwik::translate('Actions_ColumnUniqueDownloads'), + 'nb_hits' => Piwik::translate('General_Downloads'), + )); + + $view->config->columns_to_display = array('label', 'nb_visits', 'nb_hits'); + $view->config->show_exclude_low_population = false; + + $this->addBaseDisplayProperties($view); + } +} diff --git a/plugins/Actions/Reports/GetEntryPageTitles.php b/plugins/Actions/Reports/GetEntryPageTitles.php new file mode 100644 index 0000000000..0ec60a7ce8 --- /dev/null +++ b/plugins/Actions/Reports/GetEntryPageTitles.php @@ -0,0 +1,67 @@ +<?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\Actions\Reports; + +use Piwik\Piwik; +use Piwik\Plugin\ViewDataTable; +use Piwik\Plugins\Actions\API; +use Piwik\API\Request; +use Piwik\Common; +use Piwik\Plugins\Actions\Columns\EntryPageTitle; +use Piwik\Plugins\Actions\Columns\PageTitle; + +class GetEntryPageTitles extends Base +{ + protected function init() + { + parent::init(); + + $this->dimension = new EntryPageTitle(); + $this->name = Piwik::translate('Actions_EntryPageTitles'); + $this->documentation = Piwik::translate('Actions_ExitPageTitlesReportDocumentation', '<br />') + . ' ' . Piwik::translate('General_UsePlusMinusIconsDocumentation'); + $this->metrics = array('entry_nb_visits', 'entry_bounce_count', 'bounce_rate'); + $this->order = 6; + $this->actionToLoadSubTables = $this->action; + + $this->widgetTitle = 'Actions_WidgetEntryPageTitles'; + } + + public function configureView(ViewDataTable $view) + { + $entryPageUrlAction = + Common::getRequestVar('widget', false) === false ? 'indexEntryPageUrls' : 'getEntryPageUrls'; + + $view->config->addTranslations(array( + 'label' => $this->dimension->getName(), + 'entry_bounce_count' => Piwik::translate('General_ColumnBounces'), + 'entry_nb_visits' => Piwik::translate('General_ColumnEntrances'), + )); + $view->config->addRelatedReports(array( + 'Actions.getPageTitles' => Piwik::translate('Actions_SubmenuPageTitles'), + "Actions.$entryPageUrlAction" => Piwik::translate('Actions_SubmenuPagesEntry') + )); + + $view->config->columns_to_display = array('label', 'entry_nb_visits', 'entry_bounce_count', 'bounce_rate'); + $view->config->title = $this->name; + + $view->requestConfig->filter_sort_column = 'entry_nb_visits'; + + $this->addPageDisplayProperties($view); + $this->addBaseDisplayProperties($view); + } + + public function getRelatedReports() + { + return array( + new GetPageTitles(), + new GetEntryPageUrls() + ); + } +} diff --git a/plugins/Actions/Reports/GetEntryPageUrls.php b/plugins/Actions/Reports/GetEntryPageUrls.php new file mode 100644 index 0000000000..6e51e446f5 --- /dev/null +++ b/plugins/Actions/Reports/GetEntryPageUrls.php @@ -0,0 +1,71 @@ +<?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\Actions\Reports; + +use Piwik\Common; +use Piwik\Piwik; +use Piwik\Plugin\ViewDataTable; +use Piwik\Plugins\Actions\API; +use Piwik\API\Request; +use Piwik\Plugins\Actions\Columns\EntryPageUrl; +use Piwik\Plugins\Actions\Columns\PageUrl; + +class GetEntryPageUrls extends Base +{ + protected function init() + { + parent::init(); + + $this->dimension = new EntryPageUrl(); + $this->name = Piwik::translate('Actions_SubmenuPagesEntry'); + $this->documentation = Piwik::translate('Actions_EntryPagesReportDocumentation', '<br />') + . '<br />' . Piwik::translate('General_UsePlusMinusIconsDocumentation'); + + $this->metrics = array('entry_nb_visits', 'entry_bounce_count', 'bounce_rate'); + $this->order = 3; + + $this->actionToLoadSubTables = $this->action; + + $this->menuTitle = 'Actions_SubmenuPagesEntry'; + $this->widgetTitle = 'Actions_WidgetPagesEntry'; + } + + public function configureView(ViewDataTable $view) + { + // link to the page, not just the report, but only if not a widget + $widget = Common::getRequestVar('widget', false); + + $view->config->self_url = Request::getCurrentUrlWithoutGenericFilters(array( + 'module' => 'Actions', + 'action' => $widget === false ? 'indexEntryPageUrls' : 'getEntryPageUrls' + )); + + $view->config->addTranslations(array( + 'label' => $this->dimension->getName(), + 'entry_bounce_count' => Piwik::translate('General_ColumnBounces'), + 'entry_nb_visits' => Piwik::translate('General_ColumnEntrances')) + ); + + // $view->config->title = $this->name; + $view->config->addRelatedReport('Actions.getEntryPageTitles', Piwik::translate('Actions_EntryPageTitles')); + $view->config->columns_to_display = array('label', 'entry_nb_visits', 'entry_bounce_count', 'bounce_rate'); + $view->requestConfig->filter_sort_column = 'entry_nb_visits'; + $view->requestConfig->filter_sort_order = 'desc'; + + $this->addPageDisplayProperties($view); + $this->addBaseDisplayProperties($view); + } + + public function getRelatedReports() + { + return array( + new GetEntryPageTitles() + ); + } +} diff --git a/plugins/Actions/Reports/GetExitPageTitles.php b/plugins/Actions/Reports/GetExitPageTitles.php new file mode 100644 index 0000000000..88db0cc8ac --- /dev/null +++ b/plugins/Actions/Reports/GetExitPageTitles.php @@ -0,0 +1,66 @@ +<?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\Actions\Reports; + +use Piwik\Piwik; +use Piwik\Plugin\ViewDataTable; +use Piwik\Plugins\Actions\API; +use Piwik\API\Request; +use Piwik\Common; +use Piwik\Plugins\Actions\Columns\ExitPageTitle; +use Piwik\Plugins\Actions\Columns\PageTitle; + +class GetExitPageTitles extends Base +{ + protected function init() + { + parent::init(); + + $this->dimension = new ExitPageTitle(); + $this->name = Piwik::translate('Actions_ExitPageTitles'); + $this->documentation = Piwik::translate('Actions_EntryPageTitlesReportDocumentation', '<br />') + . ' ' . Piwik::translate('General_UsePlusMinusIconsDocumentation'); + + $this->metrics = array('exit_nb_visits', 'nb_visits', 'exit_rate'); + $this->order = 7; + + $this->actionToLoadSubTables = $this->action; + + $this->widgetTitle = 'Actions_WidgetExitPageTitles'; + } + + public function configureView(ViewDataTable $view) + { + $exitPageUrlAction = + Common::getRequestVar('widget', false) === false ? 'indexExitPageUrls' : 'getExitPageUrls'; + + $view->config->addTranslations(array( + 'label' => $this->dimension->getName(), + 'exit_nb_visits' => Piwik::translate('General_ColumnExits'), + )); + $view->config->addRelatedReports(array( + 'Actions.getPageTitles' => Piwik::translate('Actions_SubmenuPageTitles'), + "Actions.$exitPageUrlAction" => Piwik::translate('Actions_SubmenuPagesExit'), + )); + + $view->config->title = $this->name; + $view->config->columns_to_display = array('label', 'exit_nb_visits', 'nb_visits', 'exit_rate'); + + $this->addPageDisplayProperties($view); + $this->addBaseDisplayProperties($view); + } + + public function getRelatedReports() + { + return array( + new GetPageTitles(), + new GetExitPageUrls() + ); + } +} diff --git a/plugins/Actions/Reports/GetExitPageUrls.php b/plugins/Actions/Reports/GetExitPageUrls.php new file mode 100644 index 0000000000..96f010931d --- /dev/null +++ b/plugins/Actions/Reports/GetExitPageUrls.php @@ -0,0 +1,72 @@ +<?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\Actions\Reports; + +use Piwik\Common; +use Piwik\Piwik; +use Piwik\Plugin\ViewDataTable; +use Piwik\Plugins\Actions\API; +use Piwik\API\Request; +use Piwik\Plugins\Actions\Columns\ExitPageUrl; +use Piwik\Plugins\Actions\Columns\PageUrl; + +class GetExitPageUrls extends Base +{ + protected function init() + { + parent::init(); + + $this->dimension = new ExitPageUrl(); + $this->name = Piwik::translate('Actions_SubmenuPagesExit'); + $this->documentation = Piwik::translate('Actions_ExitPagesReportDocumentation', '<br />') + . '<br />' . Piwik::translate('General_UsePlusMinusIconsDocumentation'); + + $this->metrics = array('exit_nb_visits', 'nb_visits', 'exit_rate'); + $this->actionToLoadSubTables = $this->action; + + $this->order = 4; + + $this->menuTitle = 'Actions_SubmenuPagesExit'; + $this->widgetTitle = 'Actions_WidgetPagesExit'; + } + + public function configureView(ViewDataTable $view) + { + // link to the page, not just the report, but only if not a widget + $widget = Common::getRequestVar('widget', false); + + $view->config->self_url = Request::getCurrentUrlWithoutGenericFilters(array( + 'module' => 'Actions', + 'action' => $widget === false ? 'indexExitPageUrls' : 'getExitPageUrls' + )); + + $view->config->addTranslations(array( + 'label' => $this->dimension->getName(), + 'exit_nb_visits' => Piwik::translate('General_ColumnExits')) + ); + + $view->config->title = $this->name; + $view->config->addRelatedReport('Actions.getExitPageTitles', Piwik::translate('Actions_ExitPageTitles')); + + $view->config->columns_to_display = array('label', 'exit_nb_visits', 'nb_visits', 'exit_rate'); + $view->requestConfig->filter_sort_column = 'exit_nb_visits'; + $view->requestConfig->filter_sort_order = 'desc'; + + $this->addPageDisplayProperties($view); + $this->addBaseDisplayProperties($view); + } + + public function getRelatedReports() + { + return array( + new GetExitPageTitles() + ); + } + +} diff --git a/plugins/Actions/Reports/GetOutlinks.php b/plugins/Actions/Reports/GetOutlinks.php new file mode 100644 index 0000000000..53e97dbff4 --- /dev/null +++ b/plugins/Actions/Reports/GetOutlinks.php @@ -0,0 +1,53 @@ +<?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\Actions\Reports; + +use Piwik\Piwik; +use Piwik\Plugin\ViewDataTable; +use Piwik\Plugins\Actions\API; +use Piwik\API\Request; +use Piwik\Common; +use Piwik\Plugins\Actions\Columns\ClickedUrl; +use Piwik\Plugins\Actions\Columns\PageTitle; + +class GetOutlinks extends Base +{ + protected function init() + { + parent::init(); + + $this->dimension = new ClickedUrl(); + $this->name = Piwik::translate('General_Outlinks'); + $this->documentation = Piwik::translate('Actions_OutlinksReportDocumentation') . ' ' + . Piwik::translate('Actions_OutlinkDocumentation') . '<br />' + . Piwik::translate('General_UsePlusMinusIconsDocumentation'); + + $this->metrics = array('nb_visits', 'nb_hits'); + $this->order = 8; + + $this->actionToLoadSubTables = $this->action; + + $this->menuTitle = 'General_Outlinks'; + $this->widgetTitle = 'General_Outlinks'; + } + + public function configureView(ViewDataTable $view) + { + $view->config->addTranslations(array( + 'label' => $this->dimension->getName(), + 'nb_visits' => Piwik::translate('Actions_ColumnUniqueClicks'), + 'nb_hits' => Piwik::translate('Actions_ColumnClicks'), + )); + + $view->config->columns_to_display = array('label', 'nb_visits', 'nb_hits'); + $view->config->show_exclude_low_population = false; + + $this->addBaseDisplayProperties($view); + } +} diff --git a/plugins/Actions/Reports/GetPageTitles.php b/plugins/Actions/Reports/GetPageTitles.php new file mode 100644 index 0000000000..bd0445ace4 --- /dev/null +++ b/plugins/Actions/Reports/GetPageTitles.php @@ -0,0 +1,76 @@ +<?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\Actions\Reports; + +use Piwik\Piwik; +use Piwik\Plugin\ViewDataTable; +use Piwik\Plugins\Actions\API; +use Piwik\API\Request; +use Piwik\Common; +use Piwik\Plugins\Actions\Columns\PageTitle; + +class GetPageTitles extends Base +{ + protected function init() + { + parent::init(); + + $this->dimension = new PageTitle(); + $this->name = Piwik::translate('Actions_SubmenuPageTitles'); + $this->documentation = Piwik::translate('Actions_PageTitlesReportDocumentation', + array('<br />', htmlentities('<title>'))); + + $this->order = 5; + $this->metrics = array( + 'nb_hits', + 'nb_visits', + 'bounce_rate', + 'avg_time_on_page', + 'exit_rate', + 'avg_time_generation' + ); + + $this->actionToLoadSubTables = $this->action; + + $this->menuTitle = 'Actions_SubmenuPageTitles'; + $this->widgetTitle = 'Actions_WidgetPageTitles'; + } + + public function configureView(ViewDataTable $view) + { + // link to the page, not just the report, but only if not a widget + $widget = Common::getRequestVar('widget', false); + + $view->config->self_url = Request::getCurrentUrlWithoutGenericFilters(array( + 'module' => 'Actions', + 'action' => $widget === false ? 'indexPageTitles' : 'getPageTitles' + )); + + $view->config->title = $this->name; + $view->config->addRelatedReports(array( + 'Actions.getEntryPageTitles' => Piwik::translate('Actions_EntryPageTitles'), + 'Actions.getExitPageTitles' => Piwik::translate('Actions_ExitPageTitles'), + )); + + $view->config->addTranslation('label', $this->dimension->getName()); + $view->config->columns_to_display = array('label', 'nb_hits', 'nb_visits', 'bounce_rate', + 'avg_time_on_page', 'exit_rate', 'avg_time_generation'); + + $this->addPageDisplayProperties($view); + $this->addBaseDisplayProperties($view); + } + + public function getRelatedReports() + { + return array( + new GetEntryPageTitles(), + new GetExitPageTitles() + ); + } +} diff --git a/plugins/Actions/Reports/GetPageUrls.php b/plugins/Actions/Reports/GetPageUrls.php new file mode 100644 index 0000000000..3c3dad80dd --- /dev/null +++ b/plugins/Actions/Reports/GetPageUrls.php @@ -0,0 +1,53 @@ +<?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\Actions\Reports; + +use Piwik\Piwik; +use Piwik\Plugin\ViewDataTable; +use Piwik\Plugins\Actions\Columns\PageUrl; + +class GetPageUrls extends Base +{ + protected function init() + { + parent::init(); + + $this->dimension = new PageUrl(); + $this->name = Piwik::translate('Actions_PageUrls'); + $this->title = Piwik::translate('General_Pages'); + $this->documentation = Piwik::translate('Actions_PagesReportDocumentation', '<br />') + . '<br />' . Piwik::translate('General_UsePlusMinusIconsDocumentation'); + + $this->actionToLoadSubTables = $this->action; + $this->order = 1; + $this->metrics = array( + 'nb_hits', + 'nb_visits', + 'bounce_rate', + 'avg_time_on_page', + 'exit_rate', + 'avg_time_generation' + ); + + $this->segmentSql = 'log_visit.visit_entry_idaction_url'; + + $this->menuTitle = 'General_Pages'; + $this->widgetTitle = 'General_Pages'; + } + + public function configureView(ViewDataTable $view) + { + $view->config->addTranslation('label', $this->dimension->getName()); + $view->config->columns_to_display = array('label', 'nb_hits', 'nb_visits', 'bounce_rate', + 'avg_time_on_page', 'exit_rate', 'avg_time_generation'); + + $this->addPageDisplayProperties($view); + $this->addBaseDisplayProperties($view); + } +} diff --git a/plugins/Actions/Segment.php b/plugins/Actions/Segment.php new file mode 100644 index 0000000000..58d7ddf913 --- /dev/null +++ b/plugins/Actions/Segment.php @@ -0,0 +1,37 @@ +<?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\Actions; + +use Piwik\API\Request; +use Piwik\ArchiveProcessor; +use Piwik\Common; +use Piwik\Db; +use Piwik\MetricsFormatter; +use Piwik\Piwik; +use Piwik\Plugin\ViewDataTable; +use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable; +use Piwik\Site; + +/** + * Actions plugin + * + * Reports about the page views, the outlinks and downloads. + * + */ +class Segment extends \Piwik\Plugin\Segment +{ + protected function init() + { + parent::init(); + + $this->setCategory('General_Actions'); + $this->setSqlFilter('\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment'); + } +} + diff --git a/plugins/Actions/Widgets.php b/plugins/Actions/Widgets.php index eff55ceb1b..be1f790166 100644 --- a/plugins/Actions/Widgets.php +++ b/plugins/Actions/Widgets.php @@ -15,27 +15,16 @@ class Widgets extends \Piwik\Plugin\Widgets public function configure(WidgetsList $widgetsList) { - $category = 'General_Actions'; - $controller = 'Actions'; - - $widgetsList->add($category, 'General_Pages', $controller, 'getPageUrls'); - $widgetsList->add($category, 'Actions_WidgetPageTitles', $controller, 'getPageTitles'); - $widgetsList->add($category, 'General_Outlinks', $controller, 'getOutlinks'); - $widgetsList->add($category, 'General_Downloads', $controller, 'getDownloads'); - $widgetsList->add($category, 'Actions_WidgetPagesEntry', $controller, 'getEntryPageUrls'); - $widgetsList->add($category, 'Actions_WidgetPagesExit', $controller, 'getExitPageUrls'); - $widgetsList->add($category, 'Actions_WidgetEntryPageTitles', $controller, 'getEntryPageTitles'); - $widgetsList->add($category, 'Actions_WidgetExitPageTitles', $controller, 'getExitPageTitles'); - $actions = new Actions(); if ($actions->isSiteSearchEnabled()) { - $this->addSearchWidgets($widgetsList, $controller); + $this->addSearchWidgets($widgetsList); } } - private function addSearchWidgets(WidgetsList $widgetsList, $controller) + private function addSearchWidgets(WidgetsList $widgetsList) { - $category = 'Actions_SubmenuSitesearch'; + $controller = 'Actions'; + $category = 'Actions_SubmenuSitesearch'; $widgetsList->add($category, 'Actions_WidgetSearchKeywords', $controller, 'getSiteSearchKeywords'); diff --git a/plugins/CoreHome/Controller.php b/plugins/CoreHome/Controller.php index 18eb842483..ef25ac1d1a 100644 --- a/plugins/CoreHome/Controller.php +++ b/plugins/CoreHome/Controller.php @@ -16,6 +16,7 @@ use Piwik\FrontController; use Piwik\Menu\MenuMain; use Piwik\Notification\Manager as NotificationManager; use Piwik\Piwik; +use Piwik\Plugin\Report; use Piwik\Plugins\CoreHome\DataTableRowAction\MultiRowEvolution; use Piwik\Plugins\CoreHome\DataTableRowAction\RowEvolution; use Piwik\Plugins\CorePluginsAdmin\MarketplaceApiClient; @@ -37,6 +38,42 @@ class Controller extends \Piwik\Plugin\Controller return 'redirectToCoreHomeIndex'; } + public function renderMenuReport() + { + $reportModule = Common::getRequestVar('reportModule', null, 'string'); + $reportAction = Common::getRequestVar('reportAction', null, 'string'); + + $report = Report::factory($reportModule, $reportAction); + + if (empty($report)) { + throw new Exception('This report does not exist'); + } + + if (!$report->isEnabled()) { + throw new Exception('This report is not enabled. Maybe you do not have enough permission'); + } + + return View::singleReport($report->getName(), $this->renderWidget()); + } + + public function renderWidget() + { + $reportModule = Common::getRequestVar('reportModule', null, 'string'); + $reportAction = Common::getRequestVar('reportAction', null, 'string'); + + $report = Report::factory($reportModule, $reportAction); + + if (empty($report)) { + throw new Exception('This report does not exist'); + } + + if (!$report->isEnabled()) { + throw new Exception('This report is not enabled. Maybe you do not have enough permission'); + } + + return $report->render(); + } + function redirectToCoreHomeIndex() { $defaultReport = API::getInstance()->getUserPreference(Piwik::getCurrentUserLogin(), API::PREFERENCE_DEFAULT_REPORT); diff --git a/plugins/DevicesDetection/Dimensions/Base.php b/plugins/DevicesDetection/Columns/Base.php index 1e1ebf3086..ffe9d45bdb 100644 --- a/plugins/DevicesDetection/Dimensions/Base.php +++ b/plugins/DevicesDetection/Columns/Base.php @@ -6,7 +6,7 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later * */ -namespace Piwik\Plugins\DevicesDetection\Dimensions; +namespace Piwik\Plugins\DevicesDetection\Columns; use \DeviceDetector; use Piwik\CacheFile; diff --git a/plugins/DevicesDetection/Dimensions/BrowserName.php b/plugins/DevicesDetection/Columns/BrowserName.php index 63abde97e8..6536722742 100644 --- a/plugins/DevicesDetection/Dimensions/BrowserName.php +++ b/plugins/DevicesDetection/Columns/BrowserName.php @@ -6,7 +6,7 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later * */ -namespace Piwik\Plugins\DevicesDetection\Dimensions; +namespace Piwik\Plugins\DevicesDetection\Columns; use Piwik\Piwik; use Piwik\Tracker\Request; diff --git a/plugins/DevicesDetection/Dimensions/BrowserVersion.php b/plugins/DevicesDetection/Columns/BrowserVersion.php index 6437233ca2..10b37c3548 100644 --- a/plugins/DevicesDetection/Dimensions/BrowserVersion.php +++ b/plugins/DevicesDetection/Columns/BrowserVersion.php @@ -6,7 +6,7 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later * */ -namespace Piwik\Plugins\DevicesDetection\Dimensions; +namespace Piwik\Plugins\DevicesDetection\Columns; use Piwik\Piwik; use Piwik\Tracker\Request; diff --git a/plugins/DevicesDetection/Dimensions/DeviceBrand.php b/plugins/DevicesDetection/Columns/DeviceBrand.php index f7da88dfd4..5a37a53718 100644 --- a/plugins/DevicesDetection/Dimensions/DeviceBrand.php +++ b/plugins/DevicesDetection/Columns/DeviceBrand.php @@ -6,7 +6,7 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later * */ -namespace Piwik\Plugins\DevicesDetection\Dimensions; +namespace Piwik\Plugins\DevicesDetection\Columns; use Piwik\Piwik; use Piwik\Tracker\Request; diff --git a/plugins/DevicesDetection/Dimensions/DeviceModel.php b/plugins/DevicesDetection/Columns/DeviceModel.php index cdc61bc6d2..a340503af3 100644 --- a/plugins/DevicesDetection/Dimensions/DeviceModel.php +++ b/plugins/DevicesDetection/Columns/DeviceModel.php @@ -6,7 +6,7 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later * */ -namespace Piwik\Plugins\DevicesDetection\Dimensions; +namespace Piwik\Plugins\DevicesDetection\Columns; use Piwik\Piwik; use Piwik\Tracker\Request; diff --git a/plugins/DevicesDetection/Dimensions/DeviceType.php b/plugins/DevicesDetection/Columns/DeviceType.php index fb8e9e7a6e..e566a1a25c 100644 --- a/plugins/DevicesDetection/Dimensions/DeviceType.php +++ b/plugins/DevicesDetection/Columns/DeviceType.php @@ -6,7 +6,7 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later * */ -namespace Piwik\Plugins\DevicesDetection\Dimensions; +namespace Piwik\Plugins\DevicesDetection\Columns; use Piwik\Piwik; use Piwik\Tracker\Request; diff --git a/plugins/DevicesDetection/Dimensions/Os.php b/plugins/DevicesDetection/Columns/Os.php index 05167a268e..edaf32949a 100644 --- a/plugins/DevicesDetection/Dimensions/Os.php +++ b/plugins/DevicesDetection/Columns/Os.php @@ -6,7 +6,7 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later * */ -namespace Piwik\Plugins\DevicesDetection\Dimensions; +namespace Piwik\Plugins\DevicesDetection\Columns; use Piwik\Piwik; use Piwik\Tracker\Request; diff --git a/plugins/DevicesDetection/Dimensions/OsVersion.php b/plugins/DevicesDetection/Columns/OsVersion.php index 78dc41504f..088ca58572 100644 --- a/plugins/DevicesDetection/Dimensions/OsVersion.php +++ b/plugins/DevicesDetection/Columns/OsVersion.php @@ -6,7 +6,7 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later * */ -namespace Piwik\Plugins\DevicesDetection\Dimensions; +namespace Piwik\Plugins\DevicesDetection\Columns; use Piwik\Piwik; use Piwik\Tracker\Request; diff --git a/plugins/Referrers/Columns/Base.php b/plugins/Referrers/Columns/Base.php new file mode 100644 index 0000000000..b8d757e73b --- /dev/null +++ b/plugins/Referrers/Columns/Base.php @@ -0,0 +1,302 @@ +<?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\Referrers\Columns; + +use Piwik\Common; +use Piwik\Piwik; +use Piwik\Plugin\VisitDimension; +use Piwik\UrlHelper; + + +abstract class Base extends VisitDimension +{ + + // @see detect*() referrer methods + protected $typeReferrerAnalyzed; + protected $nameReferrerAnalyzed; + protected $keywordReferrerAnalyzed; + protected $referrerHost; + protected $referrerUrl; + protected $referrerUrlParse; + protected $currentUrlParse; + protected $idsite; + + // Used to prefix when a adsense referrer is detected + const LABEL_PREFIX_ADWORDS_KEYWORD = '(adwords) '; + const LABEL_ADWORDS_NAME = 'AdWords'; + + /** + * Returns an array containing the following information: + * - referer_type + * - direct -- absence of referrer URL OR referrer URL has the same host + * - site -- based on the referrer URL + * - search_engine -- based on the referrer URL + * - campaign -- based on campaign URL parameter + * + * - referer_name + * - () + * - piwik.net -- site host name + * - google.fr -- search engine host name + * - adwords-search -- campaign name + * + * - referer_keyword + * - () + * - () + * - my keyword + * - my paid keyword + * - () + * - () + * + * - referer_url : the same for all the referrer types + * + * @param string $referrerUrl must be URL Encoded + * @param string $currentUrl + * @param int $idSite + * @return array + */ + public function getReferrerInformation($referrerUrl, $currentUrl, $idSite) + { + $this->idsite = $idSite; + + // default values for the referer_* fields + $referrerUrl = Common::unsanitizeInputValue($referrerUrl); + if (!empty($referrerUrl) + && !UrlHelper::isLookLikeUrl($referrerUrl) + ) { + $referrerUrl = ''; + } + + $currentUrl = PageUrl::cleanupUrl($currentUrl); + + $this->referrerUrl = $referrerUrl; + $this->referrerUrlParse = @parse_url($this->referrerUrl); + $this->currentUrlParse = @parse_url($currentUrl); + $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_DIRECT_ENTRY; + $this->nameReferrerAnalyzed = ''; + $this->keywordReferrerAnalyzed = ''; + $this->referrerHost = ''; + + if (isset($this->referrerUrlParse['host'])) { + $this->referrerHost = $this->referrerUrlParse['host']; + } + + $referrerDetected = $this->detectReferrerCampaign(); + + if (!$referrerDetected) { + if ($this->detectReferrerDirectEntry() + || $this->detectReferrerSearchEngine() + ) { + $referrerDetected = true; + } + } + + if (!empty($this->referrerHost) + && !$referrerDetected + ) { + $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_WEBSITE; + $this->nameReferrerAnalyzed = Common::mb_strtolower($this->referrerHost); + } + + $referrerInformation = array( + 'referer_type' => $this->typeReferrerAnalyzed, + 'referer_name' => $this->nameReferrerAnalyzed, + 'referer_keyword' => $this->keywordReferrerAnalyzed, + 'referer_url' => $this->referrerUrl, + ); + + return $referrerInformation; + } + + /** + * Search engine detection + * @return bool + */ + protected function detectReferrerSearchEngine() + { + $searchEngineInformation = UrlHelper::extractSearchEngineInformationFromUrl($this->referrerUrl); + + /** + * Triggered when detecting the search engine of a referrer URL. + * + * Plugins can use this event to provide custom search engine detection + * logic. + * + * @param array &$searchEngineInformation An array with the following information: + * + * - **name**: The search engine name. + * - **keywords**: The search keywords used. + * + * This parameter is initialized to the results + * of Piwik's default search engine detection + * logic. + * @param string referrerUrl The referrer URL from the tracking request. + */ + Piwik::postEvent('Tracker.detectReferrerSearchEngine', array(&$searchEngineInformation, $this->referrerUrl)); + if ($searchEngineInformation === false) { + return false; + } + $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_SEARCH_ENGINE; + $this->nameReferrerAnalyzed = $searchEngineInformation['name']; + $this->keywordReferrerAnalyzed = $searchEngineInformation['keywords']; + return true; + } + + /** + * @param string $string + * @return bool + */ + protected function detectCampaignFromString($string) + { + foreach ($this->campaignNames as $campaignNameParameter) { + $campaignName = trim(urldecode(UrlHelper::getParameterFromQueryString($string, $campaignNameParameter))); + if (!empty($campaignName)) { + break; + } + } + + if (empty($campaignName)) { + return false; + } + $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_CAMPAIGN; + $this->nameReferrerAnalyzed = $campaignName; + + foreach ($this->campaignKeywords as $campaignKeywordParameter) { + $campaignKeyword = UrlHelper::getParameterFromQueryString($string, $campaignKeywordParameter); + if (!empty($campaignKeyword)) { + $this->keywordReferrerAnalyzed = trim(urldecode($campaignKeyword)); + break; + } + } + return !empty($this->keywordReferrerAnalyzed); + } + + protected function detectReferrerCampaignFromLandingUrl() + { + if (!isset($this->currentUrlParse['query']) + && !isset($this->currentUrlParse['fragment']) + ) { + return false; + } + $campaignParameters = Common::getCampaignParameters(); + $this->campaignNames = $campaignParameters[0]; + $this->campaignKeywords = $campaignParameters[1]; + + $found = false; + + // 1) Detect campaign from query string + if (isset($this->currentUrlParse['query'])) { + $found = $this->detectCampaignFromString($this->currentUrlParse['query']); + } + + // 2) Detect from fragment #hash + if (!$found + && isset($this->currentUrlParse['fragment']) + ) { + $this->detectCampaignFromString($this->currentUrlParse['fragment']); + } + } + + /** + * We have previously tried to detect the campaign variables in the URL + * so at this stage, if the referrer host is the current host, + * or if the referrer host is any of the registered URL for this website, + * it is considered a direct entry + * @return bool + */ + protected function detectReferrerDirectEntry() + { + if (!empty($this->referrerHost)) { + // is the referrer host the current host? + if (isset($this->currentUrlParse['host'])) { + $currentHost = mb_strtolower($this->currentUrlParse['host'], 'UTF-8'); + if ($currentHost == mb_strtolower($this->referrerHost, 'UTF-8')) { + $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_DIRECT_ENTRY; + return true; + } + } + if (Visit::isHostKnownAliasHost($this->referrerHost, $this->idsite)) { + $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_DIRECT_ENTRY; + return true; + } + } + return false; + } + + protected function detectCampaignKeywordFromReferrerUrl() + { + if(!empty($this->nameReferrerAnalyzed) + && !empty($this->keywordReferrerAnalyzed)) { + // keyword is already set, we skip + return true; + } + + // Set the Campaign keyword to the keyword found in the Referrer URL if any + if(!empty($this->nameReferrerAnalyzed)) { + $referrerUrlInfo = UrlHelper::extractSearchEngineInformationFromUrl($this->referrerUrl); + if (!empty($referrerUrlInfo['keywords'])) { + $this->keywordReferrerAnalyzed = $referrerUrlInfo['keywords']; + } + } + + // Set the keyword, to the hostname found, in a Adsense Referrer URL '&url=' parameter + if (empty($this->keywordReferrerAnalyzed) + && !empty($this->referrerUrlParse['query']) + && !empty($this->referrerHost) + && (strpos($this->referrerHost, 'googleads') !== false || strpos($this->referrerHost, 'doubleclick') !== false) + ) { + // This parameter sometimes is found & contains the page with the adsense ad bringing visitor to our site + $value = $this->getParameterValueFromReferrerUrl('url'); + if (!empty($value)) { + $parsedAdsenseReferrerUrl = parse_url($value); + if (!empty($parsedAdsenseReferrerUrl['host'])) { + + if(empty($this->nameReferrerAnalyzed)) { + $type = $this->getParameterValueFromReferrerUrl('ad_type'); + $type = $type ? " ($type)" : ''; + $this->nameReferrerAnalyzed = self::LABEL_ADWORDS_NAME . $type; + $this->typeReferrerAnalyzed = Common::REFERRER_TYPE_CAMPAIGN; + } + $this->keywordReferrerAnalyzed = self::LABEL_PREFIX_ADWORDS_KEYWORD . $parsedAdsenseReferrerUrl['host']; + } + } + } + + } + + /** + * @return string + */ + protected function getParameterValueFromReferrerUrl($adsenseReferrerParameter) + { + $value = trim(urldecode(UrlHelper::getParameterFromQueryString($this->referrerUrlParse['query'], $adsenseReferrerParameter))); + return $value; + } + + /** + * @return bool + */ + protected function detectReferrerCampaign() + { + $this->detectReferrerCampaignFromLandingUrl(); + $this->detectCampaignKeywordFromReferrerUrl(); + + if ($this->typeReferrerAnalyzed != Common::REFERRER_TYPE_CAMPAIGN) { + return false; + } + // if we detected a campaign but there is still no keyword set, we set the keyword to the Referrer host + if(empty($this->keywordReferrerAnalyzed)) { + $this->keywordReferrerAnalyzed = $this->referrerHost; + } + + $this->keywordReferrerAnalyzed = Common::mb_strtolower($this->keywordReferrerAnalyzed); + $this->nameReferrerAnalyzed = Common::mb_strtolower($this->nameReferrerAnalyzed); + return true; + } + +} diff --git a/plugins/Referrers/Columns/ReferrerCampaign.php b/plugins/Referrers/Columns/ReferrerCampaign.php new file mode 100644 index 0000000000..8cefe48d35 --- /dev/null +++ b/plugins/Referrers/Columns/ReferrerCampaign.php @@ -0,0 +1,20 @@ +<?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\Referrers\Columns; + +use Piwik\Piwik; +use Piwik\Plugin\VisitDimension; + +class ReferrerCampaign extends VisitDimension +{ + public function getName() + { + return Piwik::translate('Referrers_ColumnCampaign'); + } +} diff --git a/plugins/Referrers/Columns/ReferrerKeyword.php b/plugins/Referrers/Columns/ReferrerKeyword.php new file mode 100644 index 0000000000..029316893a --- /dev/null +++ b/plugins/Referrers/Columns/ReferrerKeyword.php @@ -0,0 +1,33 @@ +<?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\Referrers\Columns; + +use Piwik\Piwik; +use Piwik\Tracker\Request; + +class ReferrerKeyword extends Base +{ + protected $fieldName = 'referer_keyword'; + protected $fieldType = 'VARCHAR(255) NULL'; + + public function getName() + { + return Piwik::translate('General_ColumnKeyword'); + } + + public function onNewVisit(Request $request, $visit) + { + $referrerUrl = $request->getParam('urlref'); + $currentUrl = $request->getParam('url'); + + $information = $this->getReferrerInformation($referrerUrl, $currentUrl, $request->getIdSite()); + + return $information['referer_keyword']; + } +} diff --git a/plugins/Referrers/Columns/ReferrerName.php b/plugins/Referrers/Columns/ReferrerName.php new file mode 100644 index 0000000000..288957f436 --- /dev/null +++ b/plugins/Referrers/Columns/ReferrerName.php @@ -0,0 +1,32 @@ +<?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\Referrers\Columns; + +use Piwik\Tracker\Request; + +class ReferrerName extends Base +{ + protected $fieldName = 'referer_name'; + protected $fieldType = 'VARCHAR(70) NULL'; + + public function getName() + { + return ''; + } + + public function onNewVisit(Request $request, $visit) + { + $referrerUrl = $request->getParam('urlref'); + $currentUrl = $request->getParam('url'); + + $information = $this->getReferrerInformation($referrerUrl, $currentUrl, $request->getIdSite()); + + return $information['referer_name']; + } +} diff --git a/plugins/Referrers/Columns/ReferrerReferrer.php b/plugins/Referrers/Columns/ReferrerReferrer.php new file mode 100644 index 0000000000..9601913125 --- /dev/null +++ b/plugins/Referrers/Columns/ReferrerReferrer.php @@ -0,0 +1,20 @@ +<?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\Referrers\Columns; + +use Piwik\Piwik; +use Piwik\Plugin\VisitDimension; + +class ReferrerReferrer extends VisitDimension +{ + public function getName() + { + return Piwik::translate('Referrers_Referrer'); + } +} diff --git a/plugins/Referrers/Columns/ReferrerSearchEngine.php b/plugins/Referrers/Columns/ReferrerSearchEngine.php new file mode 100644 index 0000000000..aa94df5874 --- /dev/null +++ b/plugins/Referrers/Columns/ReferrerSearchEngine.php @@ -0,0 +1,20 @@ +<?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\Referrers\Columns; + +use Piwik\Piwik; +use Piwik\Plugin\VisitDimension; + +class ReferrerSearchEngine extends VisitDimension +{ + public function getName() + { + return Piwik::translate('Referrers_ColumnSearchEngine'); + } +} diff --git a/plugins/Referrers/Columns/ReferrerSocial.php b/plugins/Referrers/Columns/ReferrerSocial.php new file mode 100644 index 0000000000..667e219270 --- /dev/null +++ b/plugins/Referrers/Columns/ReferrerSocial.php @@ -0,0 +1,20 @@ +<?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\Referrers\Columns; + +use Piwik\Piwik; +use Piwik\Plugin\VisitDimension; + +class ReferrerSocial extends VisitDimension +{ + public function getName() + { + return Piwik::translate('Referrers_ColumnSocial'); + } +} diff --git a/plugins/Referrers/Columns/ReferrerType.php b/plugins/Referrers/Columns/ReferrerType.php new file mode 100644 index 0000000000..25f84a8fc7 --- /dev/null +++ b/plugins/Referrers/Columns/ReferrerType.php @@ -0,0 +1,33 @@ +<?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\Referrers\Columns; + +use Piwik\Piwik; +use Piwik\Tracker\Request; + +class ReferrerType extends Base +{ + protected $fieldName = 'referer_type'; + protected $fieldType = 'TINYINT(1) UNSIGNED NULL'; + + public function getName() + { + return Piwik::translate('Referrers_Type'); + } + + public function onNewVisit(Request $request, $visit) + { + $referrerUrl = $request->getParam('urlref'); + $currentUrl = $request->getParam('url'); + + $information = $this->getReferrerInformation($referrerUrl, $currentUrl, $request->getIdSite()); + + return $information['referer_type']; + } +} diff --git a/plugins/Referrers/Columns/ReferrerUrl.php b/plugins/Referrers/Columns/ReferrerUrl.php new file mode 100644 index 0000000000..c11586b363 --- /dev/null +++ b/plugins/Referrers/Columns/ReferrerUrl.php @@ -0,0 +1,32 @@ +<?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\Referrers\Columns; + +use Piwik\Tracker\Request; + +class ReferrerUrl extends Base +{ + protected $fieldName = 'referer_url'; + protected $fieldType = 'TEXT NOT NULL'; + + public function getName() + { + return ''; + } + + public function onNewVisit(Request $request, $visit) + { + $referrerUrl = $request->getParam('urlref'); + $currentUrl = $request->getParam('url'); + + $information = $this->getReferrerInformation($referrerUrl, $currentUrl, $request->getIdSite()); + + return $information['referer_url']; + } +} diff --git a/plugins/Referrers/Columns/ReferrerWebsite.php b/plugins/Referrers/Columns/ReferrerWebsite.php new file mode 100644 index 0000000000..f8b72c32ba --- /dev/null +++ b/plugins/Referrers/Columns/ReferrerWebsite.php @@ -0,0 +1,20 @@ +<?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\Referrers\Columns; + +use Piwik\Piwik; +use Piwik\Plugin\VisitDimension; + +class ReferrerWebsite extends VisitDimension +{ + public function getName() + { + return Piwik::translate('Referrers_ColumnWebsite'); + } +} diff --git a/plugins/Referrers/Columns/ReferrerWebsitePage.php b/plugins/Referrers/Columns/ReferrerWebsitePage.php new file mode 100644 index 0000000000..48d1b3c331 --- /dev/null +++ b/plugins/Referrers/Columns/ReferrerWebsitePage.php @@ -0,0 +1,20 @@ +<?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\Referrers\Columns; + +use Piwik\Piwik; +use Piwik\Plugin\VisitDimension; + +class ReferrerWebsitePage extends VisitDimension +{ + public function getName() + { + return Piwik::translate('Referrers_ColumnWebsitePage'); + } +} |