diff options
author | mattpiwik <matthieu.aubry@gmail.com> | 2011-05-31 12:09:01 +0400 |
---|---|---|
committer | mattpiwik <matthieu.aubry@gmail.com> | 2011-05-31 12:09:01 +0400 |
commit | f35885f7cccb73a1a6069ccee1b69e6cfd1c2349 (patch) | |
tree | 3b6b62bf4327e46e8e7b38e498d01616bbb072ca | |
parent | dea3812ebf5bb76d9559029060e6fe8b36e2b236 (diff) |
Refs #898
* Cleaning up All Websites controller code
* Removing display of "Unique visitors" metrics/column
* Adding new column "Revenue" (Ecommerce & Goals) in All websites dashboard
git-svn-id: http://dev.piwik.org/svn/trunk@4846 59fd770c-687e-43c8-a1e3-f5a4ff64c105
-rw-r--r-- | lang/en.php | 3 | ||||
-rw-r--r-- | plugins/MultiSites/Controller.php | 178 | ||||
-rw-r--r-- | plugins/MultiSites/templates/common.js | 36 | ||||
-rw-r--r-- | plugins/MultiSites/templates/index.tpl | 14 | ||||
-rw-r--r-- | plugins/MultiSites/templates/row.tpl | 11 | ||||
-rw-r--r-- | plugins/VisitsSummary/API.php | 3 |
6 files changed, 134 insertions, 111 deletions
diff --git a/lang/en.php b/lang/en.php index b0c0f76634..d044348690 100644 --- a/lang/en.php +++ b/lang/en.php @@ -42,7 +42,8 @@ $translations = array( 'General_PoweredBy' => 'Powered by', 'General_Name' => 'Name', 'General_Value' => 'Value', - 'General_VisitsActions' => '(%s visits, %s actions)', + 'General_Total' => 'Total', + 'General_TotalVisitsActionsRevenue' => '(Total: %s visits, %s actions, %s revenue)', 'General_AverageOrderValue' => 'Average Order Value', 'General_PurchasedProducts' => 'Purchased Products', 'General_EcommerceOrders' => 'Ecommerce Orders', diff --git a/plugins/MultiSites/Controller.php b/plugins/MultiSites/Controller.php index c0b8f0e4e6..5579b640c9 100644 --- a/plugins/MultiSites/Controller.php +++ b/plugins/MultiSites/Controller.php @@ -59,58 +59,53 @@ class Piwik_MultiSites_Controller extends Piwik_Controller $mySites = Piwik_SitesManager_API::getInstance()->getSitesWithAtLeastViewAccess(); $ids = 'all'; - - $visits = Piwik_VisitsSummary_API::getInstance()->getVisits($ids, $period, $date); - $actions = Piwik_VisitsSummary_API::getInstance()->getActions($ids, $period, $date); - $uniqueUsers = Piwik_VisitsSummary_API::getInstance()->getUniqueVisitors($ids, $period, $date); + // Current date - select metrics + $dataTableArray = Piwik_VisitsSummary_API::getInstance()->get($ids, $period, $date, $segment = false, $columns = array('nb_visits', 'nb_actions')); + $currentVisits = $this->getArrayFromAPI($dataTableArray, 'nb_visits'); + $currentActions = $this->getArrayFromAPI($dataTableArray, 'nb_actions'); + $dataTableArray = Piwik_Goals_API::getInstance()->get($ids, $period, $date, $segment = false, $idGoal = false, $columns = array('revenue')); + $currentRevenue = $this->getArrayFromAPI($dataTableArray, 'revenue'); + // Previous date + $lastVisits = $lastActions = $lastRevenue = array(); if($period != 'range') { $lastDate = Piwik_Period_Range::removePeriod($period, Piwik_Date::factory($date), $n = 1 ); - - $lastVisits = Piwik_VisitsSummary_API::getInstance()->getVisits($ids, $period, $lastDate); - $lastActions = Piwik_VisitsSummary_API::getInstance()->getActions($ids, $period, $lastDate); - $lastUniqueUsers = Piwik_VisitsSummary_API::getInstance()->getUniqueVisitors($ids, $period, $lastDate); - $visitsSummary = $this->getSummary($lastVisits, $visits, $mySites, "visits"); - $actionsSummary = $this->getSummary($lastActions, $actions, $mySites, "actions"); - $uniqueSummary = $this->getSummary($lastUniqueUsers, $uniqueUsers, $mySites, "unique"); - $lastVisitsArray = $lastVisits->getArray(); - $lastActionsArray = $lastActions->getArray(); - $lastUniqueUsersArray = $lastUniqueUsers->getArray(); + $dataTableArray = Piwik_VisitsSummary_API::getInstance()->get($ids, $period, $lastDate, $segment = false, $columns = array('nb_visits', 'nb_actions')); + $lastVisits = $this->getArrayFromAPI($dataTableArray, 'nb_visits'); + $lastActions = $this->getArrayFromAPI($dataTableArray, 'nb_actions'); + $dataTableArray = Piwik_Goals_API::getInstance()->get($ids, $period, $lastDate, $segment = false, $idGoal = false, $columns = array('revenue')); + $lastRevenue = $this->getArrayFromAPI($dataTableArray, 'revenue'); } - - $visitsArray = $visits->getArray(); - $actionsArray = $actions->getArray(); - $uniqueUsersArray = $uniqueUsers->getArray(); - $totalVisits = $totalActions = 0; + $visitsSummary = $this->getChangeCurrentVsLast($currentVisits, $lastVisits); + $actionsSummary = $this->getChangeCurrentVsLast($currentActions, $lastActions); + $revenueSummary = $this->getChangeCurrentVsLast($currentRevenue, $lastRevenue); + + $totalVisits = $totalActions = $totalRevenue = 0; + foreach($mySites as &$site) { $idSite = $site['idsite']; - $tmp = $visitsArray[$idSite]->getColumn(0); - $site['visits'] = $tmp[0]; - $totalVisits += $tmp[0]; - $tmp = $actionsArray[$idSite]->getColumn(0); - $site['actions'] = $tmp[0]; - $totalActions += $tmp[0]; - $tmp = $uniqueUsersArray[$idSite]->getColumn(0); - $site['unique'] = $tmp[0]; - + $site['visits'] = $currentVisits[$idSite]; + $site['actions'] = $currentActions[$idSite]; + $site['revenue'] = $currentRevenue[$idSite]; + $totalVisits += $site['visits']; + $totalActions += $site['actions']; + $totalRevenue += $site['revenue']; if($period != 'range') { - $tmp = $lastVisitsArray[$idSite]->getColumn(0); - $site['lastVisits'] = $tmp[0]; - $tmp = $lastActionsArray[$idSite]->getColumn(0); - $site['lastActions'] = $tmp[0]; - $tmp = $lastUniqueUsersArray[$idSite]->getColumn(0); - $site['lastUnique'] = $tmp[0]; + $site['lastVisits'] = $lastVisits[$idSite]; + $site['lastActions'] = $lastActions[$idSite]; + $site['lastRevenue'] = $lastRevenue[$idSite]; } - $site['visitsSummaryValue'] = isset($visitsSummary[$idSite]) ? $visitsSummary[$idSite] : 0; - $site['actionsSummaryValue'] = isset($actionsSummary[$idSite]) ? $actionsSummary[$idSite] : 0; - $site['uniqueSummaryValue'] = isset($uniqueSummary[$idSite]) ? $uniqueSummary[$idSite] : 0; + $site['visitsSummaryValue'] = $visitsSummary[$idSite]; + $site['actionsSummaryValue'] = $actionsSummary[$idSite]; + $site['revenueSummaryValue'] = $revenueSummary[$idSite]; } + $mySites = $this->applyPrettyMoney($mySites); $view = new Piwik_View("MultiSites/templates/index.tpl"); $view->mySites = $mySites; @@ -122,6 +117,7 @@ class Piwik_MultiSites_Controller extends Piwik_Controller $view->orderBy = $this->orderBy; $view->order = $this->order; $view->totalVisits = $totalVisits; + $view->totalRevenue = $totalRevenue; $view->totalActions = $totalActions; $params = $this->getGraphParamsModified(); @@ -143,7 +139,71 @@ class Piwik_MultiSites_Controller extends Piwik_Controller echo $view->render(); } + + protected function applyPrettyMoney($sites) + { + foreach($sites as &$site) + { + $revenue = "-"; + if(!empty($site['revenue'])) + { + $revenue = Piwik::getPrettyMoney($site['revenue'], $site['idsite'], $htmlAllowed = false); + } + $site['revenue'] = '"'. $revenue . '"'; + } + return $sites; + } + + protected function getChangeCurrentVsLast($current, $last) + { + $evolution = array(); + foreach($current as $idSite => $value) + { + $evolution[$idSite] = $this->getEvolutionPercentage($value, isset($last[$idSite]) ? $last[$idSite] : 0); + } + return $evolution; + } + + private function getEvolutionPercentage($current, $last) + { + if($current == 0 && $last == 0) + { + $evolution = 0; + } + elseif($last == 0) + { + $evolution = 100; + } + else + { + $evolution = (($current - $last) / $last) * 100; + } + + $output = round($evolution,2); + + return $output; + } + protected function getArrayFromAPI($dataTableArray, $column) + { + $values = array(); + foreach($dataTableArray->getArray() as $id => $row) + { + $firstRow = $row->getFirstRow(); + $value = 0; + if($firstRow) + { + $value = $firstRow->getColumn($column); + } + if($column == 'revenue') + { + $value = round($value); + } + $values[$id] = $value; + } + return $values; + } + /** * The Multisites reports displays the first calendar date as the earliest day available for all websites. * Also, today is the later "today" available across all timezones. @@ -178,50 +238,18 @@ class Piwik_MultiSites_Controller extends Piwik_Controller $this->setMaxDateView($maxDate, $view); } - private function getSummary($lastVisits, $currentVisits, $mySites, $type) - { - $currentVisitsArray = $currentVisits->getArray(); - $lastVisitsArray = $lastVisits->getArray(); - $summaryArray = array(); - foreach($mySites as $site) - { - $idSite = $site['idsite']; - $tmp = $currentVisitsArray[$idSite]->getColumn(0); - $current = $tmp[0]; - $tmp = $lastVisitsArray[$idSite]->getColumn(0); - $last = $tmp[0]; - $summaryArray[$idSite] = $this->fillSummary($current, $last); - } - return $summaryArray; - } - - private function fillSummary($current, $last) - { - if($current == 0 && $last == 0) - { - $summary = 0; - } - elseif($last == 0) - { - $summary = 100; - } - else - { - $summary = (($current - $last) / $last) * 100; - } - - $output = round($summary,2); - - return $output; - } - public function getEvolutionGraph( $fetch = false, $columns = false) { - $view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, "VisitsSummary.get"); if(empty($columns)) { $columns = Piwik_Common::getRequestVar('columns'); } + $api = "VisitsSummary.get"; + if($columns == 'revenue') + { + $api = "Goals.get"; + } + $view = $this->getLastUnitGraph($this->pluginName, __FUNCTION__, $api); $columns = !is_array($columns) ? array($columns) : $columns; $view->setColumnsToDisplay($columns); return $this->renderView($view, $fetch); diff --git a/plugins/MultiSites/templates/common.js b/plugins/MultiSites/templates/common.js index 48b9cc66ab..16c3607213 100644 --- a/plugins/MultiSites/templates/common.js +++ b/plugins/MultiSites/templates/common.js @@ -5,17 +5,17 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later */ -function setRowData (idsite, visits, actions, unique, name, url, visitsSummaryValue, actionsSummaryValue, uniqueSummaryValue) +function setRowData (idsite, visits, actions, revenue, name, url, visitsSummaryValue, actionsSummaryValue, revenueSummaryValue) { this.idsite = idsite; this.visits = visits; - this.unique = unique; + this.revenue = revenue; this.name = name; this.url = url; this.actions = actions; this.visitsSummaryValue = parseFloat(visitsSummaryValue); this.actionsSummaryValue = parseFloat(actionsSummaryValue); - this.uniqueSummaryValue = parseFloat(uniqueSummaryValue); + this.revenueSummaryValue = parseFloat(revenueSummaryValue); } function setOrderBy(self, allSites, params, mOrderBy) @@ -91,22 +91,23 @@ function orderBy(allSites, params) return (a['actions'] < b['actions']) ? -1 : 1; }); } - else if(params['mOrderBy'] == 'unique') + else if(params['mOrderBy'] == 'revenue') { allSites.sort(function (a,b) { - if (a['unique'] == b['unique']) { + if (a['revenue'].replace(/[^0-9\.]+/g,"") == b['revenue'].replace(/[^0-9\.]+/g,"")) { return 0; } - return (a['unique'] < b['unique']) ? -1 : 1; + return (parseFloat(a['revenue'].replace(/[^0-9\.]+/g,"")) + < parseFloat(b['revenue'].replace(/[^0-9\.]+/g,""))) ? -1 : 1; }); } - else if(params['mOrderBy'] == 'uniqueSummary') + else if(params['mOrderBy'] == 'revenueSummary') { allSites.sort(function (a,b) { - if (a['uniqueSummaryValue'] == b['uniqueSummaryValue']) { + if (a['revenueSummaryValue'] == b['revenueSummaryValue']) { return 0; } - return (a['uniqueSummaryValue'] - b['uniqueSummaryValue'] <= 0.01) ? -1 : 1; + return (a['revenueSummaryValue'] - b['revenueSummaryValue'] <= 0.01) ? -1 : 1; }); } else if(params['mOrderBy'] == 'actionsSummary') @@ -145,7 +146,7 @@ function limitBy(allSites, params) function switchEvolution(params) { $('.actions').hide(); - $('.unique').hide(); + $('.revenue').hide(); $('.visits').hide(); $('.' + params['evolutionBy']).show(); sitesVisible = params['sitesVisible']; @@ -160,7 +161,7 @@ function displayRows(allSites, params) for(var i = 0; i < allSites.length; i++) { var str = params['row']; - str = str.replace(/%uniqueSummary%/g, getImageForSummary(allSites[i].uniqueSummaryValue)); + str = str.replace(/%revenueSummary%/g, getImageForSummary(allSites[i].revenueSummaryValue)); str = str.replace(/%actionsSummary%/g, getImageForSummary(allSites[i].actionsSummaryValue)); str = str.replace(/%visitsSummary%/g, getImageForSummary(allSites[i].visitsSummaryValue)); str = str.replace(/%sparkline%/g, getSparklineImg(allSites[i].idsite, params['evolutionBy'], params)); @@ -168,7 +169,7 @@ function displayRows(allSites, params) str = str.replace(/%idsite%/g, allSites[i].idsite); str = str.replace(/%visits%/g, allSites[i].visits); str = str.replace(/%name%/g, allSites[i].name); - str = str.replace(/%unique%/g, allSites[i].unique); + str = str.replace(/%revenue%/g, allSites[i].revenue); str = str.replace(/%main_url%/g, allSites[i].url); str = str.replace(/%date%/g, params['date']); str = str.replace(/%period%/g, params['period']); @@ -178,7 +179,7 @@ function displayRows(allSites, params) $(".table_row").show(); $('.actions').hide(); - $('.unique').hide(); + $('.revenue').hide(); $('.visits').hide(); $('#main_indicator').hide(); $('.' + params['evolutionBy']).show(); @@ -187,15 +188,12 @@ function displayRows(allSites, params) function getSparklineImg(id, column, params) { - if(column == 'unique') - { - column = 'uniq_visitors'; + if(column != 'revenue') { + column = 'nb_' + column; } - return '<img class="sparkline" alt="" src="?module=MultiSites&action=getEvolutionGraph&period=' + params['period'] + '&date=' + params['dateSparkline'] + '&evolutionBy=' + params['evolutionBy'] + '&columns=nb_' + column + '&idSite=' + id + '&idsite=' + id + '&viewDataTable=sparkline" width="100" height="25" />'; + return '<img class="sparkline" alt="" src="?module=MultiSites&action=getEvolutionGraph&period=' + params['period'] + '&date=' + params['dateSparkline'] + '&evolutionBy=' + params['evolutionBy'] + '&columns=' + column + '&idSite=' + id + '&idsite=' + id + '&viewDataTable=sparkline" width="100" height="25" />'; } - - function showPagination(allSites, params) { if ((params['page'] * params['limit']) < allSites.length) diff --git a/plugins/MultiSites/templates/index.tpl b/plugins/MultiSites/templates/index.tpl index ce4f1caa3d..97bc5a4e39 100644 --- a/plugins/MultiSites/templates/index.tpl +++ b/plugins/MultiSites/templates/index.tpl @@ -8,7 +8,7 @@ var allSites = new Array(); var params = new Array(); {foreach from=$mySites key=i item=site} - allSites[{$i}] = new setRowData({$site.idsite}, {$site.visits}, {$site.actions}, {$site.unique}, '{$site.name|escape:"javascript"}', '{$site.main_url|escape:"javascript"}', '{$site.visitsSummaryValue|replace:",":"."}', '{$site.actionsSummaryValue|replace:",":"."}', '{$site.uniqueSummaryValue|replace:",":"."}'); + allSites[{$i}] = new setRowData({$site.idsite}, {$site.visits}, {$site.actions}, {$site.revenue}, '{$site.name|escape:"javascript"}', '{$site.main_url|escape:"javascript"}', '{$site.visitsSummaryValue|replace:",":"."}', '{$site.actionsSummaryValue|replace:",":"."}', '{$site.revenueSummaryValue|replace:",":"."}'); {/foreach} params['period'] = '{$period}'; params['date'] = '{$dateRequest}'; @@ -34,7 +34,7 @@ <div class="centerLargeDiv"> <h2>{'General_AllWebsitesDashboard'|translate} - <span class='smallTitle'>{'General_VisitsActions'|translate:"<strong>$totalVisits</strong>":"<strong>$totalActions</strong>"}</span> + <span class='smallTitle'>{'General_TotalVisitsActionsRevenue'|translate:"<strong>$totalVisits</strong>":"<strong>$totalActions</strong>":"<strong>$totalRevenue</strong>"}</span> </h2> <table id="mt" class="dataTable" cellspacing="0"> @@ -51,19 +51,17 @@ <span>{'General_ColumnPageviews'|translate}</span> <span class="arrow {if $evolutionBy=='actions'}multisites_{$order}{/if}"></span> </th> - {if $displayUniqueVisitors} - <th id="unique" class="multisites-column" style="width: 120px" onClick="params = setOrderBy(this,allSites, params, 'unique');"> - <span>{'General_ColumnNbUniqVisitors'|translate}</span> - <span class="arrow {if $evolutionBy=='unique'}multisites_{$order}{/if}"></span> + <th id="revenue" class="multisites-column" style="width: 110px" onClick="params = setOrderBy(this,allSites, params, 'revenue');"> + <span>{'Goals_ColumnRevenue'|translate}</span> + <span class="arrow {if $evolutionBy=='revenue'}multisites_{$order}{/if}"></span> </th> - {/if} <th id="evolution" style=" width:350px" colspan="{if $show_sparklines}2{else}1{/if}"> <span class="arrow "></span> <span class="evolution" style="cursor:pointer;" onClick="params = setOrderBy(this,allSites, params, $('#evolution_selector').val() + 'Summary');"> {'MultiSites_Evolution'|translate}</span> <select class="selector" id="evolution_selector" onchange="params['evolutionBy'] = $('#evolution_selector').val(); switchEvolution(params);"> <option value="visits" {if $evolutionBy eq 'visits'} selected {/if}>{'General_ColumnNbVisits'|translate}</option> <option value="actions" {if $evolutionBy eq 'actions'} selected {/if}>{'General_ColumnPageviews'|translate}</option> - {if $displayUniqueVisitors}<option value="unique"{if $evolutionBy eq 'unique'} selected {/if}>{'General_ColumnNbUniqVisitors'|translate}</option> {/if} + <option value="revenue" {if $evolutionBy eq 'revenue'} selected {/if}>{'Goals_ColumnRevenue'|translate}</option> </select> </th> </thead> diff --git a/plugins/MultiSites/templates/row.tpl b/plugins/MultiSites/templates/row.tpl index b2d80d4bff..9689051986 100644 --- a/plugins/MultiSites/templates/row.tpl +++ b/plugins/MultiSites/templates/row.tpl @@ -9,21 +9,16 @@ %visits% </td> <td class="multisites-column"> - %actions% + %actions% </td> -{if $displayUniqueVisitors} <td class="multisites-column"> - %unique% + %revenue% </td> -{/if} {if $period!='range'} <td style="width:170px"> <div class="visits" style="display:none">%visitsSummary%</div> <div class="actions"style="display:none">%actionsSummary%</div> - {if $displayUniqueVisitors} - <div class="unique" >%uniqueSummary%</div> - {/if} - </td> + <div class="revenue"style="display:none">%revenueSummary%</div> {/if} {if $show_sparklines} <td style="width:180px"> diff --git a/plugins/VisitsSummary/API.php b/plugins/VisitsSummary/API.php index 8a3adaf82c..0e686c553e 100644 --- a/plugins/VisitsSummary/API.php +++ b/plugins/VisitsSummary/API.php @@ -19,6 +19,9 @@ class Piwik_VisitsSummary_API { static private $instance = null; + /** + * @return Piwik_VisitsSummary_API + */ static public function getInstance() { if (self::$instance == null) |