From fccdcc0c2c9416a283d35feb89fa689f9a32fcae Mon Sep 17 00:00:00 2001 From: Thomas Steur <thomas.steur@googlemail.com> Date: Fri, 13 Jun 2014 09:59:45 +0200 Subject: [PATCH] moved more logic from core to plugins --- core/Db/Schema/Mysql.php | 13 +-- core/Plugin/Segment.php | 8 ++ core/Plugin/VisitDimension.php | 6 +- core/Tracker/Settings.php | 5 +- core/Tracker/Visit.php | 55 ----------- plugins/API/API.php | 30 ------ plugins/Actions/Columns/EntryPageTitle.php | 4 +- plugins/Actions/Columns/EntryPageUrl.php | 4 +- plugins/Actions/Columns/ExitPageTitle.php | 18 ++-- plugins/Actions/Columns/ExitPageUrl.php | 4 +- plugins/Actions/Columns/VisitTotalActions.php | 94 +++++++++++++++++++ .../Actions/Columns/VisitTotalSearches.php | 76 +++++++++++++++ .../CoreHome/Columns/VisitFirstActionTime.php | 36 +++++++ .../CoreHome/Columns/VisitLastActionTime.php | 53 +++++++++++ .../Columns/VisitorDaysSinceFirst.php | 45 +++++++++ .../Columns/VisitorDaysSinceOrder.php | 41 ++++++++ plugins/CoreHome/Columns/VisitsCount.php | 45 +++++++++ plugins/CoreHome/Segment.php | 21 +++++ plugins/Events/Columns/TotalEvents.php | 44 ++++++++- plugins/UserSettings/Columns/Language.php | 18 +++- plugins/UserSettings/Columns/Resolution.php | 20 ++++ plugins/VisitTime/Columns/Localtime.php | 14 +++ .../Columns/Visitsbydayssincelastvisit.php | 19 +++- ...eportMetadata__API.getSegmentsMetadata.xml | 14 +-- tests/PHPUnit/UI | 2 +- 25 files changed, 561 insertions(+), 128 deletions(-) create mode 100644 plugins/Actions/Columns/VisitTotalActions.php create mode 100644 plugins/Actions/Columns/VisitTotalSearches.php create mode 100644 plugins/CoreHome/Columns/VisitFirstActionTime.php create mode 100644 plugins/CoreHome/Columns/VisitLastActionTime.php create mode 100644 plugins/CoreHome/Columns/VisitorDaysSinceFirst.php create mode 100644 plugins/CoreHome/Columns/VisitorDaysSinceOrder.php create mode 100644 plugins/CoreHome/Columns/VisitsCount.php create mode 100644 plugins/CoreHome/Segment.php diff --git a/core/Db/Schema/Mysql.php b/core/Db/Schema/Mysql.php index ef7d87b4dd..7d1645ca2f 100644 --- a/core/Db/Schema/Mysql.php +++ b/core/Db/Schema/Mysql.php @@ -148,22 +148,12 @@ class Mysql implements SchemaInterface idvisit INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, idsite INTEGER(10) UNSIGNED NOT NULL, idvisitor BINARY(8) NOT NULL, - visitor_localtime TIME NOT NULL, visitor_returning TINYINT(1) NOT NULL, - visitor_count_visits SMALLINT(5) UNSIGNED NOT NULL, - visitor_days_since_last SMALLINT(5) UNSIGNED NOT NULL, - visitor_days_since_order SMALLINT(5) UNSIGNED NOT NULL, - visitor_days_since_first SMALLINT(5) UNSIGNED NOT NULL, - visit_first_action_time DATETIME NOT NULL, - visit_last_action_time DATETIME 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, + visit_last_action_time DATETIME NOT NULL, config_id BINARY(8) NOT NULL, - config_resolution VARCHAR(9) NOT NULL, config_pdf TINYINT(1) NOT NULL, config_flash TINYINT(1) NOT NULL, config_java TINYINT(1) NOT NULL, @@ -175,7 +165,6 @@ class Mysql implements SchemaInterface config_silverlight TINYINT(1) NOT NULL, config_cookie TINYINT(1) NOT NULL, location_ip VARBINARY(16) NOT NULL, - location_browser_lang VARCHAR(20) NOT NULL, location_country CHAR(3) NOT NULL, location_region char(2) DEFAULT NULL, location_city varchar(255) DEFAULT NULL, diff --git a/core/Plugin/Segment.php b/core/Plugin/Segment.php index 52c2b04b8f..ea507f33af 100644 --- a/core/Plugin/Segment.php +++ b/core/Plugin/Segment.php @@ -108,6 +108,14 @@ class Segment $this->type = $type; } + /** + * @return string + */ + public function getType() + { + return $this->type; + } + /** * @param bool $permission */ diff --git a/core/Plugin/VisitDimension.php b/core/Plugin/VisitDimension.php index b7b3778a9e..def111f489 100644 --- a/core/Plugin/VisitDimension.php +++ b/core/Plugin/VisitDimension.php @@ -59,7 +59,11 @@ abstract class VisitDimension $segment->setSqlSegment('log_visit.' . $this->fieldName); } - $segment->setType(Segment::TYPE_DIMENSION); + $type = $segment->getType(); + + if (empty($type)) { + $segment->setType(Segment::TYPE_DIMENSION); + } $this->segments[] = $segment; } diff --git a/core/Tracker/Settings.php b/core/Tracker/Settings.php index c40df487b3..341eb6d69b 100644 --- a/core/Tracker/Settings.php +++ b/core/Tracker/Settings.php @@ -33,7 +33,6 @@ class Settings list($plugin_Flash, $plugin_Java, $plugin_Director, $plugin_Quicktime, $plugin_RealPlayer, $plugin_PDF, $plugin_WindowsMedia, $plugin_Gears, $plugin_Silverlight, $plugin_Cookie) = $this->request->getPlugins(); - $resolution = $this->request->getParam('res'); $userAgent = $this->request->getUserAgent(); $deviceDetector = new \DeviceDetector($userAgent); @@ -67,7 +66,6 @@ class Settings $this->params = array( 'config_id' => $configurationHash, - 'config_resolution' => $resolution, 'config_pdf' => $plugin_PDF, 'config_flash' => $plugin_Flash, 'config_java' => $plugin_Java, @@ -77,8 +75,7 @@ class Settings 'config_windowsmedia' => $plugin_WindowsMedia, 'config_gears' => $plugin_Gears, 'config_silverlight' => $plugin_Silverlight, - 'config_cookie' => $plugin_Cookie, - 'location_browser_lang' => $browserLang, + 'config_cookie' => $plugin_Cookie ); } diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php index aaba4b4fa4..da374d4dab 100644 --- a/core/Tracker/Visit.php +++ b/core/Tracker/Visit.php @@ -300,7 +300,6 @@ class Visit implements VisitInterface $this->visitorInfo = array_merge($this->visitorInfo, $this->visitorCustomVariables); $this->visitorInfo['visit_goal_converted'] = $visitIsConverted ? 1 : 0; - $this->visitorInfo['config_resolution'] = substr($this->visitorInfo['config_resolution'], 0, 9); $dimensions = VisitDimension::getAllDimensions(); foreach ($dimensions as $dimension) { @@ -505,22 +504,12 @@ class Visit implements VisitInterface protected function getNewVisitorInformation($action) { - $actionType = false; - if($action) { - $actionType = $action->getActionType(); - } - - $daysSinceFirstVisit = $this->request->getDaysSinceFirstVisit(); $visitCount = $this->request->getVisitCount(); $daysSinceLastVisit = $this->request->getDaysSinceLastVisit(); $daysSinceLastOrder = $this->request->getDaysSinceLastOrder(); $isReturningCustomer = ($daysSinceLastOrder !== false); - if ($daysSinceLastOrder === false) { - $daysSinceLastOrder = 0; - } - // User settings $userInfo = $this->getSettingsObject(); $userInfo = $userInfo->getInfo(); @@ -534,28 +523,11 @@ class Visit implements VisitInterface return array( 'idsite' => $this->request->getIdSite(), - 'visitor_localtime' => $this->request->getLocalTime(), 'idvisitor' => $this->getVisitorIdcookie(), 'visitor_returning' => $visitorReturning, - 'visitor_count_visits' => $visitCount, - 'visitor_days_since_last' => $daysSinceLastVisit, - 'visitor_days_since_order' => $daysSinceLastOrder, - 'visitor_days_since_first' => $daysSinceFirstVisit, - 'visit_first_action_time' => Tracker::getDatetimeFromTimestamp($this->request->getCurrentTimestamp()), - 'visit_last_action_time' => Tracker::getDatetimeFromTimestamp($this->request->getCurrentTimestamp()), - 'visit_total_actions' => in_array($actionType, - array(Action::TYPE_PAGE_URL, - Action::TYPE_DOWNLOAD, - Action::TYPE_OUTLINK, - Action::TYPE_SITE_SEARCH, - Action::TYPE_EVENT)) - ? 1 : 0, // if visit starts with something else (e.g. ecommerce order), don't record as an action - 'visit_total_searches' => $actionType == Action::TYPE_SITE_SEARCH ? 1 : 0, - 'visit_total_events' => $actionType == Action::TYPE_EVENT ? 1 : 0, 'visit_total_time' => self::cleanupVisitTotalTime($defaultTimeOnePageVisit), 'visit_goal_buyer' => $this->goalManager->getBuyerType(), 'config_id' => $userInfo['config_id'], - 'config_resolution' => $userInfo['config_resolution'], 'config_pdf' => $userInfo['config_pdf'], 'config_flash' => $userInfo['config_flash'], 'config_java' => $userInfo['config_java'], @@ -567,7 +539,6 @@ class Visit implements VisitInterface 'config_silverlight' => $userInfo['config_silverlight'], 'config_cookie' => $userInfo['config_cookie'], 'location_ip' => $this->getVisitorIp(), - 'location_browser_lang' => $userInfo['location_browser_lang'], ); } @@ -582,32 +553,6 @@ class Visit implements VisitInterface { $valuesToUpdate = array(); - if ($action) { - $actionType = $action->getActionType(); - $idActionUrl = $action->getIdActionUrlForEntryAndExitIds(); - - $incrementActions = false; - - if ($idActionUrl !== false) { - $incrementActions = true; - } - - if ($actionType == Action::TYPE_SITE_SEARCH) { - $valuesToUpdate['visit_total_searches'] = 'visit_total_searches + 1'; - $incrementActions = true; - } else if ($actionType == Action::TYPE_EVENT) { - $valuesToUpdate['visit_total_events'] = 'visit_total_events + 1'; - $incrementActions = true; - } - - if ($incrementActions) { - $valuesToUpdate['visit_total_actions'] = 'visit_total_actions + 1'; - } - } - - $datetimeServer = Tracker::getDatetimeFromTimestamp($this->request->getCurrentTimestamp()); - $valuesToUpdate['visit_last_action_time'] = $datetimeServer; - // Add 1 so it's always > 0 $visitTotalTime = 1 + $this->request->getCurrentTimestamp() - $this->visitorInfo['visit_first_action_time']; $valuesToUpdate['visit_total_time'] = self::cleanupVisitTotalTime($visitTotalTime); diff --git a/plugins/API/API.php b/plugins/API/API.php index 61818abf69..8af6471353 100644 --- a/plugins/API/API.php +++ b/plugins/API/API.php @@ -180,21 +180,6 @@ class API extends \Piwik\Plugin\API 'sqlFilterValue' => array('Piwik\IP', 'P2N'), 'permission' => $isAuthenticatedWithViewAccess, ); - $segments[] = array( - 'type' => 'metric', - 'category' => Piwik::translate('General_Visit'), - 'name' => 'General_NbActions', - 'segment' => 'actions', - 'sqlSegment' => 'log_visit.visit_total_actions', - ); - $segments[] = array( - 'type' => 'metric', - 'category' => Piwik::translate('General_Visit'), - 'name' => 'General_NbSearches', - 'segment' => 'searches', - 'sqlSegment' => 'log_visit.visit_total_searches', - 'acceptedValues' => 'To select all visits who used internal Site Search, use: &segment=searches>0', - ); $segments[] = array( 'type' => 'metric', 'category' => Piwik::translate('General_Visit'), @@ -220,21 +205,6 @@ class API extends \Piwik\Plugin\API 'segment' => 'daysSinceLastVisit', 'sqlSegment' => 'log_visit.visitor_days_since_last', ); - $segments[] = array( - 'type' => 'metric', - 'category' => Piwik::translate('General_Visit'), - 'name' => 'General_DaysSinceFirstVisit', - 'segment' => 'daysSinceFirstVisit', - 'sqlSegment' => 'log_visit.visitor_days_since_first', - ); - $segments[] = array( - 'type' => 'metric', - 'category' => Piwik::translate('General_Visit'), - 'name' => 'General_NumberOfVisits', - 'segment' => 'visitCount', - 'sqlSegment' => 'log_visit.visitor_count_visits', - ); - $segments[] = array( 'type' => 'dimension', 'category' => Piwik::translate('General_Visit'), diff --git a/plugins/Actions/Columns/EntryPageTitle.php b/plugins/Actions/Columns/EntryPageTitle.php index 5df614f9e1..5664ea7c21 100644 --- a/plugins/Actions/Columns/EntryPageTitle.php +++ b/plugins/Actions/Columns/EntryPageTitle.php @@ -29,9 +29,9 @@ class EntryPageTitle extends VisitDimension /** * @param Request $request - * @param $visit + * @param array $visit * @param Action|null $action - * @return bool + * @return int */ public function onNewVisit(Request $request, $visit, $action) { diff --git a/plugins/Actions/Columns/EntryPageUrl.php b/plugins/Actions/Columns/EntryPageUrl.php index b2b9ea0c5c..760f4b635a 100644 --- a/plugins/Actions/Columns/EntryPageUrl.php +++ b/plugins/Actions/Columns/EntryPageUrl.php @@ -29,9 +29,9 @@ class EntryPageUrl extends VisitDimension /** * @param Request $request - * @param $visit + * @param array $visit * @param Action|null $action - * @return bool + * @return int */ public function onNewVisit(Request $request, $visit, $action) { diff --git a/plugins/Actions/Columns/ExitPageTitle.php b/plugins/Actions/Columns/ExitPageTitle.php index ed2d7821dd..2f2054ac60 100644 --- a/plugins/Actions/Columns/ExitPageTitle.php +++ b/plugins/Actions/Columns/ExitPageTitle.php @@ -29,9 +29,9 @@ class ExitPageTitle extends VisitDimension /** * @param Request $request - * @param $visit + * @param array $visit * @param Action|null $action - * @return bool + * @return int|bool */ public function onNewVisit(Request $request, $visit, $action) { @@ -44,19 +44,19 @@ class ExitPageTitle extends VisitDimension return (int) $idActionName; } + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int|bool + */ public function onExistingVisit(Request $request, $visit, $action) { if (empty($action)) { return false; } - $id = $action->getIdActionNameForEntryAndExitIds(); - - if (!empty($id)) { - $id = (int) $id; - } - - return $id; + return $action->getIdActionNameForEntryAndExitIds(); } public function getName() diff --git a/plugins/Actions/Columns/ExitPageUrl.php b/plugins/Actions/Columns/ExitPageUrl.php index ad3c21ec42..82ad5c598a 100644 --- a/plugins/Actions/Columns/ExitPageUrl.php +++ b/plugins/Actions/Columns/ExitPageUrl.php @@ -29,9 +29,9 @@ class ExitPageUrl extends VisitDimension /** * @param Request $request - * @param $visit + * @param array $visit * @param Action|null $action - * @return bool + * @return int|bool */ public function onNewVisit(Request $request, $visit, $action) { diff --git a/plugins/Actions/Columns/VisitTotalActions.php b/plugins/Actions/Columns/VisitTotalActions.php new file mode 100644 index 0000000000..49177a3143 --- /dev/null +++ b/plugins/Actions/Columns/VisitTotalActions.php @@ -0,0 +1,94 @@ +<?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\Plugin\VisitDimension; +use Piwik\Plugins\CoreHome\Segment; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; +use Piwik\Tracker; + +class VisitTotalActions extends VisitDimension +{ + protected $fieldName = 'visit_total_actions'; + protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL'; + + protected function init() + { + $segment = new Segment(); + $segment->setType(Segment::TYPE_METRIC); + $segment->setSegment('actions'); + $segment->setName('General_NbActions'); + $this->addSegment($segment); + } + + public function getName() + { + return ''; + } + + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onNewVisit(Request $request, $visit, $action) + { + $actionType = false; + if ($action) { + $actionType = $action->getActionType(); + } + + $actions = array( + Action::TYPE_PAGE_URL, + Action::TYPE_DOWNLOAD, + Action::TYPE_OUTLINK, + Action::TYPE_SITE_SEARCH, + Action::TYPE_EVENT + ); + + // if visit starts with something else (e.g. ecommerce order), don't record as an action + if (in_array($actionType, $actions)) { + return 1; + } + + return 0; + } + + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onExistingVisit(Request $request, $visit, $action) + { + if (!$action) { + return false; + } + + $increment = 'visit_total_actions + 1'; + + $idActionUrl = $action->getIdActionUrlForEntryAndExitIds(); + + if ($idActionUrl !== false) { + return $increment; + } + + $actionType = $action->getActionType(); + + if (in_array($actionType, array(Action::TYPE_SITE_SEARCH, Action::TYPE_EVENT))) { + return $increment; + } + + return false; + } + +} \ No newline at end of file diff --git a/plugins/Actions/Columns/VisitTotalSearches.php b/plugins/Actions/Columns/VisitTotalSearches.php new file mode 100644 index 0000000000..42a9ac8b14 --- /dev/null +++ b/plugins/Actions/Columns/VisitTotalSearches.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\Columns; + +use Piwik\Plugin\VisitDimension; +use Piwik\Plugins\CoreHome\Segment; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; +use Piwik\Tracker; + +class VisitTotalSearches extends VisitDimension +{ + protected $fieldName = 'visit_total_searches'; + protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL'; + + protected function init() + { + $segment = new Segment(); + $segment->setType(Segment::TYPE_METRIC); + $segment->setSegment('searches'); + $segment->setName('General_NbSearches'); + $segment->setAcceptValues('To select all visits who used internal Site Search, use: &segment=searches>0'); + $this->addSegment($segment); + } + + public function getName() + { + return ''; + } + + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onNewVisit(Request $request, $visit, $action) + { + if ($this->isSiteSearchAction($action)) { + return 1; + } + + return 0; + } + + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onExistingVisit(Request $request, $visit, $action) + { + if ($this->isSiteSearchAction($action)) { + return 'visit_total_searches + 1'; + } + + return false; + } + + /** + * @param Action|null $action + * @return bool + */ + private function isSiteSearchAction($action) + { + return ($action && $action->getActionType() == Action::TYPE_SITE_SEARCH); + } + +} \ No newline at end of file diff --git a/plugins/CoreHome/Columns/VisitFirstActionTime.php b/plugins/CoreHome/Columns/VisitFirstActionTime.php new file mode 100644 index 0000000000..e0b7078fb8 --- /dev/null +++ b/plugins/CoreHome/Columns/VisitFirstActionTime.php @@ -0,0 +1,36 @@ +<?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\CoreHome\Columns; + +use Piwik\Plugin\VisitDimension; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; +use Piwik\Tracker; + +class VisitFirstActionTime extends VisitDimension +{ + protected $fieldName = 'visit_first_action_time'; + protected $fieldType = 'DATETIME NOT NULL'; + + public function getName() + { + return ''; + } + + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onNewVisit(Request $request, $visit, $action) + { + return Tracker::getDatetimeFromTimestamp($request->getCurrentTimestamp()); + } +} \ No newline at end of file diff --git a/plugins/CoreHome/Columns/VisitLastActionTime.php b/plugins/CoreHome/Columns/VisitLastActionTime.php new file mode 100644 index 0000000000..5c45cb31a5 --- /dev/null +++ b/plugins/CoreHome/Columns/VisitLastActionTime.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\CoreHome\Columns; + +use Piwik\Plugin\VisitDimension; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; +use Piwik\Tracker; + +class VisitLastActionTime extends VisitDimension +{ + protected $fieldName = 'visit_last_action_time'; + // we do not install or define column definition here as we need to create this column when installing as there is + // an index on it. Currently we do not define the index here... although we could overwrite the install() method + // and add column 'visit_last_action_time' and add index. Problem is there is also an index + // INDEX(idsite, config_id, visit_last_action_time) and we maybe not be sure whether config_id already exists at + // installing point (in case config_id is installed via dimension as well we do not know which column will be added + // first). + + public function getName() + { + return ''; + } + + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onNewVisit(Request $request, $visit, $action) + { + return Tracker::getDatetimeFromTimestamp($request->getCurrentTimestamp()); + } + + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onExistingVisit(Request $request, $visit, $action) + { + return $this->onNewVisit($request, $visit, $action); + } + +} \ No newline at end of file diff --git a/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php b/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php new file mode 100644 index 0000000000..c418e6e764 --- /dev/null +++ b/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php @@ -0,0 +1,45 @@ +<?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\CoreHome\Columns; + +use Piwik\Plugin\VisitDimension; +use Piwik\Plugins\CoreHome\Segment; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; + +class VisitorDaysSinceFirst extends VisitDimension +{ + protected $fieldName = 'visitor_days_since_first'; + protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL'; + + protected function init() + { + $segment = new Segment(); + $segment->setType(Segment::TYPE_METRIC); + $segment->setSegment('daysSinceFirstVisit'); + $segment->setName('General_DaysSinceFirstVisit'); + $this->addSegment($segment); + } + + public function getName() + { + return ''; + } + + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onNewVisit(Request $request, $visit, $action) + { + return $request->getDaysSinceFirstVisit(); + } +} \ No newline at end of file diff --git a/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php b/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php new file mode 100644 index 0000000000..5597a426f7 --- /dev/null +++ b/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php @@ -0,0 +1,41 @@ +<?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\CoreHome\Columns; + +use Piwik\Plugin\VisitDimension; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; + +class VisitorDaysSinceOrder extends VisitDimension +{ + protected $fieldName = 'visitor_days_since_order'; + protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL'; + + public function getName() + { + return ''; + } + + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onNewVisit(Request $request, $visit, $action) + { + $daysSinceLastOrder = $request->getDaysSinceLastOrder(); + + if ($daysSinceLastOrder === false) { + $daysSinceLastOrder = 0; + } + + return $daysSinceLastOrder; + } +} \ No newline at end of file diff --git a/plugins/CoreHome/Columns/VisitsCount.php b/plugins/CoreHome/Columns/VisitsCount.php new file mode 100644 index 0000000000..6b900eefef --- /dev/null +++ b/plugins/CoreHome/Columns/VisitsCount.php @@ -0,0 +1,45 @@ +<?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\CoreHome\Columns; + +use Piwik\Plugin\VisitDimension; +use Piwik\Plugins\CoreHome\Segment; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; + +class VisitsCount extends VisitDimension +{ + protected $fieldName = 'visitor_count_visits'; + protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL'; + + public function getName() + { + return ''; + } + + protected function init() + { + $segment = new Segment(); + $segment->setType(Segment::TYPE_METRIC); + $segment->setSegment('visitCount'); + $segment->setName('General_NumberOfVisits'); + $this->addSegment($segment); + } + + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onNewVisit(Request $request, $visit, $action) + { + return $request->getVisitCount(); + } +} \ No newline at end of file diff --git a/plugins/CoreHome/Segment.php b/plugins/CoreHome/Segment.php new file mode 100644 index 0000000000..7b6f2fbf57 --- /dev/null +++ b/plugins/CoreHome/Segment.php @@ -0,0 +1,21 @@ +<?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\CoreHome; + +/** + * CoreHome segment base class + */ +class Segment extends \Piwik\Plugin\Segment +{ + protected function init() + { + $this->setCategory('General_Visit'); + } +} + diff --git a/plugins/Events/Columns/TotalEvents.php b/plugins/Events/Columns/TotalEvents.php index 67ed9d7ae6..3d6ac9f33b 100644 --- a/plugins/Events/Columns/TotalEvents.php +++ b/plugins/Events/Columns/TotalEvents.php @@ -11,10 +11,13 @@ namespace Piwik\Plugins\Events\Columns; use Piwik\Piwik; use Piwik\Plugin\VisitDimension; use Piwik\Plugin\Segment; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; class TotalEvents extends VisitDimension -{ +{ protected $fieldName = 'visit_total_events'; + protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL'; protected function init() { @@ -31,4 +34,43 @@ class TotalEvents extends VisitDimension { return Piwik::translate('Events_EventName'); } + + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onNewVisit(Request $request, $visit, $action) + { + if ($this->isEventAction($action)) { + return 1; + } + + return 0; + } + + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onExistingVisit(Request $request, $visit, $action) + { + if ($this->isEventAction($action)) { + return 'visit_total_events + 1'; + } + + return false; + } + + /** + * @param Action|null $action + * @return bool + */ + private function isEventAction($action) + { + return ($action && $action->getActionType() == Action::TYPE_EVENT); + } } \ No newline at end of file diff --git a/plugins/UserSettings/Columns/Language.php b/plugins/UserSettings/Columns/Language.php index 120178ffb5..0345975639 100644 --- a/plugins/UserSettings/Columns/Language.php +++ b/plugins/UserSettings/Columns/Language.php @@ -10,11 +10,27 @@ namespace Piwik\Plugins\UserSettings\Columns; use Piwik\Piwik; use Piwik\Plugin\VisitDimension; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; class Language extends VisitDimension -{ +{ + protected $fieldName = 'location_browser_lang'; + protected $fieldType = 'VARCHAR(20) NOT NULL'; + public function getName() { return Piwik::translate('General_Language'); } + + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onNewVisit(Request $request, $visit, $action) + { + return substr($request->getBrowserLanguage(), 0, 20); + } } \ No newline at end of file diff --git a/plugins/UserSettings/Columns/Resolution.php b/plugins/UserSettings/Columns/Resolution.php index f9a5e1ee62..407daf7db4 100644 --- a/plugins/UserSettings/Columns/Resolution.php +++ b/plugins/UserSettings/Columns/Resolution.php @@ -11,10 +11,13 @@ namespace Piwik\Plugins\UserSettings\Columns; use Piwik\Piwik; use Piwik\Plugin\VisitDimension; use Piwik\Plugins\UserSettings\Segment; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; class Resolution extends VisitDimension { protected $fieldName = 'config_resolution'; + protected $fieldType = 'VARCHAR(9) NOT NULL'; protected function init() { @@ -25,6 +28,23 @@ class Resolution extends VisitDimension $this->addSegment($segment); } + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onNewVisit(Request $request, $visit, $action) + { + $resolution = $request->getParam('res'); + + if (!empty($resolution)) { + return substr($resolution, 0, 9); + } + + return $resolution; + } + public function getName() { return Piwik::translate('UserSettings_ColumnResolution'); diff --git a/plugins/VisitTime/Columns/Localtime.php b/plugins/VisitTime/Columns/Localtime.php index f20dde3fed..6f0cc5f727 100644 --- a/plugins/VisitTime/Columns/Localtime.php +++ b/plugins/VisitTime/Columns/Localtime.php @@ -11,10 +11,13 @@ namespace Piwik\Plugins\VisitTime\Columns; use Piwik\Piwik; use Piwik\Plugin\VisitDimension; use Piwik\Plugins\VisitTime\Segment; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; class Localtime extends VisitDimension { protected $fieldName = 'visitor_localtime'; + protected $fieldType = 'TIME NOT NULL'; protected function init() { @@ -30,4 +33,15 @@ class Localtime extends VisitDimension { return Piwik::translate('VisitTime_ColumnLocalTime'); } + + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onNewVisit(Request $request, $visit, $action) + { + return $request->getLocalTime(); + } } \ No newline at end of file diff --git a/plugins/VisitorInterest/Columns/Visitsbydayssincelastvisit.php b/plugins/VisitorInterest/Columns/Visitsbydayssincelastvisit.php index a114bf5476..075c6e7aae 100644 --- a/plugins/VisitorInterest/Columns/Visitsbydayssincelastvisit.php +++ b/plugins/VisitorInterest/Columns/Visitsbydayssincelastvisit.php @@ -10,11 +10,28 @@ namespace Piwik\Plugins\VisitorInterest\Columns; use Piwik\Piwik; use Piwik\Plugin\VisitDimension; +use Piwik\Tracker\Action; +use Piwik\Tracker\Request; class Visitsbydayssincelastvisit extends VisitDimension -{ +{ + protected $fieldName = 'visitor_days_since_last'; + protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL'; + public function getName() { return Piwik::translate('VisitorInterest_VisitsByDaysSinceLast'); } + + /** + * @param Request $request + * @param array $visit + * @param Action|null $action + * @return int + */ + public function onNewVisit(Request $request, $visit, $action) + { + return $request->getDaysSinceLastVisit(); + } + } \ No newline at end of file diff --git a/tests/PHPUnit/Integration/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml b/tests/PHPUnit/Integration/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml index 6d10c93942..19aefaace8 100644 --- a/tests/PHPUnit/Integration/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml +++ b/tests/PHPUnit/Integration/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml @@ -37,6 +37,13 @@ <name>Number of visits</name> <segment>visitCount</segment> </row> + <row> + <type>metric</type> + <category>Visit</category> + <name>Total events</name> + <segment>events</segment> + <acceptedValues>To select all visits who triggered an Event, use: &segment=events>0</acceptedValues> + </row> <row> <type>metric</type> <category>Visit</category> @@ -149,13 +156,6 @@ <segment>visitServerHour</segment> <acceptedValues>0, 1, 2, 3, ..., 20, 21, 22, 23</acceptedValues> </row> - <row> - <type>dimension</type> - <category>Visit</category> - <name>Total events</name> - <segment>events</segment> - <acceptedValues>To select all visits who triggered an Event, use: &segment=events>0</acceptedValues> - </row> <row> <type>dimension</type> <category>Visit</category> diff --git a/tests/PHPUnit/UI b/tests/PHPUnit/UI index b4ab7e0e73..06b7215cfe 160000 --- a/tests/PHPUnit/UI +++ b/tests/PHPUnit/UI @@ -1 +1 @@ -Subproject commit b4ab7e0e73efc617156824cdeac0b9930a7f3e4e +Subproject commit 06b7215cfeda6fabd3acee2db22dd7805e14ad52 -- GitLab