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(); }
/** * @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)); }
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(); }
/** * 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(); }
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')); }
/** * 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 `' '`. * @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; }
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); }
/** * 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(); }
/** * 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); }
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; }
public function getPrettyMoney($value, $idSite) { $result = parent::getPrettyMoney($value, $idSite); $result = $this->replaceSpaceWithNonBreakingSpace($result); return $result; }
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; }
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; }
public function format($value, Formatter $formatter) { return $formatter->getPrettyTimeFromSeconds($value, $timeAsSentence = false); }
/** * 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); }
public function format($value, Formatter $formatter) { return $formatter->getPrettyPercentFromQuotient($value); }
/** * @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(); }