diff options
author | Thomas Steur <tsteur@users.noreply.github.com> | 2013-10-14 08:33:20 +0400 |
---|---|---|
committer | Thomas Steur <tsteur@users.noreply.github.com> | 2013-10-14 08:33:20 +0400 |
commit | 8e5534dcadd9f59a83dd683731b8d7d319fd8903 (patch) | |
tree | fc20ea50a54adfdb8ee87f312475d0d3ec90d46c | |
parent | 45933aad796c3cfcbab8c6fe4bd6d04d2dc3c3bd (diff) | |
parent | f4298e1b13c266554f1fdf32f24f629ffcbc0360 (diff) |
Merge pull request #126 from piwik/viewdata_cleanup
Viewdata cleanup
-rw-r--r-- | core/ViewDataTable.php | 15 | ||||
-rw-r--r-- | core/Visualization/Config.php | 15 | ||||
-rw-r--r-- | plugins/CoreVisualizations/Visualizations/HtmlTable.php | 254 | ||||
-rw-r--r-- | plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php | 43 | ||||
-rw-r--r-- | plugins/CoreVisualizations/Visualizations/HtmlTable/Goals.php | 223 | ||||
m--------- | plugins/TreemapVisualization | 0 | ||||
m--------- | tests/PHPUnit/UI | 0 |
7 files changed, 268 insertions, 282 deletions
diff --git a/core/ViewDataTable.php b/core/ViewDataTable.php index d749b7aa92..523b1214f2 100644 --- a/core/ViewDataTable.php +++ b/core/ViewDataTable.php @@ -416,7 +416,6 @@ class ViewDataTable if ($name == 'translations' || $name == 'filters' - || $name == 'after_data_loaded_functions' ) { $this->vizConfig->$name = array_merge($this->vizConfig->$name, $value); } else if ($name == 'related_reports') { // TODO: should process after (in overrideViewProperties) @@ -828,8 +827,8 @@ class ViewDataTable */ private function getClientSidePropertiesToSet() { - // TODO $result = array(); + foreach ($this->getClientSideConfigProperties() as $name) { if (property_exists($this->vizRequest, $name)) { $result[$name] = $this->convertForJson($this->vizRequest->$name); @@ -839,6 +838,7 @@ class ViewDataTable $result[$name] = $this->convertForJson($this->vizConfig->visualization_properties->$name); } } + return $result; } @@ -1087,7 +1087,6 @@ class ViewDataTable $this->loadDataTableFromAPI(); $this->postDataTableLoadedFromAPI($visualization); - $this->executeAfterDataLoadedCallbacks(); $visualization->afterAllFilteresAreApplied($this->dataTable, $this->vizConfig, $this->vizRequest); @@ -1134,16 +1133,6 @@ class ViewDataTable return $view; } - private function executeAfterDataLoadedCallbacks() - { - if (!empty($this->after_data_loaded_functions)) { -// TODO it is not defined and we can remove it anyway - foreach ($this->after_data_loaded_functions as $callback) { - $callback($this->dataTable, $this); - } - } - } - private function getDefaultFooterIconsToShow() { $result = array(); diff --git a/core/Visualization/Config.php b/core/Visualization/Config.php index 13322153c5..6e64991442 100644 --- a/core/Visualization/Config.php +++ b/core/Visualization/Config.php @@ -423,20 +423,6 @@ class Config public $filters = array(); /** - * Array of callbacks that are called after the data for a ViewDataTable is successfully - * loaded. Each callback is invoked with the DataTable instance obtained from the API - * and the ViewDatable instance that loaded it. - * - * Functions can be appended to this array property when it's necessary to configure - * a ViewDataTable after data has been loaded. If you need to use properties that are - * only set after data is loaded (like 'columns_to_display'), you'll have to use this - * property. - * - * Default value: array() - */ - public $after_data_loaded_functions = array(); - - /** * Contains the controller action to call when requesting subtables of the current report. * * Default value: The controller action used to request the report. @@ -506,7 +492,6 @@ class Config 'show_offset_information' => $this->show_offset_information, 'show_pagination_control' => $this->show_pagination_control, 'subtable_controller_action' => $this->subtable_controller_action, - 'after_data_loaded_functions' => $this->after_data_loaded_functions, 'filters' => $this->filters, 'show_export_as_image_icon' => $this->show_export_as_image_icon, 'y_axis_unit' => $this->y_axis_unit, diff --git a/plugins/CoreVisualizations/Visualizations/HtmlTable.php b/plugins/CoreVisualizations/Visualizations/HtmlTable.php index d67298d2a4..84085cf7ff 100644 --- a/plugins/CoreVisualizations/Visualizations/HtmlTable.php +++ b/plugins/CoreVisualizations/Visualizations/HtmlTable.php @@ -12,7 +12,6 @@ namespace Piwik\Plugins\CoreVisualizations\Visualizations; use Piwik\Common; use Piwik\Config; -use Piwik\DataTable\DataTableInterface; use Piwik\DataTable\Filter\AddColumnsProcessedMetricsGoal; use Piwik\MetricsFormatter; use Piwik\Piwik; @@ -21,7 +20,6 @@ use Piwik\Site; use Piwik\View; use Piwik\ViewDataTable\Visualization; use Piwik\Visualization\Config as VizConfig; -use Piwik\Visualization\Request; require_once PIWIK_INCLUDE_PATH . '/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php'; require_once PIWIK_INCLUDE_PATH . '/plugins/CoreVisualizations/Visualizations/HtmlTable/Goals.php'; @@ -158,36 +156,6 @@ class HtmlTable extends Visualization ) { $properties->show_visualization_only = true; } - - if ($properties->visualization_properties->show_extra_columns) { - $properties->show_exclude_low_population = true; - $properties->datatable_css_class = 'dataTableVizAllColumns'; - } - - if ($properties->visualization_properties->show_goals_columns) { - $properties->datatable_css_class = 'dataTableVizGoals'; - $properties->show_exclude_low_population = true; - $properties->show_goals = true; - - $properties->translations += array( - 'nb_conversions' => Piwik::translate('Goals_ColumnConversions'), - 'conversion_rate' => Piwik::translate('General_ColumnConversionRate'), - 'revenue' => Piwik::translate('General_ColumnRevenue'), - 'revenue_per_visit' => Piwik::translate('General_ColumnValuePerVisit'), - ); - $properties->metrics_documentation['nb_visits'] = Piwik::translate('Goals_ColumnVisits'); - - if (Common::getRequestVar('documentationForGoalsPage', 0, 'int') == 1) { // TODO: should not use query parameter - $properties->documentation = Piwik::translate('Goals_ConversionByTypeReportDocumentation', - array('<br />', '<br />', '<a href="http://piwik.org/docs/tracking-goals-web-analytics/" target="_blank">', '</a>')); - } - - if (!$properties->visualization_properties->disable_subtable_when_show_goals) { - $properties->subtable_controller_action = null; - } - - $this->setShowGoalsColumnsProperties(); - } } public static function getDefaultPropertyValues() @@ -219,226 +187,4 @@ class HtmlTable extends Visualization return $defaults; } - public function beforeGenericFiltersAreAppliedToLoadedDataTable(DataTableInterface $dataTable, VizConfig $properties, Request $request) - { - if ($properties->visualization_properties->show_extra_columns) { - $dataTable->filter('AddColumnsProcessedMetrics'); - - $dataTable->filter(function ($dataTable) use ($properties) { - $columnsToDisplay = array('label', 'nb_visits'); - - if (in_array('nb_uniq_visitors', $dataTable->getColumns())) { - $columnsToDisplay[] = 'nb_uniq_visitors'; - } - - $columnsToDisplay = array_merge( - $columnsToDisplay, array('nb_actions', 'nb_actions_per_visit', 'avg_time_on_site', 'bounce_rate') - ); - - // only display conversion rate for the plugins that do not provide "per goal" metrics - // otherwise, conversion rate is meaningless as a whole (since we don't process 'cross goals' conversions) - if (!$properties->show_goals) { - $columnsToDisplay[] = 'conversion_rate'; - } - - $properties->columns_to_display = $columnsToDisplay; - }); - - $prettifyTime = array('\Piwik\MetricsFormatter', 'getPrettyTimeFromSeconds'); - - $dataTable->filter('ColumnCallbackReplace', array('avg_time_on_site', $prettifyTime)); - } - } - - private function setShowGoalsColumnsProperties() - { - $view = $this->viewDataTable; - - // set view properties based on goal requested - $idSite = Common::getRequestVar('idSite', null, 'int'); - $idGoal = Common::getRequestVar('idGoal', AddColumnsProcessedMetricsGoal::GOALS_OVERVIEW, 'string'); - if ($idGoal == Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER) { - $this->setPropertiesForEcommerceView($view); - } else if ($idGoal == AddColumnsProcessedMetricsGoal::GOALS_FULL_TABLE) { - $this->setPropertiesForGoals($view, $idSite, 'all'); - } else if ($idGoal == AddColumnsProcessedMetricsGoal::GOALS_OVERVIEW) { - $this->setPropertiesForGoalsOverview($view, $idSite); - } else { - $this->setPropertiesForGoals($view, $idSite, array($idGoal)); - } - - // add goals columns - $view->filters[] = array('AddColumnsProcessedMetricsGoal', array($ignore = true, $idGoal), $priority = true); - - // prettify columns - $setRatePercent = function ($rate, $thang = false) { - return $rate == 0 ? "0%" : $rate; - }; - foreach ($view->columns_to_display as $columnName) { - if (strpos($columnName, 'conversion_rate') !== false) { - $view->filters[] = array('ColumnCallbackReplace', array($columnName, $setRatePercent)); - } - } - - $formatPercent = function ($value) use ($idSite) { - return MetricsFormatter::getPrettyMoney(sprintf("%.1f", $value), $idSite); - }; - - foreach ($view->columns_to_display as $columnName) { - if ($this->isRevenueColumn($columnName)) { - $view->filters[] = array('ColumnCallbackReplace', array($columnName, $formatPercent)); - } - } - - // this ensures that the value is set to zero for all rows where the value was not set (no conversion) - $identityFunction = function ($value) { - return $value; - }; - foreach ($view->columns_to_display as $columnName) { - if (!$this->isRevenueColumn($columnName)) { - $view->filters[] = array('ColumnCallbackReplace', array($columnName, $identityFunction)); - } - } - } - - private function setPropertiesForEcommerceView($view) - { - $view->filter_sort_column = 'goal_ecommerceOrder_revenue'; - $view->filter_sort_order = 'desc'; - - $view->columns_to_display = array( - 'label', 'nb_visits', 'goal_ecommerceOrder_nb_conversions', 'goal_ecommerceOrder_revenue', - 'goal_ecommerceOrder_conversion_rate', 'goal_ecommerceOrder_avg_order_revenue', 'goal_ecommerceOrder_items', - 'goal_ecommerceOrder_revenue_per_visit' - ); - - $view->translations += array( - 'goal_ecommerceOrder_conversion_rate' => Piwik::translate('Goals_ConversionRate', Piwik::translate('Goals_EcommerceOrder')), - 'goal_ecommerceOrder_nb_conversions' => Piwik::translate('General_EcommerceOrders'), - 'goal_ecommerceOrder_revenue' => Piwik::translate('General_TotalRevenue'), - 'goal_ecommerceOrder_revenue_per_visit' => Piwik::translate('General_ColumnValuePerVisit'), - 'goal_ecommerceOrder_avg_order_revenue' => Piwik::translate('General_AverageOrderValue'), - 'goal_ecommerceOrder_items' => Piwik::translate('General_PurchasedProducts') - ); - - $goalName = Piwik::translate('General_EcommerceOrders'); - $view->metrics_documentation += array( - 'goal_ecommerceOrder_conversion_rate' => Piwik::translate('Goals_ColumnConversionRateDocumentation', $goalName), - 'goal_ecommerceOrder_nb_conversions' => Piwik::translate('Goals_ColumnConversionsDocumentation', $goalName), - 'goal_ecommerceOrder_revenue' => Piwik::translate('Goals_ColumnRevenueDocumentation', $goalName), - 'goal_ecommerceOrder_revenue_per_visit' => Piwik::translate('Goals_ColumnAverageOrderRevenueDocumentation', $goalName), - 'goal_ecommerceOrder_avg_order_revenue' => Piwik::translate('Goals_ColumnAverageOrderRevenueDocumentation', $goalName), - 'goal_ecommerceOrder_items' => Piwik::translate('Goals_ColumnPurchasedProductsDocumentation', $goalName), - 'revenue_per_visit' => Piwik::translate('Goals_ColumnRevenuePerVisitDocumentation', $goalName) - ); - } - - private function setPropertiesForGoalsOverview($view, $idSite) - { - $allGoals = $this->getGoals($idSite); - - // set view properties - $view->columns_to_display = array('label', 'nb_visits'); - - foreach ($allGoals as $goal) { - $column = "goal_{$goal['idgoal']}_conversion_rate"; - - $view->columns_to_display[] = $column; - $view->translations[$column] = Piwik::translate('Goals_ConversionRate', $goal['name']); - $view->metrics_documentation[$column] - = Piwik::translate('Goals_ColumnConversionRateDocumentation', $goal['quoted_name'] ? : $goal['name']); - } - - $view->columns_to_display[] = 'revenue_per_visit'; - $view->metrics_documentation['revenue_per_visit'] = - Piwik::translate('Goals_ColumnRevenuePerVisitDocumentation', Piwik::translate('Goals_EcommerceAndGoalsMenu')); - } - - private function setPropertiesForGoals($view, $idSite, $idGoals) - { - $allGoals = $this->getGoals($idSite); - - if ($idGoals == 'all') { - $idGoals = array_keys($allGoals); - } else { - // only sort by a goal's conversions if not showing all goals (for FULL_REPORT) - $view->filter_sort_column = 'goal_' . reset($idGoals) . '_nb_conversions'; - $view->filter_sort_order = 'desc'; - } - - $view->columns_to_display = array('label', 'nb_visits'); - - $goalColumnTemplates = array( - 'goal_%s_nb_conversions', - 'goal_%s_conversion_rate', - 'goal_%s_revenue', - 'goal_%s_revenue_per_visit', - ); - - // set columns to display (columns of same type but different goals will be next to each other, - // ie, goal_0_nb_conversions, goal_1_nb_conversions, etc.) - foreach ($goalColumnTemplates as $idx => $columnTemplate) { - foreach ($idGoals as $idGoal) { - $column = sprintf($columnTemplate, $idGoal); - $view->columns_to_display[] = $column; - } - } - - // set translations & metric docs for goal specific metrics - foreach ($idGoals as $idGoal) { - $goalName = $allGoals[$idGoal]['name']; - $quotedGoalName = $allGoals[$idGoal]['quoted_name'] ? : $goalName; - - $view->translations += array( - 'goal_' . $idGoal . '_nb_conversions' => Piwik::translate('Goals_Conversions', $goalName), - 'goal_' . $idGoal . '_conversion_rate' => Piwik::translate('Goals_ConversionRate', $goalName), - 'goal_' . $idGoal . '_revenue' => - Piwik::translate('%s ' . Piwik::translate('General_ColumnRevenue'), $goalName), - 'goal_' . $idGoal . '_revenue_per_visit' => - Piwik::translate('%s ' . Piwik::translate('General_ColumnValuePerVisit'), $goalName), - ); - - $view->metrics_documentation += array( - 'goal_' . $idGoal . '_nb_conversions' => Piwik::translate('Goals_ColumnConversionsDocumentation', $quotedGoalName), - 'goal_' . $idGoal . '_conversion_rate' => Piwik::translate('Goals_ColumnConversionRateDocumentation', $quotedGoalName), - 'goal_' . $idGoal . '_revenue' => Piwik::translate('Goals_ColumnRevenueDocumentation', $quotedGoalName), - 'goal_' . $idGoal . '_revenue_per_visit' => - Piwik::translate('Goals_ColumnRevenuePerVisitDocumentation', Piwik::translate('Goals_EcommerceAndGoalsMenu')), - ); - } - - $view->columns_to_display[] = 'revenue_per_visit'; - } - - private function getGoals($idSite) - { - // get all goals to display info for - $allGoals = array(); - - // add the ecommerce goal if ecommerce is enabled for the site - if (Site::isEcommerceEnabledFor($idSite)) { - $ecommerceGoal = array( - 'idgoal' => Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER, - 'name' => Piwik::translate('Goals_EcommerceOrder'), - 'quoted_name' => false - ); - $allGoals[$ecommerceGoal['idgoal']] = $ecommerceGoal; - } - - // add the site's goals (and escape all goal names) - $siteGoals = APIGoals::getInstance()->getGoals($idSite); - foreach ($siteGoals as &$goal) { - $goal['name'] = Common::sanitizeInputValue($goal['name']); - - $goal['quoted_name'] = '"' . $goal['name'] . '"'; - $allGoals[$goal['idgoal']] = $goal; - } - - return $allGoals; - } - - private function isRevenueColumn($name) - { - return strpos($name, '_revenue') !== false || $name == 'revenue_per_visit'; - } }
\ No newline at end of file diff --git a/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php b/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php index 1b7fc1236b..d03ba2c05c 100644 --- a/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php +++ b/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php @@ -11,8 +11,18 @@ namespace Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable; +use Piwik\DataTable\DataTableInterface; use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable; use Piwik\Visualization\Config; +use Piwik\Common; +use Piwik\DataTable\Filter\AddColumnsProcessedMetricsGoal; +use Piwik\MetricsFormatter; +use Piwik\Piwik; +use Piwik\Plugins\Goals\API as APIGoals; +use Piwik\Site; +use Piwik\View; +use Piwik\ViewDataTable\Visualization; +use Piwik\Visualization\Request; /** * DataTable Visualization that derives from HtmlTable and sets show_extra_columns to true. @@ -25,6 +35,39 @@ class AllColumns extends HtmlTable { $properties->visualization_properties->show_extra_columns = true; + $properties->show_exclude_low_population = true; + $properties->datatable_css_class = 'dataTableVizAllColumns'; + parent::configureVisualization($properties); } + + public function beforeGenericFiltersAreAppliedToLoadedDataTable(DataTableInterface $dataTable, Config $properties, Request $request) + { + $dataTable->filter('AddColumnsProcessedMetrics'); + + $dataTable->filter(function ($dataTable) use ($properties) { + $columnsToDisplay = array('label', 'nb_visits'); + + if (in_array('nb_uniq_visitors', $dataTable->getColumns())) { + $columnsToDisplay[] = 'nb_uniq_visitors'; + } + + $columnsToDisplay = array_merge( + $columnsToDisplay, array('nb_actions', 'nb_actions_per_visit', 'avg_time_on_site', 'bounce_rate') + ); + + // only display conversion rate for the plugins that do not provide "per goal" metrics + // otherwise, conversion rate is meaningless as a whole (since we don't process 'cross goals' conversions) + if (!$properties->show_goals) { + $columnsToDisplay[] = 'conversion_rate'; + } + + $properties->columns_to_display = $columnsToDisplay; + }); + + $prettifyTime = array('\Piwik\MetricsFormatter', 'getPrettyTimeFromSeconds'); + + $dataTable->filter('ColumnCallbackReplace', array('avg_time_on_site', $prettifyTime)); + } + }
\ No newline at end of file diff --git a/plugins/CoreVisualizations/Visualizations/HtmlTable/Goals.php b/plugins/CoreVisualizations/Visualizations/HtmlTable/Goals.php index d158b85c68..71aec3fe2f 100644 --- a/plugins/CoreVisualizations/Visualizations/HtmlTable/Goals.php +++ b/plugins/CoreVisualizations/Visualizations/HtmlTable/Goals.php @@ -11,8 +11,16 @@ namespace Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable; +use Piwik\Piwik; use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable; use Piwik\Visualization\Config; +use Piwik\Common; +use Piwik\DataTable\Filter\AddColumnsProcessedMetricsGoal; +use Piwik\MetricsFormatter; +use Piwik\Plugins\Goals\API as APIGoals; +use Piwik\Site; +use Piwik\View; +use Piwik\ViewDataTable\Visualization; /** * DataTable Visualization that derives from HtmlTable and sets show_goals_columns to true. @@ -25,6 +33,221 @@ class Goals extends HtmlTable { $properties->visualization_properties->show_goals_columns = true; + $properties->datatable_css_class = 'dataTableVizGoals'; + $properties->show_exclude_low_population = true; + $properties->show_goals = true; + + $properties->translations += array( + 'nb_conversions' => Piwik::translate('Goals_ColumnConversions'), + 'conversion_rate' => Piwik::translate('General_ColumnConversionRate'), + 'revenue' => Piwik::translate('General_ColumnRevenue'), + 'revenue_per_visit' => Piwik::translate('General_ColumnValuePerVisit'), + ); + $properties->metrics_documentation['nb_visits'] = Piwik::translate('Goals_ColumnVisits'); + + if (Common::getRequestVar('documentationForGoalsPage', 0, 'int') == 1) { // TODO: should not use query parameter + $properties->documentation = Piwik::translate('Goals_ConversionByTypeReportDocumentation', + array('<br />', '<br />', '<a href="http://piwik.org/docs/tracking-goals-web-analytics/" target="_blank">', '</a>')); + } + + if (!$properties->visualization_properties->disable_subtable_when_show_goals) { + $properties->subtable_controller_action = null; + } + + $this->setShowGoalsColumnsProperties(); + parent::configureVisualization($properties); } + + private function setShowGoalsColumnsProperties() + { + $view = $this->viewDataTable; + + // set view properties based on goal requested + $idSite = Common::getRequestVar('idSite', null, 'int'); + $idGoal = Common::getRequestVar('idGoal', AddColumnsProcessedMetricsGoal::GOALS_OVERVIEW, 'string'); + if ($idGoal == Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER) { + $this->setPropertiesForEcommerceView($view); + } else if ($idGoal == AddColumnsProcessedMetricsGoal::GOALS_FULL_TABLE) { + $this->setPropertiesForGoals($view, $idSite, 'all'); + } else if ($idGoal == AddColumnsProcessedMetricsGoal::GOALS_OVERVIEW) { + $this->setPropertiesForGoalsOverview($view, $idSite); + } else { + $this->setPropertiesForGoals($view, $idSite, array($idGoal)); + } + + // add goals columns + $view->filters[] = array('AddColumnsProcessedMetricsGoal', array($ignore = true, $idGoal), $priority = true); + + // prettify columns + $setRatePercent = function ($rate, $thang = false) { + return $rate == 0 ? "0%" : $rate; + }; + foreach ($view->columns_to_display as $columnName) { + if (strpos($columnName, 'conversion_rate') !== false) { + $view->filters[] = array('ColumnCallbackReplace', array($columnName, $setRatePercent)); + } + } + + $formatPercent = function ($value) use ($idSite) { + return MetricsFormatter::getPrettyMoney(sprintf("%.1f", $value), $idSite); + }; + + foreach ($view->columns_to_display as $columnName) { + if ($this->isRevenueColumn($columnName)) { + $view->filters[] = array('ColumnCallbackReplace', array($columnName, $formatPercent)); + } + } + + // this ensures that the value is set to zero for all rows where the value was not set (no conversion) + $identityFunction = function ($value) { + return $value; + }; + foreach ($view->columns_to_display as $columnName) { + if (!$this->isRevenueColumn($columnName)) { + $view->filters[] = array('ColumnCallbackReplace', array($columnName, $identityFunction)); + } + } + } + + private function setPropertiesForEcommerceView($view) + { + $view->filter_sort_column = 'goal_ecommerceOrder_revenue'; + $view->filter_sort_order = 'desc'; + + $view->columns_to_display = array( + 'label', 'nb_visits', 'goal_ecommerceOrder_nb_conversions', 'goal_ecommerceOrder_revenue', + 'goal_ecommerceOrder_conversion_rate', 'goal_ecommerceOrder_avg_order_revenue', 'goal_ecommerceOrder_items', + 'goal_ecommerceOrder_revenue_per_visit' + ); + + $view->translations += array( + 'goal_ecommerceOrder_conversion_rate' => Piwik::translate('Goals_ConversionRate', Piwik::translate('Goals_EcommerceOrder')), + 'goal_ecommerceOrder_nb_conversions' => Piwik::translate('General_EcommerceOrders'), + 'goal_ecommerceOrder_revenue' => Piwik::translate('General_TotalRevenue'), + 'goal_ecommerceOrder_revenue_per_visit' => Piwik::translate('General_ColumnValuePerVisit'), + 'goal_ecommerceOrder_avg_order_revenue' => Piwik::translate('General_AverageOrderValue'), + 'goal_ecommerceOrder_items' => Piwik::translate('General_PurchasedProducts') + ); + + $goalName = Piwik::translate('General_EcommerceOrders'); + $view->metrics_documentation += array( + 'goal_ecommerceOrder_conversion_rate' => Piwik::translate('Goals_ColumnConversionRateDocumentation', $goalName), + 'goal_ecommerceOrder_nb_conversions' => Piwik::translate('Goals_ColumnConversionsDocumentation', $goalName), + 'goal_ecommerceOrder_revenue' => Piwik::translate('Goals_ColumnRevenueDocumentation', $goalName), + 'goal_ecommerceOrder_revenue_per_visit' => Piwik::translate('Goals_ColumnAverageOrderRevenueDocumentation', $goalName), + 'goal_ecommerceOrder_avg_order_revenue' => Piwik::translate('Goals_ColumnAverageOrderRevenueDocumentation', $goalName), + 'goal_ecommerceOrder_items' => Piwik::translate('Goals_ColumnPurchasedProductsDocumentation', $goalName), + 'revenue_per_visit' => Piwik::translate('Goals_ColumnRevenuePerVisitDocumentation', $goalName) + ); + } + + private function setPropertiesForGoalsOverview($view, $idSite) + { + $allGoals = $this->getGoals($idSite); + + // set view properties + $view->columns_to_display = array('label', 'nb_visits'); + + foreach ($allGoals as $goal) { + $column = "goal_{$goal['idgoal']}_conversion_rate"; + + $view->columns_to_display[] = $column; + $view->translations[$column] = Piwik::translate('Goals_ConversionRate', $goal['name']); + $view->metrics_documentation[$column] + = Piwik::translate('Goals_ColumnConversionRateDocumentation', $goal['quoted_name'] ? : $goal['name']); + } + + $view->columns_to_display[] = 'revenue_per_visit'; + $view->metrics_documentation['revenue_per_visit'] = + Piwik::translate('Goals_ColumnRevenuePerVisitDocumentation', Piwik::translate('Goals_EcommerceAndGoalsMenu')); + } + + private function setPropertiesForGoals($view, $idSite, $idGoals) + { + $allGoals = $this->getGoals($idSite); + + if ($idGoals == 'all') { + $idGoals = array_keys($allGoals); + } else { + // only sort by a goal's conversions if not showing all goals (for FULL_REPORT) + $view->filter_sort_column = 'goal_' . reset($idGoals) . '_nb_conversions'; + $view->filter_sort_order = 'desc'; + } + + $view->columns_to_display = array('label', 'nb_visits'); + + $goalColumnTemplates = array( + 'goal_%s_nb_conversions', + 'goal_%s_conversion_rate', + 'goal_%s_revenue', + 'goal_%s_revenue_per_visit', + ); + + // set columns to display (columns of same type but different goals will be next to each other, + // ie, goal_0_nb_conversions, goal_1_nb_conversions, etc.) + foreach ($goalColumnTemplates as $idx => $columnTemplate) { + foreach ($idGoals as $idGoal) { + $column = sprintf($columnTemplate, $idGoal); + $view->columns_to_display[] = $column; + } + } + + // set translations & metric docs for goal specific metrics + foreach ($idGoals as $idGoal) { + $goalName = $allGoals[$idGoal]['name']; + $quotedGoalName = $allGoals[$idGoal]['quoted_name'] ? : $goalName; + + $view->translations += array( + 'goal_' . $idGoal . '_nb_conversions' => Piwik::translate('Goals_Conversions', $goalName), + 'goal_' . $idGoal . '_conversion_rate' => Piwik::translate('Goals_ConversionRate', $goalName), + 'goal_' . $idGoal . '_revenue' => + Piwik::translate('%s ' . Piwik::translate('General_ColumnRevenue'), $goalName), + 'goal_' . $idGoal . '_revenue_per_visit' => + Piwik::translate('%s ' . Piwik::translate('General_ColumnValuePerVisit'), $goalName), + ); + + $view->metrics_documentation += array( + 'goal_' . $idGoal . '_nb_conversions' => Piwik::translate('Goals_ColumnConversionsDocumentation', $quotedGoalName), + 'goal_' . $idGoal . '_conversion_rate' => Piwik::translate('Goals_ColumnConversionRateDocumentation', $quotedGoalName), + 'goal_' . $idGoal . '_revenue' => Piwik::translate('Goals_ColumnRevenueDocumentation', $quotedGoalName), + 'goal_' . $idGoal . '_revenue_per_visit' => + Piwik::translate('Goals_ColumnRevenuePerVisitDocumentation', Piwik::translate('Goals_EcommerceAndGoalsMenu')), + ); + } + + $view->columns_to_display[] = 'revenue_per_visit'; + } + + private function getGoals($idSite) + { + // get all goals to display info for + $allGoals = array(); + + // add the ecommerce goal if ecommerce is enabled for the site + if (Site::isEcommerceEnabledFor($idSite)) { + $ecommerceGoal = array( + 'idgoal' => Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER, + 'name' => Piwik::translate('Goals_EcommerceOrder'), + 'quoted_name' => false + ); + $allGoals[$ecommerceGoal['idgoal']] = $ecommerceGoal; + } + + // add the site's goals (and escape all goal names) + $siteGoals = APIGoals::getInstance()->getGoals($idSite); + foreach ($siteGoals as &$goal) { + $goal['name'] = Common::sanitizeInputValue($goal['name']); + + $goal['quoted_name'] = '"' . $goal['name'] . '"'; + $allGoals[$goal['idgoal']] = $goal; + } + + return $allGoals; + } + + private function isRevenueColumn($name) + { + return strpos($name, '_revenue') !== false || $name == 'revenue_per_visit'; + } }
\ No newline at end of file diff --git a/plugins/TreemapVisualization b/plugins/TreemapVisualization -Subproject 6280ba3397145e72e748126f4ba9faf1acd88d0 +Subproject 9108f8cf450eabdbfe9dd1a27df28aa203f2648 diff --git a/tests/PHPUnit/UI b/tests/PHPUnit/UI -Subproject c4fdf287d2b64ba00b1fdc41c99da7349e130da +Subproject 52caf8b47f6035ef7207c52954df9e54904896a |