public function index()
 {
     Piwik::checkUserHasSuperUserAccess();
     $view = new View('@TasksTimetable/index.twig');
     $this->setGeneralVariablesView($view);
     $tasks = Option::get('TaskScheduler.timetable');
     if (!empty($tasks)) {
         $tasks = unserialize($tasks);
     }
     if (empty($tasks)) {
         $tasks = array();
     } else {
         asort($tasks);
     }
     $tsNow = Date::now()->getTimestamp();
     $dateFormat = Piwik::translate(Date::DATE_FORMAT_LONG) . ' h:mm:ss';
     $formatter = new Formatter();
     $tasksFormatted = array();
     foreach ($tasks as $name => $timestamp) {
         $tasksFormatted[] = array('name' => $name, 'executionDate' => Date::factory($timestamp)->getLocalized($dateFormat), 'ts_difference' => $formatter->getPrettyTimeFromSeconds($timestamp - $tsNow));
     }
     $view->currentTime = Date::now()->getLocalized($dateFormat);
     $view->tasks = $tasksFormatted;
     return $view->render();
 }
示例#2
0
 /**
  * @param $visits
  * @param $visitorId
  * @param $segment
  * @param $numLastVisits
  * @return array
  * @throws Exception
  */
 public function makeVisitorProfile(DataTable $visits, $visitorId, $segment, $numLastVisits)
 {
     $this->initVisitorProfile();
     /** @var DataTable\Row $visit */
     foreach ($visits->getRows() as $visit) {
         ++$this->profile['totalVisits'];
         $this->profile['totalVisitDuration'] += $visit->getColumn('visitDuration');
         $this->profile['totalActions'] += $visit->getColumn('actions');
         $this->profile['totalGoalConversions'] += $visit->getColumn('goalConversions');
         // individual goal conversions are stored in action details
         foreach ($visit->getColumn('actionDetails') as $action) {
             $this->handleIfGoalAction($action);
             $this->handleIfEcommerceAction($action);
             $this->handleIfSiteSearchAction($action);
             $this->handleIfPageGenerationTime($action);
         }
         $this->handleGeoLocation($visit);
     }
     $this->handleGeoLocationCountries();
     $this->handleGeoLocationContinents();
     $this->handleSiteSearches();
     $this->handleAveragePageGenerationTime();
     $formatter = new Formatter();
     $this->profile['totalVisitDurationPretty'] = $formatter->getPrettyTimeFromSeconds($this->profile['totalVisitDuration'], true);
     $this->handleVisitsSummary($visits);
     $this->handleAdjacentVisitorIds($visits, $visitorId, $segment);
     // use N most recent visits for last_visits
     $visits->deleteRowsOffset($numLastVisits);
     $this->profile['lastVisits'] = $visits;
     $this->profile['userId'] = $visit->getColumn('userId');
     return $this->profile;
 }
 public function format($value, Formatter $formatter)
 {
     if ($formatter instanceof Formatter\Html && !$value) {
         return '-';
     } else {
         return $formatter->getPrettyTimeFromSeconds($value, $displayAsSentence = true);
     }
 }
 /**
  * @dataProvider getPrettyTimeFromSecondsData
  */
 public function test_getPrettyTimeFromSeconds_ReturnsCorrectResult($seconds, $expected)
 {
     if ($seconds * 100 > PHP_INT_MAX) {
         $this->markTestSkipped("Will not pass on 32-bit machine.");
     }
     $sentenceExpected = $expected[0];
     $this->assertEquals($sentenceExpected, $this->formatter->getPrettyTimeFromSeconds($seconds, $sentence = true));
     $numericExpected = $expected[1];
     $this->assertEquals($numericExpected, $this->formatter->getPrettyTimeFromSeconds($seconds, $sentence = false));
 }
