diff options
Diffstat (limited to 'plugins/Live')
-rw-r--r-- | plugins/Live/API.php | 30 | ||||
-rw-r--r-- | plugins/Live/Controller.php | 15 | ||||
-rw-r--r-- | plugins/Live/javascripts/visitorProfile.js | 61 | ||||
-rw-r--r-- | plugins/Live/stylesheets/visitor_profile.less | 4 | ||||
-rw-r--r-- | plugins/Live/templates/getVisitorProfilePopup.twig | 5 |
5 files changed, 77 insertions, 38 deletions
diff --git a/plugins/Live/API.php b/plugins/Live/API.php index c58aefbed0..85ac7c28cd 100644 --- a/plugins/Live/API.php +++ b/plugins/Live/API.php @@ -172,17 +172,17 @@ class API * TODO: check for goals plugin, etc. * * @param int $idSite Site ID - * @param string $idVisitor The ID of the visitor whose profile to retrieve. + * @param string $visitorId The ID of the visitor whose profile to retrieve. * @param string|false $segment * @return array */ - public function getVisitorProfile($idSite, $idVisitor, $segment = false) + public function getVisitorProfile($idSite, $visitorId, $segment = false) { - if ($idVisitor === false) { - $idVisitor = $this->getMostRecentVisitorId($idSite, $segment); + if ($visitorId === false) { + $visitorId = $this->getMostRecentVisitorId($idSite, $segment); } - $newSegment = ($segment === false ? '' : $segment . ';') . 'visitorId==' . $idVisitor; + $newSegment = ($segment === false ? '' : $segment . ';') . 'visitorId==' . $visitorId; $visits = $this->getLastVisitsDetails($idSite, $period = false, $date = false, $newSegment, $filter_limit = self::VISITOR_PROFILE_MAX_VISITS_TO_AGGREGATE, @@ -309,8 +309,8 @@ class API // TODO: make sure order of visitor ids is not changed if a returning visitor visits while the user is // looking at the popup. $latestVisitTime = reset($rows)->getColumn('lastActionDateTime'); - $result['nextVisitorId'] = $this->getAdjacentVisitorId($idSite, $idVisitor, $latestVisitTime, $segment, $getNext = true); - $result['prevVisitorId'] = $this->getAdjacentVisitorId($idSite, $idVisitor, $latestVisitTime, $segment, $getNext = false); + $result['nextVisitorId'] = $this->getAdjacentVisitorId($idSite, $visitorId, $latestVisitTime, $segment, $getNext = true); + $result['prevVisitorId'] = $this->getAdjacentVisitorId($idSite, $visitorId, $latestVisitTime, $segment, $getNext = false); Piwik_PostEvent(Live::GET_EXTRA_VISITOR_DETAILS_EVENT, array(&$result)); @@ -344,8 +344,8 @@ class API * in the log_visit table. * * @param int $idSite The ID of the site whose visits should be looked at. - * @param string $idVisitor The ID of the visitor to get an adjacent visitor for. - * @param string $visitLastActionTime The last action time of the latest visit for $idVisitor. + * @param string $visitorId The ID of the visitor to get an adjacent visitor for. + * @param string $visitLastActionTime The last action time of the latest visit for $visitorId. * @param string $segment * @param bool $getNext Whether to retrieve the next visitor or the previous visitor. The next * visitor will be the visitor that appears chronologically later in the @@ -353,7 +353,7 @@ class API * earlier. * @return string The hex visitor ID. */ - private function getAdjacentVisitorId($idSite, $idVisitor, $visitLastActionTime, $segment, $getNext) + private function getAdjacentVisitorId($idSite, $visitorId, $visitLastActionTime, $segment, $getNext) { if ($getNext) { $visitLastActionTimeCondition = "sub.visit_last_action_time <= ?"; @@ -366,7 +366,7 @@ class API $select = "log_visit.idvisitor, MAX(log_visit.visit_last_action_time) as visit_last_action_time"; $from = "log_visit"; $where = "log_visit.idsite = ? AND log_visit.idvisitor <> UNHEX(?)"; - $whereBind = array($idSite, $idVisitor); + $whereBind = array($idSite, $visitorId); $orderBy = "MAX(log_visit.visit_last_action_time) $orderByDir"; $groupBy = "log_visit.idvisitor"; @@ -379,11 +379,11 @@ class API LIMIT 1"; $bind = array_merge($queryInfo['bind'], array($visitLastActionTime)); - $idVisitor = Db::fetchOne($sql, $bind); - if (!empty($idVisitor)) { - $idVisitor = bin2hex($idVisitor); + $visitorId = Db::fetchOne($sql, $bind); + if (!empty($visitorId)) { + $visitorId = bin2hex($visitorId); } - return $idVisitor; + return $visitorId; } /** diff --git a/plugins/Live/Controller.php b/plugins/Live/Controller.php index 30f56a43d7..b5114679b3 100644 --- a/plugins/Live/Controller.php +++ b/plugins/Live/Controller.php @@ -10,6 +10,7 @@ */ namespace Piwik\Plugins\Live; +use Piwik\Url; use Piwik\API\Request; use Piwik\Common; use Piwik\Piwik; @@ -146,7 +147,9 @@ class Controller extends \Piwik\Controller $view->idSite = $idSite; $view->goals = Goals_API::getInstance()->getGoals($idSite); $view->visitorData = Request::processRequest('Live.getVisitorProfile'); - $view->userCountryMap = $this->getUserCountryMapForVisitorProfile(); + if (Common::getRequestVar('showMap', 1) == 1) { + $view->userCountryMapUrl = $this->getUserCountryMapUrlForVisitorProfile(); + } // TODO: disabled until segmentation issue can be dealt w/ (if enabled, last 24 months of data will be archived w/ // segment every visitor ID) $view->lastVisitsChart = ''; //$this->getLastVisitsForVisitorProfile(); @@ -193,10 +196,14 @@ class Controller extends \Piwik\Controller return $result; } - private function getUserCountryMapForVisitorProfile() + private function getUserCountryMapUrlForVisitorProfile() { - $params = array('standalone' => false, 'fetch' => true, 'segment' => self::getSegmentWithVisitorId()); - return FrontController::getInstance()->fetchDispatch('UserCountryMap', 'realtimeMap', $params); // TODO: check if plugin is enabled? + $params = array( + 'module' => 'UserCountryMap', + 'action' => 'realtimeMap', + 'segment' => self::getSegmentWithVisitorId() + ); + return Url::getCurrentQueryStringWithParametersModified($params); } private static function getSegmentWithVisitorId() diff --git a/plugins/Live/javascripts/visitorProfile.js b/plugins/Live/javascripts/visitorProfile.js index 7c1aa9a301..b7e53f8938 100644 --- a/plugins/Live/javascripts/visitorProfile.js +++ b/plugins/Live/javascripts/visitorProfile.js @@ -43,7 +43,14 @@ * @param {String} visitorId The string visitor ID. */ VisitorProfileControl.showPopover = function (visitorId) { - var url = 'module=Live&action=getVisitorProfilePopup&idVisitor=' + encodeURIComponent(visitorId); + var url = 'module=Live&action=getVisitorProfilePopup&visitorId=' + encodeURIComponent(visitorId); + + // if there is already a map shown on the screen, do not show the map in the popup. kartograph seems + // to only support showing one map at a time. + if ($('.RealTimeMap').length > 0) { + url += '&showMap=0'; + } + Piwik_Popover.createPopupAndLoadUrl(url, '', 'visitor-profile-popup'); }; @@ -105,27 +112,49 @@ $element.on('click', '.visitor-profile-show-map', function (e) { e.preventDefault(); + self.toggleMap(); + return false; + }); + }, - var $map = $('.visitor-profile-map', $element); - if ($map.is(':hidden')) { - if ($map.height() < 1) { - $map.resize(); - } - - $map.slideDown('slow'); - var newLabel = 'Live_HideMap_js'; + toggleMap: function () { + var $element = this.$element, + $map = $('.visitor-profile-map', $element); + if (!$map.children().length) { // if the map hasn't been loaded, load it + this._loadMap($map); + return; + } - piwikHelper.lazyScrollTo($('.visitor-profile-location', $element)[0], 400); - } else { - $map.slideUp('slow'); - var newLabel = 'Live_ShowMap_js'; + if ($map.is(':hidden')) { // show the map if it is hidden + if ($map.height() < 1) { + $map.resize(); } - newLabel = _pk_translate(newLabel).replace(' ', '\xA0'); - $(this).text('(' + newLabel + ')'); + $map.slideDown('slow'); + var newLabel = 'Live_HideMap_js'; - return false; + piwikHelper.lazyScrollTo($('.visitor-profile-location', $element)[0], 400); + } else { // hide the map if it is shown + $map.slideUp('slow'); + var newLabel = 'Live_ShowMap_js'; + } + + newLabel = _pk_translate(newLabel).replace(' ', '\xA0'); + $('.visitor-profile-show-map', $element).text('(' + newLabel + ')'); + }, + + _loadMap: function ($map) { + var self = this; + + var ajax = new ajaxHelper(); + ajax.setUrl($map.attr('data-href')); + ajax.setCallback(function (response) { + $map.html(response); + self.toggleMap(); }); + ajax.setFormat('html'); + ajax.setLoadingElement($('.visitor-profile-location > p > .loadingPiwik', self.$element)); + ajax.send(); }, _loadMoreVisits: function () { diff --git a/plugins/Live/stylesheets/visitor_profile.less b/plugins/Live/stylesheets/visitor_profile.less index cf1db666da..93abb01404 100644 --- a/plugins/Live/stylesheets/visitor_profile.less +++ b/plugins/Live/stylesheets/visitor_profile.less @@ -292,6 +292,10 @@ } } +.visitor-profile-location>p>.loadingPiwik { + padding:0 0 0 4px; +} + .visitor-profile-pages-visited { height:unit(@visitor_profile_visits_title_height, px); overflow-y:auto; diff --git a/plugins/Live/templates/getVisitorProfilePopup.twig b/plugins/Live/templates/getVisitorProfilePopup.twig index d57bb58cb0..571f742be4 100644 --- a/plugins/Live/templates/getVisitorProfilePopup.twig +++ b/plugins/Live/templates/getVisitorProfilePopup.twig @@ -75,10 +75,9 @@ {% set entryCountry %}<img src="{{ entry.flag }}" title="{{ entry.prettyName }}"/> {{ entry.prettyName }}{% endset %} {{- 'General_XFromY'|translate(entryVisits, entryCountry)|raw -}}{% if not loop.last %}, {% endif %} {%- endfor %} - <a class="visitor-profile-show-map" href="#">({{ 'Live_ShowMap_js'|translate|replace({' ': ' '})|raw }})</a> + <a class="visitor-profile-show-map" href="#" {% if userCountryMapUrl|default('') is empty %}style="display:none"{% endif %}>({{ 'Live_ShowMap_js'|translate|replace({' ': ' '})|raw }})</a> <img class="loadingPiwik" style="display:none;" src="plugins/Zeitgeist/images/loading-blue.gif"/> </p> - <div class="visitor-profile-map" style="display:none"> - {{ userCountryMap|raw }} + <div class="visitor-profile-map" style="display:none" data-href="{{ userCountryMapUrl|default('') }}"> </div> </div> </div> |