diff --git a/core/DataTable.php b/core/DataTable.php index e9f3cd2c201836ac7f2427d5a758ca946f82917f..370dc8b35dca72a1b6116c60ca4269c1be58a731 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 7700de9dcf5b876f1bf6f98d587441408d180fa7..32f6a4c2d26acc5e04fcf7e328893605875d1369 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 2d6505db852686a11d35608c189de1851eaba6ce..f0a9131b0963e04686579965da1c1c16b12176ba 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;