From 349f28088cac598b3c9a8e5686fefbd9aaef8cc4 Mon Sep 17 00:00:00 2001 From: Benaka Moorthi <benaka.moorthi@gmail.com> Date: Fri, 12 Jul 2013 21:17:34 -0400 Subject: [PATCH] Refs #4041, fix bug in displaying DBStats reports by redefining how columns_to_display view property defaults and allow unique visitors to be displayed on reports that have it, outside of period=day. --- core/DataTable.php | 17 +++++++++ core/ViewDataTable.php | 61 +++++++++++++++++++++++++++----- core/ViewDataTable/HtmlTable.php | 2 +- 3 files changed, 71 insertions(+), 9 deletions(-) diff --git a/core/DataTable.php b/core/DataTable.php index e9f3cd2c20..370dc8b35d 100644 --- a/core/DataTable.php +++ b/core/DataTable.php @@ -694,6 +694,23 @@ class Piwik_DataTable } return $columnValues; } + + /** + * Returns the list of columns the rows in this datatable contain. This will return the + * columns of the first row with data and assume they occur in every other row as well. + * + * @return array + */ + public function getColumns() + { + foreach ($this->getRows() as $row) { + $columns = $row->getColumns(); + if (!empty($columns)) { + return array_keys($columns); + } + } + return array(); + } /** * Returns an array containing the rows Metadata values diff --git a/core/ViewDataTable.php b/core/ViewDataTable.php index 7700de9dcf..32f6a4c2d2 100644 --- a/core/ViewDataTable.php +++ b/core/ViewDataTable.php @@ -173,17 +173,12 @@ abstract class Piwik_ViewDataTable Piwik_Metrics::getDefaultMetrics(), Piwik_Metrics::getDefaultProcessedMetrics() ); + $this->viewProperties['columns_to_display'] = array(); - $this->viewProperties['columns_to_display'][] = 'label'; - $columns = Piwik_Common::getRequestVar('columns', false); if ($columns !== false) { - $this->viewProperties['columns_to_display'] = array_merge( - $this->viewProperties['columns_to_display'], Piwik::getArrayFromApiParameter($columns)); - } else if (Piwik_Common::getRequestVar('period', false) == 'day') { - $this->viewProperties['columns_to_display'][] = 'nb_uniq_visitors'; - } else { - $this->viewProperties['columns_to_display'][] = 'nb_visits'; + $this->viewProperties['columns_to_display'] = Piwik::getArrayFromApiParameter($columns); + array_unshift($this->viewProperties['columns_to_display'], 'label'); } } @@ -616,6 +611,27 @@ abstract class Piwik_ViewDataTable $this->dataTable->filter($filterName, $filterParameters); } } + + // default columns_to_display to label, nb_uniq_visitors/nb_visits if those columns exist in the + // dataset + if ($this->dataTable instanceof Piwik_DataTable) { + $columns = $this->dataTable->getColumns(); + if (empty($this->viewProperties['columns_to_display']) + && $this->dataTableColumnsContains($columns, array('nb_visits', 'nb_uniq_visitors')) + ) { + $columnsToDisplay = array('label'); + + // if unique visitors data is available, show it, otherwise just visits + if ($this->dataTableColumnsContains($columns, 'nb_uniq_visitors')) { + $columnsToDisplay[] = 'nb_uniq_visitors'; + } else { + $columnsToDisplay[] = 'nb_visits'; + } + + $this->viewProperties['columns_to_display'] = $columnsToDisplay; + } + } + return true; } @@ -1610,4 +1626,33 @@ abstract class Piwik_ViewDataTable && Piwik_Common::getRequestVar('filter_pattern_recursive', false) !== false && Piwik_Common::getRequestVar('flat', false) === false; } + + /** + * Returns true if the first array contains one or more of the specified + * column names or their associated integer INDEX_ value. + * + * @param array $columns Piwik_DataTable_Row columns. + * @param array|string $columnsToCheckFor eg, array('nb_visits', 'nb_uniq_visitors') + * @return bool + */ + private function dataTableColumnsContains($columns, $columnsToCheckFor) + { + if (!is_array($columnsToCheckFor)) { + $columnsToCheckFor = array($columnsToCheckFor); + } + + foreach ($columnsToCheckFor as $columnToCheckFor) { + foreach ($columns as $column) { + // check for the column name and its associated integer INDEX_ value + if ($column == $columnToCheckFor + || (isset(Piwik_Metrics::$mappingFromNameToId[$columnToCheckFor]) + && $column == Piwik_Metrics::$mappingFromNameToId[$columnToCheckFor]) + ) { + return true; + } + } + } + + return false; + } } diff --git a/core/ViewDataTable/HtmlTable.php b/core/ViewDataTable/HtmlTable.php index 2d6505db85..f0a9131b09 100644 --- a/core/ViewDataTable/HtmlTable.php +++ b/core/ViewDataTable/HtmlTable.php @@ -132,7 +132,7 @@ class Piwik_ViewDataTable_HtmlTable extends Piwik_ViewDataTable $nbColumns = count($columns); // case no data in the array we use the number of columns set to be displayed if ($nbColumns == 0) { - $nbColumns = count($this->columnsToDisplay); + $nbColumns = count($this->viewProperties['columns_to_display']); } $view->dataTable = $this->dataTable; -- GitLab