diff options
author | Stefan Giehl <stefan@piwik.org> | 2017-09-04 07:49:32 +0300 |
---|---|---|
committer | Matthieu Aubry <mattab@users.noreply.github.com> | 2017-09-04 07:49:32 +0300 |
commit | 660df51720386077f0a1433d86bcb96ef002de35 (patch) | |
tree | b953fcb22811d3e76f752713eee1c619b6d82098 /plugins/CoreHome | |
parent | b40a997defdea7ba6984b268bb7c791d089cfd3f (diff) |
Customizeable / Extendable Visitor Profile & Visitor Log (#11579)
* move setting visitor details into own classes instead of using an event
* move manipulating actions to VisitorDetails classes
* move some more parts to plugins
* update test files as order of columns changed
* implement new VisitorDetails method to provide actions
* move rendering actions to visitordetail classes
* render visitor properties in new classes
* makes it possible to attach icons to visitor log
* moves rendering of action tooltip into new visitordetails method
* adds event for extending custom action dimension fields
* small improvements
* fetch log_link_visit_action.idpageview for actions
* improve variable name
* started to improve/change visitor profile
* show devices summary in visitor profile
* also remove empty xml tags for api tests
* hide actions in visitor profile by default
* move all icons to the middle of visitor log
* small change
* move rendering referrer information to referrers plugin
* move provider logic to provider plugin
* show content interactions in visitor log
* improve look of content interactions/impressions in visitor log / profile
* hide idpageview from tests
* update changelog
* move rendering events to Events plugin
* do not hide duplicate page views in visitor log, but show them with a refresh icon instead
* show top visited pages in visitor profile
* always show visitor profile link in visitor log
Still hidden in a widget by default, as it might overlay some other content
* Show info about not shown actions
truncated due to config setting
* use bulk queries to fetch actions instead of fetching them for each visit
* small adjustments
* improve some loops to improve memory usage
* move gathering visitor profile informations to VisitorDetails classes
* update screenshots
* update test files
* move rendering of visitor profile summary to visitor details classes
* improve templates
* Makes VisitorDetailsAbstract class api and improves comments
* show visit details in visitor profile
* improve css
* reverse enumeration of visits in visitor profile
* improve css
* Show visit id in IP tooltip
* Small CSS improvements
* further adjustments
* sort devices by count
* adds UI tests for visitor log and profile
* Show bandwidth in visitor profile test
* show actions by default and add button to toggle all together
* CSS cleanup
* remove border around refresh icon
* add tooltip for refresh icon in profile
* move first/last visit before top visited pages
* Improve text shown for unique pageviews
* link urls in top visited pages
* improve sorting of device list
* improve tests
* Improve device overview in visitor profile
* only render top pages if at least one page was visited more than once
* make visitor id non bold
* hide visitor type icon in profile, and show latest visits icons in overview
* fix search engine icon in visitor details
* small improvements
* only render view if required
* show visit icons only on hover in profile
* remove from again
* test improves
* show text besides icon in profile header
* improve tests
* Removes unused CSS and JS
* Reformats CSS
* Removes invisible paper clip
* Removes unused profile images from Live plugin
* raise test timeouts
* Improve UI tests splitting for travis
* show device type in profile header if no resolution is available
* prevent text overlapping
* no retries
* fix test
* change summary order
* fix position of export icon
* fixes tooltip text
* improve pages overview
* visitor details order
* action tooltip order
* show only ecommerce icon if no goals where converted
* show custom variables summary in profile
* show user id in same size as headline
* link referer urls for first/last visit in profile
* make profile xml compatible
* try to improve ui test
* increase bottom marign
* increase version number
* small adjustments
* CSS Rewrite for visitor profile
* center action icons in visitor log and profile
* improve widgetized visitor profile
* small layout fix
* always populate raw referrer url for visitor details
* update expected test files
* Refactor profile summaries into additional classes
* update screenshots
* submodule update
* update piwik-icons submodule (#11904)
* update piwik-icons submodule
* fix some system tests
* update screenshots
* make device list xml compatible
* improve translation
* improve icon position
* improves spacings
* update test files
* small css improvement
* update screenshots
Diffstat (limited to 'plugins/CoreHome')
-rw-r--r-- | plugins/CoreHome/CoreHome.php | 20 | ||||
-rw-r--r-- | plugins/CoreHome/Visitor.php | 114 | ||||
-rw-r--r-- | plugins/CoreHome/VisitorDetails.php | 119 |
3 files changed, 119 insertions, 134 deletions
diff --git a/plugins/CoreHome/CoreHome.php b/plugins/CoreHome/CoreHome.php index fd3e729f74..be56c144f8 100644 --- a/plugins/CoreHome/CoreHome.php +++ b/plugins/CoreHome/CoreHome.php @@ -30,7 +30,6 @@ class CoreHome extends \Piwik\Plugin 'AssetManager.getJavaScriptFiles' => 'getJsFiles', 'AssetManager.filterMergedJavaScripts' => 'filterMergedJavaScripts', 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys', - 'Live.getAllVisitorDetails' => 'extendVisitorDetails', ); } @@ -39,25 +38,6 @@ class CoreHome extends \Piwik\Plugin $mergedContent = preg_replace('/(sourceMappingURL=(.*?).map)/', '', $mergedContent); } - public function extendVisitorDetails(&$visitor, $details) - { - $instance = new Visitor($details); - - $visitor['userId'] = $instance->getUserId(); - $visitor['visitorType'] = $instance->getVisitorReturning(); - $visitor['visitorTypeIcon'] = $instance->getVisitorReturningIcon(); - $visitor['visitConverted'] = $instance->isVisitorGoalConverted(); - $visitor['visitConvertedIcon'] = $instance->getVisitorGoalConvertedIcon(); - $visitor['visitCount'] = $instance->getVisitCount(); - $visitor['firstActionTimestamp'] = $instance->getTimestampFirstAction(); - $visitor['visitEcommerceStatus'] = $instance->getVisitEcommerceStatus(); - $visitor['visitEcommerceStatusIcon'] = $instance->getVisitEcommerceStatusIcon(); - $visitor['daysSinceFirstVisit'] = $instance->getDaysSinceFirstVisit(); - $visitor['daysSinceLastEcommerceOrder'] = $instance->getDaysSinceLastEcommerceOrder(); - $visitor['visitDuration'] = $instance->getVisitLength(); - $visitor['visitDurationPretty'] = $instance->getVisitLengthPretty(); - } - public function getStylesheetFiles(&$stylesheets) { $stylesheets[] = "libs/jquery/themes/base/jquery-ui.min.css"; diff --git a/plugins/CoreHome/Visitor.php b/plugins/CoreHome/Visitor.php deleted file mode 100644 index 962eabce31..0000000000 --- a/plugins/CoreHome/Visitor.php +++ /dev/null @@ -1,114 +0,0 @@ -<?php -/** - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - * - */ -namespace Piwik\Plugins\CoreHome; - -use Piwik\Metrics\Formatter; -use Piwik\Plugins\CoreHome\Columns\VisitGoalBuyer; - -class Visitor -{ - private $details = array(); - private $metricsFormatter = null; - - public function __construct($details) - { - $this->details = $details; - $this->metricsFormatter = new Formatter(); - } - - function getTimestampFirstAction() - { - return strtotime($this->details['visit_first_action_time']); - } - - function getVisitEcommerceStatusIcon() - { - $status = $this->getVisitEcommerceStatus(); - - if (in_array($status, array('ordered', 'orderedThenAbandonedCart'))) { - return "plugins/Morpheus/images/ecommerceOrder.png"; - } elseif ($status == 'abandonedCart') { - return "plugins/Morpheus/images/ecommerceAbandonedCart.png"; - } - // Note: it is important that there is no icon when there was no ecommerce conversion - return null; - } - - function getVisitEcommerceStatus() - { - return VisitGoalBuyer::getVisitEcommerceStatusFromId($this->details['visit_goal_buyer']); - } - - function isVisitorGoalConverted() - { - return $this->details['visit_goal_converted']; - } - - function getVisitorGoalConvertedIcon() - { - return $this->isVisitorGoalConverted() - ? "plugins/Morpheus/images/goal.png" - : null; - } - - function getDaysSinceFirstVisit() - { - return $this->details['visitor_days_since_first']; - } - - function getDaysSinceLastEcommerceOrder() - { - return $this->details['visitor_days_since_order']; - } - - function getVisitorReturning() - { - $type = $this->details['visitor_returning']; - return $type == 2 - ? 'returningCustomer' - : ($type == 1 - ? 'returning' - : 'new'); - } - - function getVisitorReturningIcon() - { - $type = $this->getVisitorReturning(); - if ($type == 'returning' - || $type == 'returningCustomer' - ) { - return "plugins/Live/images/returningVisitor.png"; - } - return null; - } - - function getVisitCount() - { - return $this->details['visitor_count_visits']; - } - - function getVisitLength() - { - return $this->details['visit_total_time']; - } - - function getVisitLengthPretty() - { - return $this->metricsFormatter->getPrettyTimeFromSeconds($this->details['visit_total_time'], true); - } - - function getUserId() - { - if (isset($this->details['user_id']) - && strlen($this->details['user_id']) > 0) { - return $this->details['user_id']; - } - return null; - } -}
\ No newline at end of file diff --git a/plugins/CoreHome/VisitorDetails.php b/plugins/CoreHome/VisitorDetails.php new file mode 100644 index 0000000000..88ae63a09c --- /dev/null +++ b/plugins/CoreHome/VisitorDetails.php @@ -0,0 +1,119 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ +namespace Piwik\Plugins\CoreHome; + +use Piwik\Metrics\Formatter; +use Piwik\Plugins\CoreHome\Columns\VisitGoalBuyer; +use Piwik\Plugins\Live\VisitorDetailsAbstract; + +class VisitorDetails extends VisitorDetailsAbstract +{ + public function extendVisitorDetails(&$visitor) + { + $visitor['userId'] = $this->getUserId(); + $visitor['visitorType'] = $this->getVisitorReturning(); + $visitor['visitorTypeIcon'] = $this->getVisitorReturningIcon(); + $visitor['visitConverted'] = $this->isVisitorGoalConverted(); + $visitor['visitConvertedIcon'] = $this->getVisitorGoalConvertedIcon(); + $visitor['visitCount'] = $this->getVisitCount(); + $visitor['visitEcommerceStatus'] = $this->getVisitEcommerceStatus(); + $visitor['visitEcommerceStatusIcon'] = $this->getVisitEcommerceStatusIcon(); + $visitor['daysSinceFirstVisit'] = $this->getDaysSinceFirstVisit(); + $visitor['daysSinceLastEcommerceOrder'] = $this->getDaysSinceLastEcommerceOrder(); + $visitor['visitDuration'] = $this->getVisitLength(); + $visitor['visitDurationPretty'] = $this->getVisitLengthPretty(); + } + + protected function getVisitEcommerceStatusIcon() + { + $status = $this->getVisitEcommerceStatus(); + + if (in_array($status, array('ordered', 'orderedThenAbandonedCart'))) { + return "plugins/Morpheus/images/ecommerceOrder.png"; + } elseif ($status == 'abandonedCart') { + return "plugins/Morpheus/images/ecommerceAbandonedCart.png"; + } + // Note: it is important that there is no icon when there was no ecommerce conversion + return null; + } + + protected function getVisitEcommerceStatus() + { + return VisitGoalBuyer::getVisitEcommerceStatusFromId($this->details['visit_goal_buyer']); + } + + protected function isVisitorGoalConverted() + { + return $this->details['visit_goal_converted']; + } + + protected function getVisitorGoalConvertedIcon() + { + return $this->isVisitorGoalConverted() + ? "plugins/Morpheus/images/goal.png" + : null; + } + + protected function getDaysSinceFirstVisit() + { + return $this->details['visitor_days_since_first']; + } + + protected function getDaysSinceLastEcommerceOrder() + { + return $this->details['visitor_days_since_order']; + } + + protected function getVisitorReturning() + { + $type = $this->details['visitor_returning']; + return $type == 2 + ? 'returningCustomer' + : ($type == 1 + ? 'returning' + : 'new'); + } + + protected function getVisitorReturningIcon() + { + $type = $this->getVisitorReturning(); + if ($type == 'returning' + || $type == 'returningCustomer' + ) { + return "plugins/Live/images/returningVisitor.png"; + } + return null; + } + + protected function getVisitCount() + { + return $this->details['visitor_count_visits']; + } + + protected function getVisitLength() + { + return $this->details['visit_total_time']; + } + + protected function getVisitLengthPretty() + { + $formatter = new Formatter(); + return $formatter->getPrettyTimeFromSeconds($this->details['visit_total_time'], true); + } + + protected function getUserId() + { + if (isset($this->details['user_id']) + && strlen($this->details['user_id']) > 0 + ) { + return $this->details['user_id']; + } + return null; + } +}
\ No newline at end of file |