idSite = Common::getRequestVar('idSite', null, 'int'); $this->processOnlyIdGoal = Common::getRequestVar('idGoal', AddColumnsProcessedMetricsGoal::GOALS_OVERVIEW, 'string'); $this->isEcommerce = $this->processOnlyIdGoal == Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER; $this->viewProperties['show_exclude_low_population'] = true; $this->viewProperties['show_goals'] = true; if (Common::getRequestVar('documentationForGoalsPage', 0, 'int') == 1) { $this->setReportDocumentation(Piwik_Translate('Goals_ConversionByTypeReportDocumentation', array('
', '
', '', ''))); } $this->setMetricDocumentation('nb_visits', Piwik_Translate('Goals_ColumnVisits')); if ($this->isEcommerce) { $this->setMetricDocumentation('revenue_per_visit', Piwik_Translate('Goals_ColumnRevenuePerVisitDocumentation', Piwik_Translate('General_EcommerceOrders'))); $this->setColumnsTranslations(array( 'goal_%s_conversion_rate' => Piwik_Translate('Goals_ConversionRate'), 'goal_%s_nb_conversions' => Piwik_Translate('General_EcommerceOrders'), 'goal_%s_revenue' => Piwik_Translate('General_TotalRevenue'), 'goal_%s_revenue_per_visit' => Piwik_Translate('General_ColumnValuePerVisit'), 'goal_%s_avg_order_revenue' => Piwik_Translate('General_AverageOrderValue'), 'goal_%s_items' => Piwik_Translate('General_PurchasedProducts'), )); $this->setColumnsToDisplay(array( 'label', 'nb_visits', 'goal_%s_nb_conversions', 'goal_%s_revenue', 'goal_%s_conversion_rate', 'goal_%s_avg_order_revenue', 'goal_%s_items', 'goal_%s_revenue_per_visit', )); // Default sort column $this->setSortedColumn('goal_ecommerceOrder_revenue', 'desc'); } else { $this->setMetricDocumentation('revenue_per_visit', Piwik_Translate('Goals_ColumnRevenuePerVisitDocumentation', Piwik_Translate('Goals_EcommerceAndGoalsMenu'))); $this->setColumnsTranslations(array( 'goal_%s_conversion_rate' => Piwik_Translate('Goals_ConversionRate'), 'goal_%s_nb_conversions' => Piwik_Translate('Goals_Conversions'), 'goal_%s_revenue' => '%s ' . Piwik_Translate('Goals_ColumnRevenue'), 'goal_%s_revenue_per_visit' => '%s ' . Piwik_Translate('General_ColumnValuePerVisit'), 'nb_conversions' => Piwik_Translate('Goals_ColumnConversions'), 'conversion_rate' => Piwik_Translate('General_ColumnConversionRate'), 'revenue' => Piwik_Translate('Goals_ColumnRevenue'), 'revenue_per_visit' => Piwik_Translate('General_ColumnValuePerVisit'), )); $this->setColumnsToDisplay(array( 'label', 'nb_visits', 'goal_%s_nb_conversions', 'goal_%s_conversion_rate', 'goal_%s_revenue', 'goal_%s_revenue_per_visit', 'revenue_per_visit', )); // Default sort column $columnsToDisplay = $this->getColumnsToDisplay(); $columnNbConversionsCurrentGoal = $columnsToDisplay[2]; if ($this->processOnlyIdGoal > 0 && strpos($columnNbConversionsCurrentGoal, '_nb_conversions') !== false ) { $this->setSortedColumn($columnNbConversionsCurrentGoal, 'desc'); } } parent::main(); } public function disableSubTableWhenShowGoals() { $this->controllerActionCalledWhenRequestSubTable = null; } public function setColumnsToDisplay($columnsNames) { $newColumnsNames = array(); $goals = array(); $idSite = $this->getIdSite(); if ($idSite) { $goals = Piwik_Goals_API::getInstance()->getGoals($idSite); $ecommerceGoal = array( 'idgoal' => Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER, 'name' => Piwik_Translate('Goals_EcommerceOrder') ); $site = new Site($idSite); //Case Ecommerce report table if ($this->isEcommerce) { $goals = array($ecommerceGoal); } // Case tableGoals elseif ($site->isEcommerceEnabled()) { $goals = array_merge( array($ecommerceGoal), $goals ); } } foreach ($columnsNames as $columnName) { if (in_array($columnName, array( 'goal_%s_conversion_rate', 'goal_%s_nb_conversions', 'goal_%s_revenue_per_visit', 'goal_%s_revenue', 'goal_%s_avg_order_revenue', 'goal_%s_items', )) ) { foreach ($goals as $goal) { $idgoal = $goal['idgoal']; $goal['name'] = Common::unsanitizeInputValue($goal['name']); if ($this->processOnlyIdGoal > AddColumnsProcessedMetricsGoal::GOALS_FULL_TABLE && $this->processOnlyIdGoal != $idgoal && !$this->isEcommerce ) { continue; } $name = Piwik_Translate($this->getColumnTranslation($columnName), $goal['name']); $columnNameGoal = str_replace('%s', $idgoal, $columnName); $this->setColumnTranslation($columnNameGoal, $name); $this->setDynamicMetricDocumentation($columnName, $columnNameGoal, $goal['name'], $goal['idgoal']); if (strpos($columnNameGoal, '_rate') === false // For the goal table (when the flag icon is clicked), we only display the per Goal Conversion rate && $this->processOnlyIdGoal == AddColumnsProcessedMetricsGoal::GOALS_OVERVIEW ) { continue; } if (strstr($columnNameGoal, '_revenue') !== false) { $this->columnsToRevenueFilter[] = $columnNameGoal; } else { $this->columnsToConversionFilter[] = $columnNameGoal; } $newColumnsNames[] = $columnNameGoal; } } else { $newColumnsNames[] = $columnName; } } parent::setColumnsToDisplay($newColumnsNames); } /** * Find the appropriate metric documentation for a goal column * @param string $genericMetricName * @param string $metricName * @param string $goalName * @param int $idGoal */ private function setDynamicMetricDocumentation($genericMetricName, $metricName, $goalName, $idGoal) { if ($idGoal == Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER) { $goalName = Piwik_Translate('General_EcommerceOrders'); } else { $goalName = '"' . $goalName . '"'; } $langString = false; switch ($genericMetricName) { case 'goal_%s_nb_conversions': $langString = 'Goals_ColumnConversionsDocumentation'; break; case 'goal_%s_conversion_rate': $langString = 'Goals_ColumnConversionRateDocumentation'; break; case 'goal_%s_revenue_per_visit': $langString = 'Goals_ColumnRevenuePerVisitDocumentation'; break; case 'goal_%s_revenue': $langString = 'Goals_ColumnRevenueDocumentation'; break; case 'goal_%s_avg_order_revenue': $langString = 'Goals_ColumnAverageOrderRevenueDocumentation'; break; case 'goal_%s_items': $langString = 'Goals_ColumnPurchasedProductsDocumentation'; break; } if ($langString) { $doc = Piwik_Translate($langString, $goalName); $this->setMetricDocumentation($metricName, $doc); } } protected function getRequestArray() { $requestArray = parent::getRequestArray(); if ($this->processOnlyIdGoal > AddColumnsProcessedMetricsGoal::GOALS_FULL_TABLE || $this->isEcommerce ) { $requestArray["idGoal"] = $this->processOnlyIdGoal; } $requestArray['filter_update_columns_when_show_all_goals'] = 1; return $requestArray; } protected $columnsToRevenueFilter = array(); protected $columnsToConversionFilter = array(); protected $idSite = false; private function getIdSite() { return $this->idSite; } protected function postDataTableLoadedFromAPI() { $valid = parent::postDataTableLoadedFromAPI(); if ($valid === false) return false; foreach ($this->getColumnsToDisplay() as $columnName) { if (strpos($columnName, 'conversion_rate')) { $this->dataTable->filter('ColumnCallbackReplace', array($columnName, create_function('$rate', 'if($rate==0) return "0%"; else return $rate;'))); } } $this->columnsToRevenueFilter[] = 'revenue_per_visit'; foreach ($this->columnsToRevenueFilter as $columnName) { $this->dataTable->filter('ColumnCallbackReplace', array($columnName, create_function('$value', 'return sprintf("%.1f",$value);'))); $this->dataTable->filter('ColumnCallbackReplace', array($columnName, '\Piwik\Piwik::getPrettyMoney', array($this->getIdSite()))); } foreach ($this->columnsToConversionFilter as $columnName) { // this ensures that the value is set to zero for all rows where the value was not set (no conversion) $this->dataTable->filter('ColumnCallbackReplace', array($columnName, create_function('$value', 'return $value;'))); } return true; } public function getDefaultDataTableCssClass() { return 'dataTableGoals'; } }