示例#5
0
文件: Base.php 项目: piwik/piwik
 protected function addPageDisplayProperties(ViewDataTable $view)
 {
     $view->config->addTranslations(array('nb_hits' => Piwik::translate('General_ColumnPageviews'), 'nb_visits' => Piwik::translate('General_ColumnUniquePageviews')));
     $formatter = new Formatter();
     // add avg_generation_time tooltip
     $tooltipCallback = function ($hits, $min, $max) use($formatter) {
         if (!$hits) {
             return false;
         }
         return Piwik::translate("Actions_AvgGenerationTimeTooltip", array($hits, "<br />", $formatter->getPrettyTimeFromSeconds($min, true), $formatter->getPrettyTimeFromSeconds($max, true)));
     };
     $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 render()
 {
     $lastMinutes = Config::getInstance()->General[Controller::SIMPLE_VISIT_COUNT_WIDGET_LAST_MINUTES_CONFIG_KEY];
     $params = array('lastMinutes' => $lastMinutes, 'showColumns' => array('visits', 'visitors', 'actions'));
     $lastNData = Request::processRequest('Live.getCounters', $params);
     $formatter = new Formatter();
     $view = new View('@Live/getSimpleLastVisitCount');
     $view->lastMinutes = $lastMinutes;
     $view->visitors = $formatter->getPrettyNumber($lastNData[0]['visitors']);
     $view->visits = $formatter->getPrettyNumber($lastNData[0]['visits']);
     $view->actions = $formatter->getPrettyNumber($lastNData[0]['actions']);
     $view->refreshAfterXSecs = Config::getInstance()->General['live_widget_refresh_after_seconds'];
     $view->translations = array('one_visitor' => Piwik::translate('Live_NbVisitor'), 'visitors' => Piwik::translate('Live_NbVisitors'), 'one_visit' => Piwik::translate('General_OneVisit'), 'visits' => Piwik::translate('General_NVisits'), 'one_action' => Piwik::translate('General_OneAction'), 'actions' => Piwik::translate('VisitsSummary_NbActionsDescription'), 'one_minute' => Piwik::translate('General_OneMinute'), 'minutes' => Piwik::translate('General_NMinutes'));
     return $view->render();
 }
示例#7
0
 /**
  * Returns the index for this plugin. Shows every other report defined by this plugin,
  * except the '...ByYear' reports. These can be loaded as related reports.
  *
  * Also, the 'getIndividual...Summary' reports are loaded by AJAX, as they can take
  * a significant amount of time to load on setups w/ lots of websites.
  */
 public function index()
 {
     Piwik::checkUserHasSuperUserAccess();
     $view = new View('@DBStats/index');
     $this->setBasicVariablesView($view);
     $view->databaseUsageSummary = $this->renderReport('getDatabaseUsageSummary');
     $view->trackerDataSummary = $this->renderReport('getTrackerDataSummary');
     $view->metricDataSummary = $this->renderReport('getMetricDataSummary');
     $view->reportDataSummary = $this->renderReport('getReportDataSummary');
     $view->adminDataSummary = $this->renderReport('getAdminDataSummary');
     list($siteCount, $userCount, $totalSpaceUsed) = API::getInstance()->getGeneralInformation();
     $formatter = new Formatter();
     $view->siteCount = $formatter->getPrettyNumber($siteCount);
     $view->userCount = $formatter->getPrettyNumber($userCount);
     $view->totalSpaceUsed = $formatter->getPrettySizeFromBytes($totalSpaceUsed);
     return $view->render();
 }
示例#8
0
 public function getMetrics($domain)
 {
     $ages = array();
     $age = $this->getAgeArchiveOrg($domain);
     if ($age > 0) {
         $ages[] = $age;
     }
     $age = $this->getAgeWhoIs($domain);
     if ($age > 0) {
         $ages[] = $age;
     }
     $age = $this->getAgeWhoisCom($domain);
     if ($age > 0) {
         $ages[] = $age;
     }
     if (count($ages) > 0) {
         $value = min($ages);
         $value = $this->formatter->getPrettyTimeFromSeconds(time() - $value, true);
     } else {
         $value = null;
     }
     return array(new Metric('domain-age', 'SEO_DomainAge', $value, 'plugins/SEO/images/whois.png'));
 }
示例#9
0
 /**
  * Derive the unit name from a column name
  * @param $column
  * @param $idSite
  * @return string
  * @ignore
  */
 public static function getUnit($column, $idSite)
 {
     $nameToUnit = array('_rate' => '%', 'revenue' => Formatter::getCurrencySymbol($idSite), '_time_' => 's');
     foreach ($nameToUnit as $pattern => $type) {
         if (strpos($column, $pattern) !== false) {
             return $type;
         }
     }
     return '';
 }
 /**
  * Here you can configure how your report should be displayed. For instance whether your report supports a search
  * etc. You can also change the default request config. For instance change how many rows are displayed by default.
  *
  * @param ViewDataTable $view
  */
 public function configureView(ViewDataTable $view)
 {
     $idDimension = Common::getRequestVar('idDimension', 0, 'int');
     if ($idDimension < 1) {
         return;
     }
     $isWidget = Common::getRequestVar('widget', 0, 'int');
     $module = Common::getRequestVar('module', '', 'string');
     if ($isWidget && $module !== 'Widgetize' && $view->isViewDataTableId(HtmlTable::ID)) {
         // we disable row evolution as it would not forward the idDimension when requesting the row evolution
         // this is a limitation in row evolution
         $view->config->disable_row_evolution = true;
     }
     $module = $view->requestConfig->getApiModuleToRequest();
     $method = $view->requestConfig->getApiMethodToRequest();
     $idReport = sprintf('%s_%s_idDimension--%d', $module, $method, $idDimension);
     if ($view->requestConfig->idSubtable) {
         $view->config->addTranslation('label', Piwik::translate('Actions_ColumnActionURL'));
     } elseif (!empty($this->dimension)) {
         $view->config->addTranslation('label', $this->dimension->getName());
     }
     $view->requestConfig->request_parameters_to_modify['idDimension'] = $idDimension;
     $view->requestConfig->request_parameters_to_modify['reportUniqueId'] = $idReport;
     $view->config->custom_parameters['scopeOfDimension'] = $this->scopeOfDimension;
     if ($this->scopeOfDimension === CustomDimensions::SCOPE_VISIT) {
         // Goal metrics for each custom dimension  of 'visit' scope is processed in Archiver via aggregateFromConversions
         $view->config->show_goals = true;
         $view->config->columns_to_display = array('label', 'nb_visits', 'nb_uniq_visitors', 'nb_users', 'nb_actions', 'nb_actions_per_visit', 'avg_time_on_site', 'bounce_rate');
         $view->config->filters[] = function (DataTable $table) use($view) {
             $userId = new UserId();
             if (!$userId->hasDataTableUsers($table)) {
                 $view->config->removeColumnToDisplay('nb_users');
             }
             if ($table->getRowsCount() > 0 && !$table->getFirstRow()->hasColumn('nb_uniq_visitors')) {
                 $view->config->removeColumnToDisplay('nb_uniq_visitors');
             }
         };
     } elseif ($this->scopeOfDimension === CustomDimensions::SCOPE_ACTION) {
         $view->config->columns_to_display = array('label', 'nb_hits', 'nb_visits', 'bounce_rate', 'avg_time_on_dimension', 'exit_rate', 'avg_time_generation');
         $formatter = new Metrics\Formatter();
         // add avg_generation_time tooltip
         $tooltipCallback = function ($hits, $min, $max) use($formatter) {
             if (!$hits) {
                 return false;
             }
             return Piwik::translate("Actions_AvgGenerationTimeTooltip", array($hits, "<br />", $formatter->getPrettyTimeFromSeconds($min, true), $formatter->getPrettyTimeFromSeconds($max, true)));
         };
         $view->config->filters[] = array('ColumnCallbackAddMetadata', array(array('nb_hits_with_time_generation', 'min_time_generation', 'max_time_generation'), 'avg_time_generation_tooltip', $tooltipCallback));
     }
     $view->config->show_table_all_columns = false;
 }
 /**
  * Prettifies a metric value based on the column name.
  *
  * @param int $idSite The ID of the site the metric is for (used if the column value is an amount of money).
  * @param string $columnName The metric name.
  * @param mixed $value The metric value.
  * @param bool $isHtml If true, replaces all spaces with `'&nbsp;'`.
  * @return string
  */
 public static function getPrettyValue(Formatter $formatter, $idSite, $columnName, $value)
 {
     if (!is_numeric($value)) {
         return $value;
     }
     // Display time in human readable
     if (strpos($columnName, 'time_generation') !== false) {
         return $formatter->getPrettyTimeFromSeconds($value, true);
     }
     if (strpos($columnName, 'time') !== false) {
         return $formatter->getPrettyTimeFromSeconds($value);
     }
     // Add revenue symbol to revenues
     $isMoneyMetric = strpos($columnName, 'revenue') !== false || strpos($columnName, 'price') !== false;
     if ($isMoneyMetric && strpos($columnName, 'evolution') === false) {
         return $formatter->getPrettyMoney($value, $idSite);
     }
     // Add % symbol to rates
     if (strpos($columnName, '_rate') !== false) {
         if (strpos($value, "%") === false) {
             return $value . "%";
         }
     }
     return $value;
 }
示例#12
0
文件: Twig.php 项目: normimuc/piwik
 protected function addFilter_money()
 {
     $formatter = $this->formatter;
     $moneyFilter = new Twig_SimpleFilter('money', function ($amount) use($formatter) {
         if (func_num_args() != 2) {
             throw new Exception('the money modifier expects one parameter: the idSite.');
         }
         $idSite = func_get_args();
         $idSite = $idSite[1];
         $currencySymbol = Formatter::getCurrencySymbol($idSite);
         return NumberFormatter::getInstance()->formatCurrency($amount, $currencySymbol, GoalManager::REVENUE_PRECISION);
     });
     $this->twig->addFilter($moneyFilter);
 }
示例#13
0
 /**
  * The "Manage Users and Permissions" Admin UI screen
  */
 function index()
 {
     Piwik::checkUserIsNotAnonymous();
     $view = new View('@UsersManager/index');
     $IdSitesAdmin = APISitesManager::getInstance()->getSitesIdWithAdminAccess();
     $idSiteSelected = 1;
     if (count($IdSitesAdmin) > 0) {
         $defaultWebsiteId = $IdSitesAdmin[0];
         $idSiteSelected = Common::getRequestVar('idSite', $defaultWebsiteId);
     }
     if ($idSiteSelected === 'all') {
         $usersAccessByWebsite = array();
         $defaultReportSiteName = $this->translator->translate('UsersManager_ApplyToAllWebsites');
     } else {
         $defaultReportSiteName = Site::getNameFor($idSiteSelected);
         try {
             $usersAccessByWebsite = APIUsersManager::getInstance()->getUsersAccessFromSite($idSiteSelected);
         } catch (NoAccessException $e) {
             return $this->noAdminAccessToWebsite($idSiteSelected, $defaultReportSiteName, $e->getMessage());
         }
     }
     // we dont want to display the user currently logged so that the user can't change his settings from admin to view...
     $currentlyLogged = Piwik::getCurrentUserLogin();
     $usersLogin = APIUsersManager::getInstance()->getUsersLogin();
     foreach ($usersLogin as $login) {
         if (!isset($usersAccessByWebsite[$login])) {
             $usersAccessByWebsite[$login] = 'noaccess';
         }
     }
     unset($usersAccessByWebsite[$currentlyLogged]);
     // $usersAccessByWebsite is not supposed to contain unexistant logins, but it does when upgrading from some old Piwik version
     foreach ($usersAccessByWebsite as $login => $access) {
         if (!in_array($login, $usersLogin)) {
             unset($usersAccessByWebsite[$login]);
             continue;
         }
     }
     ksort($usersAccessByWebsite);
     $users = array();
     $superUsers = array();
     $usersAliasByLogin = array();
     $formatter = new Formatter();
     if (Piwik::isUserHasSomeAdminAccess()) {
         $view->showLastSeen = true;
         $users = APIUsersManager::getInstance()->getUsers();
         foreach ($users as $index => $user) {
             $usersAliasByLogin[$user['login']] = $user['alias'];
             $lastSeen = LastSeenTimeLogger::getLastSeenTimeForUser($user['login']);
             $users[$index]['last_seen'] = $lastSeen == 0 ? false : $formatter->getPrettyTimeFromSeconds(time() - $lastSeen);
         }
         if (Piwik::hasUserSuperUserAccess()) {
             foreach ($users as $user) {
                 if ($user['superuser_access']) {
                     $superUsers[] = $user['login'];
                 }
             }
         }
     }
     $view->anonymousHasViewAccess = $this->hasAnonymousUserViewAccess($usersAccessByWebsite);
     $view->idSiteSelected = $idSiteSelected;
     $view->defaultReportSiteName = $defaultReportSiteName;
     $view->users = $users;
     $view->superUserLogins = $superUsers;
     $view->usersAliasByLogin = $usersAliasByLogin;
     $view->usersCount = count($users) - 1;
     $view->usersAccessByWebsite = $usersAccessByWebsite;
     $websites = APISitesManager::getInstance()->getSitesWithAdminAccess();
     uasort($websites, array('Piwik\\Plugins\\UsersManager\\Controller', 'orderByName'));
     $view->websites = $websites;
     $this->setBasicVariablesView($view);
     return $view->render();
 }
示例#14
0
 /**
  * Renders and echo's an admin page that lets users generate custom JavaScript
  * tracking code and custom image tracker links.
  */
 public function trackingCodeGenerator()
 {
     Piwik::checkUserHasSomeViewAccess();
     $view = new View('@CoreAdminHome/trackingCodeGenerator');
     $this->setBasicVariablesView($view);
     $view->topMenu = MenuTop::getInstance()->getMenu();
     $view->userMenu = MenuUser::getInstance()->getMenu();
     $viewableIdSites = APISitesManager::getInstance()->getSitesIdWithAtLeastViewAccess();
     $defaultIdSite = reset($viewableIdSites);
     $view->idSite = Common::getRequestVar('idSite', $defaultIdSite, 'int');
     $view->defaultReportSiteName = Site::getNameFor($view->idSite);
     $view->defaultSiteRevenue = \Piwik\Metrics\Formatter::getCurrencySymbol($view->idSite);
     $view->maxCustomVariables = CustomVariables::getNumUsableCustomVariables();
     $allUrls = APISitesManager::getInstance()->getSiteUrlsFromId($view->idSite);
     if (isset($allUrls[1])) {
         $aliasUrl = $allUrls[1];
     } else {
         $aliasUrl = 'x.domain.com';
     }
     $view->defaultReportSiteAlias = $aliasUrl;
     $mainUrl = Site::getMainUrlFor($view->idSite);
     $view->defaultReportSiteDomain = @parse_url($mainUrl, PHP_URL_HOST);
     // get currencies for each viewable site
     $view->currencySymbols = APISitesManager::getInstance()->getCurrencySymbols();
     $dntChecker = new DoNotTrackHeaderChecker();
     $view->serverSideDoNotTrackEnabled = $dntChecker->isActive();
     return $view->render();
 }
 public function format($value, Formatter $formatter)
 {
     return $formatter->getPrettyTimeFromSeconds($value);
 }
示例#16
0
 protected function getDeleteDataInfo()
 {
     Piwik::checkUserHasSuperUserAccess();
     $deleteDataInfos = array();
     $deleteDataInfos["config"] = PrivacyManager::getPurgeDataSettings();
     $deleteDataInfos["deleteTables"] = "<br/>" . implode(", ", LogDataPurger::getDeleteTableLogTables());
     /** @var Scheduler $scheduler */
     $scheduler = StaticContainer::getContainer()->get('Piwik\\Scheduler\\Scheduler');
     $scheduleTimetable = $scheduler->getScheduledTimeForMethod("PrivacyManager", "deleteLogTables");
     $optionTable = Option::get(self::OPTION_LAST_DELETE_PIWIK_LOGS);
     //If task was already rescheduled, read time from taskTimetable. Else, calculate next possible runtime.
     if (!empty($scheduleTimetable) && $scheduleTimetable - time() > 0) {
         $nextPossibleSchedule = (int) $scheduleTimetable;
     } else {
         $date = Date::factory("today");
         $nextPossibleSchedule = $date->addDay(1)->getTimestamp();
     }
     //deletion schedule did not run before
     if (empty($optionTable)) {
         $deleteDataInfos["lastRun"] = false;
         //next run ASAP (with next schedule run)
         $date = Date::factory("today");
         $deleteDataInfos["nextScheduleTime"] = $nextPossibleSchedule;
     } else {
         $deleteDataInfos["lastRun"] = $optionTable;
         $deleteDataInfos["lastRunPretty"] = Date::factory((int) $optionTable)->getLocalized(Date::DATE_FORMAT_SHORT);
         //Calculate next run based on last run + interval
         $nextScheduleRun = (int) ($deleteDataInfos["lastRun"] + $deleteDataInfos["config"]["delete_logs_schedule_lowest_interval"] * 24 * 60 * 60);
         //is the calculated next run in the past? (e.g. plugin was disabled in the meantime or something) -> run ASAP
         if ($nextScheduleRun - time() <= 0) {
             $deleteDataInfos["nextScheduleTime"] = $nextPossibleSchedule;
         } else {
             $deleteDataInfos["nextScheduleTime"] = $nextScheduleRun;
         }
     }
     $formatter = new Formatter();
     $deleteDataInfos["nextRunPretty"] = $formatter->getPrettyTimeFromSeconds($deleteDataInfos["nextScheduleTime"] - time());
     return $deleteDataInfos;
 }
示例#17
0
文件: Html.php 项目: bossrabbit/piwik
 public function getPrettyMoney($value, $idSite)
 {
     $result = parent::getPrettyMoney($value, $idSite);
     $result = $this->replaceSpaceWithNonBreakingSpace($result);
     return $result;
 }
示例#18
0
文件: API.php 项目: piwik/piwik
 public function getSumVisitsLengthPretty($idSite, $period, $date, $segment = false)
 {
     $formatter = new Formatter();
     $table = $this->getSumVisitsLength($idSite, $period, $date, $segment);
     if (is_object($table)) {
         $table->filter('ColumnCallbackReplace', array('sum_visit_length', array($formatter, 'getPrettyTimeFromSeconds'), array(true)));
     } else {
         $table = $formatter->getPrettyTimeFromSeconds($table, true);
     }
     return $table;
 }
示例#19
0
 private function enrichValues($sites)
 {
     $formatter = new Formatter();
     foreach ($sites as &$site) {
         if (!isset($site['idsite'])) {
             continue;
         }
         if (isset($site['revenue'])) {
             $site['revenue'] = $formatter->getPrettyMoney($site['revenue'], $site['idsite']);
         }
         $site['main_url'] = Site::getMainUrlFor($site['idsite']);
     }
     return $sites;
 }
示例#20
0
 public function format($value, Formatter $formatter)
 {
     return $formatter->getPrettyTimeFromSeconds($value, $timeAsSentence = false);
 }
示例#21
0
 /**
  * Returns the list of currency symbols
  * @see getCurrencyList()
  * @return array( currencyId => currencySymbol )
  */
 public function getCurrencySymbols()
 {
     $currencies = Formatter::getCurrencyList();
     return array_map(function ($a) {
         return $a[0];
     }, $currencies);
 }
示例#22
0
 public function format($value, Formatter $formatter)
 {
     return $formatter->getPrettyPercentFromQuotient($value);
 }
示例#23
0
文件: Visitor.php 项目: JoeHorn/piwik
 /**
  * @param $visitorDetailsArray
  * @param $actionsLimit
  * @param $timezone
  * @return array
  */
 public static function enrichVisitorArrayWithActions($visitorDetailsArray, $actionsLimit, $timezone)
 {
     $idVisit = $visitorDetailsArray['idVisit'];
     $model = new Model();
     $actionDetails = $model->queryActionsForVisit($idVisit, $actionsLimit);
     $formatter = new Formatter();
     $maxCustomVariables = CustomVariables::getNumUsableCustomVariables();
     foreach ($actionDetails as $actionIdx => &$actionDetail) {
         $actionDetail =& $actionDetails[$actionIdx];
         $customVariablesPage = array();
         for ($i = 1; $i <= $maxCustomVariables; $i++) {
             if (!empty($actionDetail['custom_var_k' . $i])) {
                 $cvarKey = $actionDetail['custom_var_k' . $i];
                 $cvarKey = static::getCustomVariablePrettyKey($cvarKey);
                 $customVariablesPage[$i] = array('customVariablePageName' . $i => $cvarKey, 'customVariablePageValue' . $i => $actionDetail['custom_var_v' . $i]);
             }
             unset($actionDetail['custom_var_k' . $i]);
             unset($actionDetail['custom_var_v' . $i]);
         }
         if (!empty($customVariablesPage)) {
             $actionDetail['customVariables'] = $customVariablesPage;
         }
         if ($actionDetail['type'] == Action::TYPE_CONTENT) {
             unset($actionDetails[$actionIdx]);
             continue;
         } elseif ($actionDetail['type'] == Action::TYPE_EVENT) {
             // Handle Event
             if (strlen($actionDetail['pageTitle']) > 0) {
                 $actionDetail['eventName'] = $actionDetail['pageTitle'];
             }
             unset($actionDetail['pageTitle']);
         } else {
             if ($actionDetail['type'] == Action::TYPE_SITE_SEARCH) {
                 // Handle Site Search
                 $actionDetail['siteSearchKeyword'] = $actionDetail['pageTitle'];
                 unset($actionDetail['pageTitle']);
             }
         }
         // Event value / Generation time
         if ($actionDetail['type'] == Action::TYPE_EVENT) {
             if (strlen($actionDetail['custom_float']) > 0) {
                 $actionDetail['eventValue'] = round($actionDetail['custom_float'], self::EVENT_VALUE_PRECISION);
             }
         } elseif ($actionDetail['custom_float'] > 0) {
             $actionDetail['generationTime'] = $formatter->getPrettyTimeFromSeconds($actionDetail['custom_float'] / 1000, true);
         }
         unset($actionDetail['custom_float']);
         if ($actionDetail['type'] != Action::TYPE_EVENT) {
             unset($actionDetail['eventCategory']);
             unset($actionDetail['eventAction']);
         }
         // Reconstruct url from prefix
         $url = Tracker\PageUrl::reconstructNormalizedUrl($actionDetail['url'], $actionDetail['url_prefix']);
         $url = Common::unsanitizeInputValue($url);
         $actionDetail['url'] = $url;
         unset($actionDetail['url_prefix']);
     }
     // If the visitor converted a goal, we shall select all Goals
     $goalDetails = $model->queryGoalConversionsForVisit($idVisit, $actionsLimit);
     $ecommerceDetails = $model->queryEcommerceConversionsForVisit($idVisit, $actionsLimit);
     foreach ($ecommerceDetails as &$ecommerceDetail) {
         if ($ecommerceDetail['type'] == Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_CART) {
             unset($ecommerceDetail['orderId']);
             unset($ecommerceDetail['revenueSubTotal']);
             unset($ecommerceDetail['revenueTax']);
             unset($ecommerceDetail['revenueShipping']);
             unset($ecommerceDetail['revenueDiscount']);
         }
         // 25.00 => 25
         foreach ($ecommerceDetail as $column => $value) {
             if (strpos($column, 'revenue') !== false) {
                 if ($value == round($value)) {
                     $ecommerceDetail[$column] = round($value);
                 }
             }
         }
     }
     // Enrich ecommerce carts/orders with the list of products
     usort($ecommerceDetails, array('static', 'sortByServerTime'));
     foreach ($ecommerceDetails as &$ecommerceConversion) {
         $idOrder = isset($ecommerceConversion['orderId']) ? $ecommerceConversion['orderId'] : GoalManager::ITEM_IDORDER_ABANDONED_CART;
         $itemsDetails = $model->queryEcommerceItemsForOrder($idVisit, $idOrder, $actionsLimit);
         foreach ($itemsDetails as &$detail) {
             if ($detail['price'] == round($detail['price'])) {
                 $detail['price'] = round($detail['price']);
             }
         }
         $ecommerceConversion['itemDetails'] = $itemsDetails;
     }
     // Enrich with time spent per action
     foreach ($actionDetails as $actionIdx => &$actionDetail) {
         // Set the time spent for this action (which is the timeSpentRef of the next action)
         $nextActionFound = isset($actionDetails[$actionIdx + 1]);
         if ($nextActionFound) {
             $actionDetail['timeSpent'] = $actionDetails[$actionIdx + 1]['timeSpentRef'];
         } else {
             // Last action of a visit.
             // By default, Piwik does not know how long the user stayed on the page
             // If enableHeartBeatTimer() is used in piwik.js then we can find the accurate time on page for the last pageview
             $timeOfLastActionOrPingInVisitRow = $visitorDetailsArray['lastActionTimestamp'];
             $timeOfLastAction = Date::factory($actionDetail['serverTimePretty'])->getTimestamp();
             $timeSpentOnPage = $timeOfLastActionOrPingInVisitRow - $timeOfLastAction;
             // Safe net, we assume the time is correct when it's more than 10 seconds
             if ($timeSpentOnPage > 10) {
                 $actionDetail['timeSpent'] = $timeSpentOnPage;
             }
         }
         if (isset($actionDetail['timeSpent'])) {
             $actionDetail['timeSpentPretty'] = $formatter->getPrettyTimeFromSeconds($actionDetail['timeSpent'], true);
         }
         unset($actionDetails[$actionIdx]['timeSpentRef']);
         // not needed after timeSpent is added
     }
     $actions = array_merge($actionDetails, $goalDetails, $ecommerceDetails);
     usort($actions, array('static', 'sortByServerTime'));
     foreach ($actions as &$action) {
         unset($action['idlink_va']);
     }
     $visitorDetailsArray['goalConversions'] = count($goalDetails);
     $visitorDetailsArray['actionDetails'] = $actions;
     foreach ($visitorDetailsArray['actionDetails'] as &$details) {
         switch ($details['type']) {
             case 'goal':
                 $details['icon'] = 'plugins/Morpheus/images/goal.png';
                 break;
             case Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER:
             case Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_CART:
                 $details['icon'] = 'plugins/Morpheus/images/' . $details['type'] . '.gif';
                 break;
             case Action::TYPE_DOWNLOAD:
                 $details['type'] = 'download';
                 $details['icon'] = 'plugins/Morpheus/images/download.png';
                 break;
             case Action::TYPE_OUTLINK:
                 $details['type'] = 'outlink';
                 $details['icon'] = 'plugins/Morpheus/images/link.gif';
                 break;
             case Action::TYPE_SITE_SEARCH:
                 $details['type'] = 'search';
                 $details['icon'] = 'plugins/Morpheus/images/search_ico.png';
                 break;
             case Action::TYPE_EVENT:
                 $details['type'] = 'event';
                 $details['icon'] = 'plugins/Morpheus/images/event.png';
                 break;
             default:
                 $details['type'] = 'action';
                 $details['icon'] = null;
                 break;
         }
         // Convert datetimes to the site timezone
         $dateTimeVisit = Date::factory($details['serverTimePretty'], $timezone);
         $details['serverTimePretty'] = $dateTimeVisit->getLocalized(Date::DATETIME_FORMAT_SHORT);
         $details['timestamp'] = $dateTimeVisit->getTimestamp();
     }
     return $visitorDetailsArray;
 }
 public function format($value, Formatter $formatter)
 {
     return $formatter->getPrettyMoney($value, $this->idSite);
 }
 public static function getCurrencyList()
 {
     return Formatter::getCurrencyList();
 }