From 474bc28cebef439672567acc9763c391b5379a40 Mon Sep 17 00:00:00 2001 From: BeezyT <timo@ezdesign.de> Date: Tue, 22 Nov 2011 21:40:43 +0000 Subject: [PATCH] refs #2714 column translations for html and rss export, general fine tuning of export column translations git-svn-id: http://dev.piwik.org/svn/trunk@5463 59fd770c-687e-43c8-a1e3-f5a4ff64c105 --- core/API/ResponseBuilder.php | 20 +- core/Controller.php | 2 + core/DataTable/Renderer.php | 122 ++++++++++++ core/DataTable/Renderer/Csv.php | 181 +++++------------- core/DataTable/Renderer/Html.php | 4 + core/DataTable/Renderer/Rss.php | 4 + plugins/API/API.php | 50 +++++ plugins/CoreHome/templates/datatable.js | 5 +- .../templates/js_global_variables.tpl | 1 + plugins/VisitorInterest/VisitorInterest.php | 5 +- tests/integration/Main.test.php | 3 +- ...data__API.getDefaultMetricTranslations.xml | 39 ++++ ...ortMetadata__API.getReportMetadata_day.xml | 1 + ...adata_year__API.getReportMetadata_year.xml | 1 + ...CustomVariables.getCustomVariables_day.csv | Bin 2320 -> 2336 bytes ...CustomVariables.getCustomVariables_day.csv | Bin 3084 -> 3104 bytes 16 files changed, 296 insertions(+), 142 deletions(-) create mode 100644 tests/integration/expected/test_apiGetReportMetadata__API.getDefaultMetricTranslations.xml diff --git a/core/API/ResponseBuilder.php b/core/API/ResponseBuilder.php index 09803e7e93..279089aa7c 100644 --- a/core/API/ResponseBuilder.php +++ b/core/API/ResponseBuilder.php @@ -179,13 +179,16 @@ class Piwik_API_ResponseBuilder return $dataTable; } + $method = Piwik_Common::getRequestVar('method', '', 'string', $this->request); + $renderer = Piwik_DataTable_Renderer::factory($format); $renderer->setTable($dataTable); $renderer->setRenderSubTables(Piwik_Common::getRequestVar('expanded', false, 'int', $this->request)); $renderer->setHideIdSubDatableFromResponse(Piwik_Common::getRequestVar('hideIdSubDatable', false, 'int', $this->request)); + if($format == 'php') { - $renderer->setSerialize( $this->caseRendererPHPSerialize()); + $renderer->setSerialize($this->caseRendererPHPSerialize()); $renderer->setPrettyDisplay(Piwik_Common::getRequestVar('prettyDisplay', false, 'int', $this->request)); } else if($format == 'html') @@ -195,18 +198,21 @@ class Piwik_API_ResponseBuilder else if($format == 'csv' || $format == 'tsv') { $renderer->setIncludeInnerNodes(Piwik_Common::getRequestVar('includeInnerNodes', false, 'int', $this->request)); - $renderer->setConvertToUnicode( Piwik_Common::getRequestVar('convertToUnicode', true, 'int', $this->request) ); - $renderer->setTranslateColumnNames( Piwik_Common::getRequestVar('translateColumnNames', false, 'int', $this->request) ); - $renderer->setIdSite( Piwik_Common::getRequestVar('idSite', false, 'int', $this->request) ); - - $method = Piwik_Common::getRequestVar('method', '', 'string', $this->request); - $renderer->setApiMethod($method); + $renderer->setConvertToUnicode(Piwik_Common::getRequestVar('convertToUnicode', true, 'int', $this->request)); if (substr($method, 0, 8) == 'Actions.') { $renderer->setRecursiveLabelSeparator('/'); } } + // prepare translation of column names + if ($format == 'html' || $format == 'csv' || $format == 'tsv' || $format = 'rss') + { + $renderer->setApiMethod($method); + $renderer->setIdSite(Piwik_Common::getRequestVar('idSite', false, 'int', $this->request)); + $renderer->setTranslateColumnNames(Piwik_Common::getRequestVar('translateColumnNames', false, 'int', $this->request)); + } + return $renderer->render(); } diff --git a/core/Controller.php b/core/Controller.php index e12a19772c..9b16b5dded 100644 --- a/core/Controller.php +++ b/core/Controller.php @@ -445,6 +445,8 @@ abstract class Piwik_Controller $view->startDate = $dateStart; $view->endDate = $dateEnd; + $view->language = Piwik_LanguagesManager::getLanguageForSession(); + $this->setBasicVariablesView($view); } catch(Exception $e) { Piwik_ExitWithMessage($e->getMessage()); diff --git a/core/DataTable/Renderer.php b/core/DataTable/Renderer.php index 3f1f1758aa..1f8bf40ce8 100644 --- a/core/DataTable/Renderer.php +++ b/core/DataTable/Renderer.php @@ -28,6 +28,36 @@ abstract class Piwik_DataTable_Renderer protected $renderSubTables = false; protected $hideIdSubDatatable = false; + /** + * Whether to translate column names (i.e. metric names) or not + * @var bool + */ + public $translateColumnNames = false; + + /** + * Column translations + * @var array + */ + private $columnTranslations = false; + + /** + * The API method that has returned the data that should be rendered + * @var string + */ + public $apiMethod = false; + + /** + * API metadata for the current report + * @var array + */ + private $apiMetaData = null; + + /** + * The current idSite + * @var int + */ + public $idSite = 'all'; + public function __construct() { } @@ -168,4 +198,96 @@ abstract class Piwik_DataTable_Renderer } return $value; } + + /** + * Translate column names to the current language. + * Used in subclasses. + */ + protected function translateColumnNames($names) + { + if (!$this->apiMethod) + { + return $names; + } + + // load the translations only once + // when multiple dates are requested (date=...,...&period=day), the meta data would + // be loaded lots of times otherwise + if ($this->columnTranslations === false) + { + $meta = $this->getApiMetaData(); + if ($meta === false) + { + return $names; + } + + $t = Piwik_API_API::getDefaultMetricTranslations(); + foreach (array('metrics', 'processedMetrics', 'metricsGoal', 'processedMetricsGoal') as $index) + { + if (isset($meta[$index]) && is_array($meta[$index])) + { + $t = array_merge($t, $meta[$index]); + } + } + + $this->columnTranslations = &$t; + } + + foreach ($names as &$name) + { + if (isset($this->columnTranslations[$name])) + { + $name = $this->columnTranslations[$name]; + } + } + + return $names; + } + + protected function getApiMetaData() + { + if ($this->apiMetaData === null) + { + list($apiModule, $apiAction) = explode('.', $this->apiMethod); + + if(!$apiModule || !$apiAction) + { + $this->apiMetaData = false; + } + + $api = Piwik_API_API::getInstance(); + $meta = $api->getMetadata($this->idSite, $apiModule, $apiAction); + if (is_array($meta[0])) + { + $meta = $meta[0]; + } + + $this->apiMetaData = &$meta; + } + + return $this->apiMetaData; + } + + protected function translateColumnName($column) + { + $columns = array($column); + $columns = $this->translateColumnNames($columns); + return $columns[0]; + } + + public function setTranslateColumnNames($bool) + { + $this->translateColumnNames = $bool; + } + + public function setApiMethod($method) + { + $this->apiMethod = $method; + } + + public function setIdSite($idSite) + { + $this->idSite = $idSite; + } + } diff --git a/core/DataTable/Renderer/Csv.php b/core/DataTable/Renderer/Csv.php index 3ec62c78d0..2313e388aa 100644 --- a/core/DataTable/Renderer/Csv.php +++ b/core/DataTable/Renderer/Csv.php @@ -60,20 +60,6 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer */ public $includeInnerNodes = false; - /** - * Whether to translate column names (i.e. metric names) or not - * - * @var bool - */ - public $translateColumnNames = false; - - /** - * Column translations - * - * @var array - */ - private $columnTranslations = false; - /** * Separator for building recursive labels (or paths) * @@ -81,20 +67,6 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer */ public $recursiveLabelSeparator = ' - '; - /** - * The API method that has returned the data that should be rendered - * - * @var string - */ - public $apiMethod = false; - - /** - * The current idSite - * - * @var int - */ - public $idSite = 'all'; - /** * idSubtable will be exported in a column called 'idsubdatatable' * @@ -110,7 +82,7 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer return 'No data available'; } - self::renderHeader(); + self::renderHeader($this); if($this->convertToUnicode && function_exists('mb_convert_encoding')) @@ -136,11 +108,6 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer $this->includeInnerNodes = $bool; } - public function setTranslateColumnNames($bool) - { - $this->translateColumnNames = $bool; - } - public function setSeparator($separator) { $this->separator = $separator; @@ -151,22 +118,17 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer $this->recursiveLabelSeparator = $separator; } - public function setApiMethod($method) - { - $this->apiMethod = $method; - } - - public function setIdSite($idSite) - { - $this->idSite = $idSite; - } - protected function renderTable($table) { if($table instanceof Piwik_DataTable_Array) { $str = $header = ''; - $prefixColumns = $table->getKeyName() . $this->separator; + $keyName = $table->getKeyName(); + if ($this->translateColumnNames) + { + $keyName = $this->translateColumnName($keyName); + } + $prefixColumns = $keyName . $this->separator; foreach($table->getArray() as $currentLinePrefix => $dataTable) { $returned = explode("\n",$this->renderTable($dataTable)); @@ -233,8 +195,18 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer { foreach($subValues as $subKey => $subValue) { - // goals_idgoal=1 - $columnName = $name . "_" . $key . "_" . $subKey; + if ($this->translateColumnNames) + { + $subName = $name != 'goals' ? $name . ' ' . $key + : Piwik_Translate('Goals_GoalX', $key); + $columnName = $this->translateColumnName($subKey) + .' ('. $subName . ')'; + } + else + { + // goals_idgoal=1 + $columnName = $name . "_" . $key . "_" . $subKey; + } $allColumns[$columnName] = true; $csvRow[$columnName] = $subValue; } @@ -370,89 +342,6 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer $str = substr($str, 0, -strlen($this->lineEnd)); return $str; } - - protected function translateColumnNames($names) - { - if (!$this->apiMethod) - { - return $names; - } - - // load the translations only once - // when multiple dates are requested (date=...,...&period=day), the meta data would - // be loaded lots of times otherwise - if ($this->columnTranslations === false) - { - list($apiModule, $apiAction) = explode('.', $this->apiMethod); - - if(!$apiModule || !$apiAction) - { - return $names; - } - - $api = Piwik_API_API::getInstance(); - $meta = $api->getMetadata($this->idSite, $apiModule, $apiAction); - if (is_array($meta[0])) - { - $meta = $meta[0]; - } - - $t = array_merge($api->getDefaultMetrics(), $api->getDefaultProcessedMetrics(), array( - 'label' => 'General_ColumnLabel', - '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' => 'Goals_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' - )); - - $t = array_map('Piwik_Translate', $t); - - $dailySum = ' ('.Piwik_Translate('General_DailySum').')'; - $afterEntry = ' '.Piwik_Translate('General_AfterEntry'); - - $t['sum_daily_nb_uniq_visitors'] = Piwik_Translate('General_ColumnNbUniqVisitors').$dailySum; - $t['sum_daily_entry_nb_uniq_visitors'] = Piwik_Translate('General_ColumnUniqueEntrances').$dailySum; - $t['sum_daily_exit_nb_uniq_visitors'] = Piwik_Translate('General_ColumnUniqueExits').$dailySum; - $t['entry_nb_actions'] = Piwik_Translate('General_ColumnNbActions').$afterEntry; - $t['entry_sum_visit_length'] = Piwik_Translate('General_ColumnSumVisitLength').$afterEntry; - - foreach (array('metrics', 'processedMetrics', 'metricsGoal', 'processedMetricsGoal') as $index) - { - if (isset($meta[$index]) && is_array($meta[$index])) - { - $t = array_merge($t, $meta[$index]); - } - } - - $this->columnTranslations = &$t; - } - - foreach ($names as &$name) - { - if (isset($this->columnTranslations[$name])) - { - $name = $this->columnTranslations[$name]; - } - } - - return $names; - } protected function formatValue($value) { @@ -484,11 +373,39 @@ class Piwik_DataTable_Renderer_Csv extends Piwik_DataTable_Renderer return $value; } - protected static function renderHeader() + protected static function renderHeader($instance) { + $fileName = 'Piwik '.Piwik_Translate('General_Export'); + + $period = Piwik_Common::getRequestVar('period', false); + $date = Piwik_Common::getRequestVar('date', false); + if ($period || $date) // in test cases, there are no request params set + { + if ($period == 'range') + { + $period = new Piwik_Period_Range($period, $date); + } + else if (strpos($date, ',') !== false) + { + $period = new Piwik_Period_Range('range', $date); + } + else + { + $period = Piwik_Period::factory($period, Piwik_Date::factory($date)); + } + + $prettyDate = $period->getLocalizedLongString(); + + $meta = $instance->getApiMetaData(); + + $fileName .= ' _ '.$meta['name'] + .' _ '.$prettyDate.'.csv'; + } + // silent fail otherwise unit tests fail @header('Content-Type: application/vnd.ms-excel'); - @header('Content-Disposition: attachment; filename=piwik-report-export.csv'); + @header('Content-Disposition: attachment; filename='.$fileName); Piwik::overrideCacheControlHeaders(); } + } diff --git a/core/DataTable/Renderer/Html.php b/core/DataTable/Renderer/Html.php index e2676c7046..cd5f22cc88 100644 --- a/core/DataTable/Renderer/Html.php +++ b/core/DataTable/Renderer/Html.php @@ -139,6 +139,10 @@ class Piwik_DataTable_Renderer_Html extends Piwik_DataTable_Renderer { $name = 'value'; } + if($this->translateColumnNames) + { + $name = $this->translateColumnName($name); + } $html .= "\t\t<th>$name</th>\n"; } } diff --git a/core/DataTable/Renderer/Rss.php b/core/DataTable/Renderer/Rss.php index 18622260e1..accd5e5376 100644 --- a/core/DataTable/Renderer/Rss.php +++ b/core/DataTable/Renderer/Rss.php @@ -143,6 +143,10 @@ class Piwik_DataTable_Renderer_Rss extends Piwik_DataTable_Renderer { if($toDisplay !== false) { + if($this->translateColumnNames) + { + $name = $this->translateColumnName($name); + } $html .= "\n\t<td><b>$name</b></td>"; } } diff --git a/plugins/API/API.php b/plugins/API/API.php index dffb9d2315..6360be06ee 100644 --- a/plugins/API/API.php +++ b/plugins/API/API.php @@ -90,6 +90,56 @@ class Piwik_API_API } return self::$instance; } + + /** + * Default translations for many core metrics. + * This is used for exports with translated labels. The exports contain columns that + * are not visible in the UI and not present in the API meta data. These columns are + * translated here. + */ + static public function getDefaultMetricTranslations() + { + $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' => 'Goals_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('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; + + $api = self::getInstance(); + $trans = array_merge($api->getDefaultMetrics(), $api->getDefaultProcessedMetrics(), $trans); + + return $trans; + } public function getDefaultMetrics() { diff --git a/plugins/CoreHome/templates/datatable.js b/plugins/CoreHome/templates/datatable.js index 9757fcf0d2..a5dae88a59 100644 --- a/plugins/CoreHome/templates/datatable.js +++ b/plugins/CoreHome/templates/datatable.js @@ -567,7 +567,10 @@ dataTable.prototype = +'&token_auth='+piwik.token_auth +'&expanded=1'; if (format == 'CSV' || format == 'TSV') { - str += '&translateColumnNames=1'; + str += '&includeInnerNodes=1'; + } + if (format == 'CSV' || format == 'TSV' || format == 'RSS') { + str += '&translateColumnNames=1&language='+piwik.language; } if(typeof segment != 'undefined') { str += '&segment='+segment; diff --git a/plugins/CoreHome/templates/js_global_variables.tpl b/plugins/CoreHome/templates/js_global_variables.tpl index 7e60ad234e..ec58ad1b79 100644 --- a/plugins/CoreHome/templates/js_global_variables.tpl +++ b/plugins/CoreHome/templates/js_global_variables.tpl @@ -20,4 +20,5 @@ {if isset($maxDateYear)}piwik.maxDateYear = {$maxDateYear};{/if} {if isset($maxDateMonth)}piwik.maxDateMonth = parseInt("{$maxDateMonth}", 10);{/if} {if isset($maxDateDay)}piwik.maxDateDay = parseInt("{$maxDateDay}", 10);{/if} + {if isset($language)}piwik.language = "{$language}";{/if} </script> diff --git a/plugins/VisitorInterest/VisitorInterest.php b/plugins/VisitorInterest/VisitorInterest.php index 5875679560..d06d586c8d 100644 --- a/plugins/VisitorInterest/VisitorInterest.php +++ b/plugins/VisitorInterest/VisitorInterest.php @@ -76,7 +76,10 @@ class Piwik_VisitorInterest extends Piwik_Plugin 'module' => 'VisitorInterest', 'action' => 'getNumberOfVisitsByVisitCount', 'dimension' => Piwik_Translate('VisitorInterest_visitsByVisitCount'), - 'metrics' => array( 'nb_visits' ), + 'metrics' => array( + 'nb_visits', + 'nb_visits_percentage' => Piwik_Translate('General_ColumnPercentageVisits') + ), 'processedMetrics' => false, 'constantRowsCount' => true, 'documentation' => Piwik_Translate('VisitorInterest_WidgetVisitsByNumDocumentation') diff --git a/tests/integration/Main.test.php b/tests/integration/Main.test.php index 3e7ddba98d..20fb76011f 100644 --- a/tests/integration/Main.test.php +++ b/tests/integration/Main.test.php @@ -1112,8 +1112,9 @@ class Test_Piwik_Integration_Main extends Test_Integration // changing the language within one request is a bit fancy // in order to keep the core clean, we need a little hack here - Piwik_Translate::reset(); $_GET['language'] = 'de'; + Piwik_Translate::reset(); + Piwik_Translate::getInstance()->reloadLanguage('de'); $this->callGetApiCompareOutput(__FUNCTION__.'_xp1_inner1_trans-de', 'csv', $idSite, $dateTime, $periods = false, $setDateLastN = false, $language = false, diff --git a/tests/integration/expected/test_apiGetReportMetadata__API.getDefaultMetricTranslations.xml b/tests/integration/expected/test_apiGetReportMetadata__API.getDefaultMetricTranslations.xml new file mode 100644 index 0000000000..cadf49662a --- /dev/null +++ b/tests/integration/expected/test_apiGetReportMetadata__API.getDefaultMetricTranslations.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <nb_visits>Visits</nb_visits> + <nb_uniq_visitors>Unique visitors</nb_uniq_visitors> + <nb_actions>Actions</nb_actions> + <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit> + <avg_time_on_site>Avg. Time on Website</avg_time_on_site> + <bounce_rate>Bounce Rate</bounce_rate> + <conversion_rate>Conversion Rate</conversion_rate> + <label>Label</label> + <date>Date</date> + <avg_time_on_page>Avg. time on page</avg_time_on_page> + <sum_time_spent>Total time spent by visitors (in seconds)</sum_time_spent> + <sum_visit_length>Total time spent by visitors (in seconds)</sum_visit_length> + <bounce_count>Bounces</bounce_count> + <bounce_count_returning>Bounce Count for Returning Visits</bounce_count_returning> + <max_actions>Maximum actions in one visit</max_actions> + <max_actions_returning>Maximum actions in one returning visit</max_actions_returning> + <nb_visits_converted_returning>Number of converted returning visits</nb_visits_converted_returning> + <sum_visit_length_returning>Total time spent by returning visitors (in seconds)</sum_visit_length_returning> + <nb_visits_converted>Visits with Conversions</nb_visits_converted> + <nb_conversions>Conversions</nb_conversions> + <revenue>Revenue</revenue> + <nb_hits>Pageviews</nb_hits> + <entry_nb_visits>Entrances</entry_nb_visits> + <entry_nb_uniq_visitors>Unique entrances</entry_nb_uniq_visitors> + <exit_nb_visits>Exits</exit_nb_visits> + <exit_nb_uniq_visitors>Unique exits</exit_nb_uniq_visitors> + <entry_bounce_count>Bounces</entry_bounce_count> + <exit_bounce_count>Bounces</exit_bounce_count> + <exit_rate>Exit rate</exit_rate> + <sum_daily_nb_uniq_visitors>Unique visitors (daily sum)</sum_daily_nb_uniq_visitors> + <sum_daily_entry_nb_uniq_visitors>Unique entrances (daily sum)</sum_daily_entry_nb_uniq_visitors> + <sum_daily_exit_nb_uniq_visitors>Unique exits (daily sum)</sum_daily_exit_nb_uniq_visitors> + <entry_nb_actions>Actions after entereing here</entry_nb_actions> + <entry_sum_visit_length>Total time spent by visitors (in seconds) after entereing here</entry_sum_visit_length> + </row> +</result> \ No newline at end of file diff --git a/tests/integration/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml b/tests/integration/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml index 99af9c8995..ba722fd1c9 100644 --- a/tests/integration/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml +++ b/tests/integration/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml @@ -1134,6 +1134,7 @@ <dimension>Visits by visit number</dimension> <metrics> <nb_visits>Visits</nb_visits> + <nb_visits_percentage>% Visits</nb_visits_percentage> </metrics> <constantRowsCount>1</constantRowsCount> diff --git a/tests/integration/expected/test_apiGetReportMetadata_year__API.getReportMetadata_year.xml b/tests/integration/expected/test_apiGetReportMetadata_year__API.getReportMetadata_year.xml index f0640715a3..16a458d03d 100644 --- a/tests/integration/expected/test_apiGetReportMetadata_year__API.getReportMetadata_year.xml +++ b/tests/integration/expected/test_apiGetReportMetadata_year__API.getReportMetadata_year.xml @@ -782,6 +782,7 @@ <dimension>Visits by visit number</dimension> <metrics> <nb_visits>Visits</nb_visits> + <nb_visits_percentage>% Visits</nb_visits_percentage> </metrics> <constantRowsCount>1</constantRowsCount> diff --git a/tests/integration/expected/test_csvExport_xp1_inner0_trans-en__CustomVariables.getCustomVariables_day.csv b/tests/integration/expected/test_csvExport_xp1_inner0_trans-en__CustomVariables.getCustomVariables_day.csv index 7a19c4a33e44aaa8463962566847bd88a8e041b4..6c1e4521dc0f13f89603dde1b90ca2f904fcf221 100644 GIT binary patch delta 321 zcmbOrv_NRWD@NzZ{EVX33Je+y?hN@1i3~Xm3JjSHDGcdQo-KnRgC>IxLl{FQLoq`p zLkUAMg91Z2n3chxzyQ`COjv&qLn=cVLn=caLn%Wl17Y=GbMd;%h(dQk^b_wch<cE_ L#5X4~tz!cK-#$18 delta 367 zcmZ1=G(l*>tNL_?e1=4Z9EM_sc!o@d6b2aImcfuAo*|DRi6NdLnIWGckD-hqm7$2C zm?0C)D`wDvtHr0cj3E=Orvz*RvPmTjsSGLg1dS<TNCjJ+$56_UidVG}84iwz_}-QQ Xp_zb-2|5AA!IS4RN^UM-+Q0??6?RM( diff --git a/tests/integration/expected/test_csvExport_xp1_inner1_trans-de__CustomVariables.getCustomVariables_day.csv b/tests/integration/expected/test_csvExport_xp1_inner1_trans-de__CustomVariables.getCustomVariables_day.csv index e9bf1d8d3267c5e24f017cb63474f97d253898de..210c660c425da7b57de3cc96635190c339871cd1 100644 GIT binary patch delta 342 zcmeB?SRk=MgmH2SlSI7&g9bwsLncEiLk@!iLncECLpnn~Ln1>CgDrz0gC>IxgA+q4 zLoq`sLo!1KLn?y;LoP!mLkWWdgEvDyLmopJLn=cNLoq`pn3u|s$3WP`P=;KFVunP9 i5{4=TLdqu>GD+igq!HB}2{DmqM;b9`ZZ2e+%?SYOW<AXS delta 349 zcmZ1=(Ic@zgi$q}A)g_UA%~%uA)X<VA%y|Pw`DM7h-b)SNMeX*NS>_7BwSz2paYl1 zr@D+GlcAU)lc5A`W->!QLmopJLn=cNLkUAFLkdAtiWpMC>hl;%8B!6d<-o?FI?;$E bCn8i+;zW=s=uY&8cyh8dqu}NRObwg>Ef_{x -- GitLab