Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Steur <tsteur@users.noreply.github.com>2013-10-14 08:33:20 +0400
committerThomas Steur <tsteur@users.noreply.github.com>2013-10-14 08:33:20 +0400
commit8e5534dcadd9f59a83dd683731b8d7d319fd8903 (patch)
treefc20ea50a54adfdb8ee87f312475d0d3ec90d46c
parent45933aad796c3cfcbab8c6fe4bd6d04d2dc3c3bd (diff)
parentf4298e1b13c266554f1fdf32f24f629ffcbc0360 (diff)
Merge pull request #126 from piwik/viewdata_cleanup
Viewdata cleanup
-rw-r--r--core/ViewDataTable.php15
-rw-r--r--core/Visualization/Config.php15
-rw-r--r--plugins/CoreVisualizations/Visualizations/HtmlTable.php254
-rw-r--r--plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php43
-rw-r--r--plugins/CoreVisualizations/Visualizations/HtmlTable/Goals.php223
m---------plugins/TreemapVisualization0
m---------tests/PHPUnit/UI0
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