Newer
Older
mattab
a validé
<?php
/**
* Piwik - Open source web analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
* @category Piwik
* @package Piwik
*/
mattab
a validé
namespace Piwik;
mattab
a validé
mattab
a validé
/**
* This class contains metadata regarding core metrics and contains several
* related helper functions.
*
* Of note are the `INDEX_...` constants. In the database, metric column names
* are stored in DataTable rows are stored as integers to save space. The integer
* values used are determined by these constants.
*
* @api
mattab
a validé
*/
mattab
a validé
class Metrics
mattab
a validé
{
mattab
a validé
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
* When saving DataTables in the DB, we replace all columns name with these IDs. This saves many bytes,
* eg. INDEX_NB_UNIQ_VISITORS is an integer: 4 bytes, but 'nb_uniq_visitors' is 16 bytes at least
*/
const INDEX_NB_UNIQ_VISITORS = 1;
const INDEX_NB_VISITS = 2;
const INDEX_NB_ACTIONS = 3;
const INDEX_MAX_ACTIONS = 4;
const INDEX_SUM_VISIT_LENGTH = 5;
const INDEX_BOUNCE_COUNT = 6;
const INDEX_NB_VISITS_CONVERTED = 7;
const INDEX_NB_CONVERSIONS = 8;
const INDEX_REVENUE = 9;
const INDEX_GOALS = 10;
const INDEX_SUM_DAILY_NB_UNIQ_VISITORS = 11;
// Specific to the Actions reports
const INDEX_PAGE_NB_HITS = 12;
const INDEX_PAGE_SUM_TIME_SPENT = 13;
const INDEX_PAGE_EXIT_NB_UNIQ_VISITORS = 14;
const INDEX_PAGE_EXIT_NB_VISITS = 15;
const INDEX_PAGE_EXIT_SUM_DAILY_NB_UNIQ_VISITORS = 16;
const INDEX_PAGE_ENTRY_NB_UNIQ_VISITORS = 17;
const INDEX_PAGE_ENTRY_SUM_DAILY_NB_UNIQ_VISITORS = 18;
const INDEX_PAGE_ENTRY_NB_VISITS = 19;
const INDEX_PAGE_ENTRY_NB_ACTIONS = 20;
const INDEX_PAGE_ENTRY_SUM_VISIT_LENGTH = 21;
const INDEX_PAGE_ENTRY_BOUNCE_COUNT = 22;
// Ecommerce Items reports
const INDEX_ECOMMERCE_ITEM_REVENUE = 23;
const INDEX_ECOMMERCE_ITEM_QUANTITY = 24;
const INDEX_ECOMMERCE_ITEM_PRICE = 25;
const INDEX_ECOMMERCE_ORDERS = 26;
const INDEX_ECOMMERCE_ITEM_PRICE_VIEWED = 27;
// Site Search
const INDEX_SITE_SEARCH_HAS_NO_RESULT = 28;
const INDEX_PAGE_IS_FOLLOWING_SITE_SEARCH_NB_HITS = 29;
// Performance Analytics
const INDEX_PAGE_SUM_TIME_GENERATION = 30;
const INDEX_PAGE_NB_HITS_WITH_TIME_GENERATION = 31;
const INDEX_PAGE_MIN_TIME_GENERATION = 32;
const INDEX_PAGE_MAX_TIME_GENERATION = 33;
// Goal reports
const INDEX_GOAL_NB_CONVERSIONS = 1;
const INDEX_GOAL_REVENUE = 2;
const INDEX_GOAL_NB_VISITS_CONVERTED = 3;
const INDEX_GOAL_ECOMMERCE_REVENUE_SUBTOTAL = 4;
const INDEX_GOAL_ECOMMERCE_REVENUE_TAX = 5;
const INDEX_GOAL_ECOMMERCE_REVENUE_SHIPPING = 6;
const INDEX_GOAL_ECOMMERCE_REVENUE_DISCOUNT = 7;
const INDEX_GOAL_ECOMMERCE_ITEMS = 8;
mattab
a validé
Metrics::INDEX_NB_UNIQ_VISITORS => 'nb_uniq_visitors',
Metrics::INDEX_NB_VISITS => 'nb_visits',
Metrics::INDEX_NB_ACTIONS => 'nb_actions',
Metrics::INDEX_MAX_ACTIONS => 'max_actions',
Metrics::INDEX_SUM_VISIT_LENGTH => 'sum_visit_length',
Metrics::INDEX_BOUNCE_COUNT => 'bounce_count',
Metrics::INDEX_NB_VISITS_CONVERTED => 'nb_visits_converted',
Metrics::INDEX_NB_CONVERSIONS => 'nb_conversions',
Metrics::INDEX_REVENUE => 'revenue',
Metrics::INDEX_GOALS => 'goals',
Metrics::INDEX_SUM_DAILY_NB_UNIQ_VISITORS => 'sum_daily_nb_uniq_visitors',
mattab
a validé
// Actions metrics
mattab
a validé
Metrics::INDEX_PAGE_NB_HITS => 'nb_hits',
Metrics::INDEX_PAGE_SUM_TIME_SPENT => 'sum_time_spent',
Metrics::INDEX_PAGE_SUM_TIME_GENERATION => 'sum_time_generation',
Metrics::INDEX_PAGE_NB_HITS_WITH_TIME_GENERATION => 'nb_hits_with_time_generation',
Metrics::INDEX_PAGE_MIN_TIME_GENERATION => 'min_time_generation',
Metrics::INDEX_PAGE_MAX_TIME_GENERATION => 'max_time_generation',
mattab
a validé
mattab
a validé
Metrics::INDEX_PAGE_EXIT_NB_UNIQ_VISITORS => 'exit_nb_uniq_visitors',
Metrics::INDEX_PAGE_EXIT_NB_VISITS => 'exit_nb_visits',
Metrics::INDEX_PAGE_EXIT_SUM_DAILY_NB_UNIQ_VISITORS => 'sum_daily_exit_nb_uniq_visitors',
mattab
a validé
mattab
a validé
Metrics::INDEX_PAGE_ENTRY_NB_UNIQ_VISITORS => 'entry_nb_uniq_visitors',
Metrics::INDEX_PAGE_ENTRY_SUM_DAILY_NB_UNIQ_VISITORS => 'sum_daily_entry_nb_uniq_visitors',
Metrics::INDEX_PAGE_ENTRY_NB_VISITS => 'entry_nb_visits',
Metrics::INDEX_PAGE_ENTRY_NB_ACTIONS => 'entry_nb_actions',
Metrics::INDEX_PAGE_ENTRY_SUM_VISIT_LENGTH => 'entry_sum_visit_length',
Metrics::INDEX_PAGE_ENTRY_BOUNCE_COUNT => 'entry_bounce_count',
Metrics::INDEX_PAGE_IS_FOLLOWING_SITE_SEARCH_NB_HITS => 'nb_hits_following_search',
mattab
a validé
// Items reports metrics
mattab
a validé
Metrics::INDEX_ECOMMERCE_ITEM_REVENUE => 'revenue',
Metrics::INDEX_ECOMMERCE_ITEM_QUANTITY => 'quantity',
Metrics::INDEX_ECOMMERCE_ITEM_PRICE => 'price',
Metrics::INDEX_ECOMMERCE_ITEM_PRICE_VIEWED => 'price_viewed',
Metrics::INDEX_ECOMMERCE_ORDERS => 'orders',
mattab
a validé
);
mattab
a validé
Metrics::INDEX_GOAL_NB_CONVERSIONS => 'nb_conversions',
Metrics::INDEX_GOAL_NB_VISITS_CONVERTED => 'nb_visits_converted',
Metrics::INDEX_GOAL_REVENUE => 'revenue',
Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_SUBTOTAL => 'revenue_subtotal',
Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_TAX => 'revenue_tax',
Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_SHIPPING => 'revenue_shipping',
Metrics::INDEX_GOAL_ECOMMERCE_REVENUE_DISCOUNT => 'revenue_discount',
Metrics::INDEX_GOAL_ECOMMERCE_ITEMS => 'items',
mattab
a validé
);
mattab
a validé
'nb_uniq_visitors' => Metrics::INDEX_NB_UNIQ_VISITORS,
'nb_visits' => Metrics::INDEX_NB_VISITS,
'nb_actions' => Metrics::INDEX_NB_ACTIONS,
'max_actions' => Metrics::INDEX_MAX_ACTIONS,
'sum_visit_length' => Metrics::INDEX_SUM_VISIT_LENGTH,
'bounce_count' => Metrics::INDEX_BOUNCE_COUNT,
'nb_visits_converted' => Metrics::INDEX_NB_VISITS_CONVERTED,
'nb_conversions' => Metrics::INDEX_NB_CONVERSIONS,
'revenue' => Metrics::INDEX_REVENUE,
'goals' => Metrics::INDEX_GOALS,
'sum_daily_nb_uniq_visitors' => Metrics::INDEX_SUM_DAILY_NB_UNIQ_VISITORS,
mattab
a validé
Metrics::INDEX_NB_UNIQ_VISITORS,
Metrics::INDEX_NB_VISITS,
Metrics::INDEX_NB_ACTIONS,
Metrics::INDEX_MAX_ACTIONS,
Metrics::INDEX_SUM_VISIT_LENGTH,
Metrics::INDEX_BOUNCE_COUNT,
Metrics::INDEX_NB_VISITS_CONVERTED,
mattab
a validé
);
/* Used in DataTable Sort filter */
static public function getVisitsMetricNames()
mattab
a validé
{
$names = array();
foreach (self::$metricsAggregatedFromLogs as $metricId) {
mattab
a validé
$names[$metricId] = self::$mappingFromIdToName[$metricId];
}
return $names;
}
mattab
a validé
{
$idToName = array_flip(self::$mappingFromIdToName);
return $idToName;
}
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
/**
* Is a lower value for a given column better?
* @param $column
* @return bool
*
* @ignore
*/
static public function isLowerValueBetter($column)
{
$lowerIsBetterPatterns = array(
'bounce', 'exit'
);
foreach ($lowerIsBetterPatterns as $pattern) {
if (strpos($column, $pattern) !== false) {
return true;
}
}
return false;
}
/**
* Derive the unit name from a column name
* @param $column
* @param $idSite
* @return string
* @ignore
*/
static public function getUnit($column, $idSite)
{
$nameToUnit = array(
'_rate' => '%',
'revenue' => MetricsFormatter::getCurrencySymbol($idSite),
'_time_' => 's'
);
foreach ($nameToUnit as $pattern => $type) {
if (strpos($column, $pattern) !== false) {
return $type;
}
}
return '';
}
{
$trans = array(
'label' => 'General_ColumnLabel',
'date' => 'General_Date',
'avg_time_on_page' => 'General_ColumnAverageTimeOnPage',
'sum_time_spent' => 'General_ColumnSumVisitLength',
'sum_visit_length' => 'General_ColumnSumVisitLength',
'bounce_count' => 'General_ColumnBounces',
'bounce_count_returning' => 'VisitFrequency_ColumnBounceCountForReturningVisits',
'max_actions' => 'General_ColumnMaxActions',
'max_actions_returning' => 'VisitFrequency_ColumnMaxActionsInReturningVisit',
'nb_visits_converted_returning' => 'VisitFrequency_ColumnNbReturningVisitsConverted',
'sum_visit_length_returning' => 'VisitFrequency_ColumnSumVisitLengthReturning',
'nb_visits_converted' => 'General_ColumnVisitsWithConversions',
'nb_conversions' => 'Goals_ColumnConversions',
'revenue' => 'General_ColumnRevenue',
'nb_hits' => 'General_ColumnPageviews',
'entry_nb_visits' => 'General_ColumnEntrances',
'entry_nb_uniq_visitors' => 'General_ColumnUniqueEntrances',
'exit_nb_visits' => 'General_ColumnExits',
'exit_nb_uniq_visitors' => 'General_ColumnUniqueExits',
'entry_bounce_count' => 'General_ColumnBounces',
'exit_bounce_count' => 'General_ColumnBounces',
'exit_rate' => 'General_ColumnExitRate'
);
$trans = array_map(array('\\Piwik\\Piwik','translate'), $trans);
$dailySum = ' (' . Piwik::translate('General_DailySum') . ')';
$afterEntry = ' ' . Piwik::translate('General_AfterEntry');
$trans['sum_daily_nb_uniq_visitors'] = Piwik::translate('General_ColumnNbUniqVisitors') . $dailySum;
$trans['sum_daily_entry_nb_uniq_visitors'] = Piwik::translate('General_ColumnUniqueEntrances') . $dailySum;
$trans['sum_daily_exit_nb_uniq_visitors'] = Piwik::translate('General_ColumnUniqueExits') . $dailySum;
$trans['entry_nb_actions'] = Piwik::translate('General_ColumnNbActions') . $afterEntry;
$trans['entry_sum_visit_length'] = Piwik::translate('General_ColumnSumVisitLength') . $afterEntry;
$trans = array_merge(self::getDefaultMetrics(), self::getDefaultProcessedMetrics(), $trans);
return $trans;
}
static public function getDefaultMetrics()
{
$translations = array(
'nb_visits' => 'General_ColumnNbVisits',
'nb_uniq_visitors' => 'General_ColumnNbUniqVisitors',
'nb_actions' => 'General_ColumnNbActions',
);
$translations = array_map(array('\\Piwik\\Piwik','translate'), $translations);
static public function getDefaultProcessedMetrics()
{
$translations = array(
// Processed in AddColumnsProcessedMetrics
'nb_actions_per_visit' => 'General_ColumnActionsPerVisit',
'avg_time_on_site' => 'General_ColumnAvgTimeOnSite',
'bounce_rate' => 'General_ColumnBounceRate',
'conversion_rate' => 'General_ColumnConversionRate',
);
return array_map(array('\\Piwik\\Piwik','translate'), $translations);
static public function getReadableColumnName($columnIdRaw)
{
$mappingIdToName = self::$mappingFromIdToName;
if (array_key_exists($columnIdRaw, $mappingIdToName)) {
return $mappingIdToName[$columnIdRaw];
}
return $columnIdRaw;
}
Thomas Steur
a validé
static public function getMetricIdsToProcessReportTotal()
self::INDEX_NB_VISITS,
self::INDEX_NB_UNIQ_VISITORS,
self::INDEX_NB_ACTIONS,
self::INDEX_PAGE_NB_HITS,
self::INDEX_NB_VISITS_CONVERTED,
self::INDEX_NB_CONVERSIONS,
self::INDEX_BOUNCE_COUNT,
self::INDEX_PAGE_ENTRY_BOUNCE_COUNT,
self::INDEX_PAGE_ENTRY_NB_VISITS,
self::INDEX_PAGE_ENTRY_NB_ACTIONS,
self::INDEX_PAGE_EXIT_NB_VISITS,
self::INDEX_PAGE_EXIT_NB_UNIQ_VISITORS
{
$documentation = array(
'nb_visits' => 'General_ColumnNbVisitsDocumentation',
'nb_uniq_visitors' => 'General_ColumnNbUniqVisitorsDocumentation',
'nb_actions' => 'General_ColumnNbActionsDocumentation',
'nb_actions_per_visit' => 'General_ColumnActionsPerVisitDocumentation',
'avg_time_on_site' => 'General_ColumnAvgTimeOnSiteDocumentation',
'bounce_rate' => 'General_ColumnBounceRateDocumentation',
'conversion_rate' => 'General_ColumnConversionRateDocumentation',
'avg_time_on_page' => 'General_ColumnAverageTimeOnPageDocumentation',
'nb_hits' => 'General_ColumnPageviewsDocumentation',
'exit_rate' => 'General_ColumnExitRateDocumentation'
);
return array_map(array('\\Piwik\\Piwik','translate'), $documentation);
public static function getPercentVisitColumn()
{
$percentVisitsLabel = str_replace(' ', ' ', Piwik::translate('General_ColumnPercentageVisits'));
return $percentVisitsLabel;
}