factory = $reportFactory; $this->allReports = $reportsWithGoalMetrics; $this->conversions = new Conversions(); } /** * @param array $goals * @return WidgetConfig[] */ public function createGoalsOverviewPage($goals) { $subcategory = 'General_Overview'; $widgets = array(); $config = $this->factory->createWidget(); $config->forceViewDataTable(Evolution::ID); $config->setSubcategoryId($subcategory); $config->setAction('getEvolutionGraph'); $config->setOrder(++$this->orderId); $config->setIsNotWidgetizable(); $widgets[] = $config; $config = $this->factory->createWidget(); $config->forceViewDataTable(Sparklines::ID); $config->setSubcategoryId($subcategory); $config->setName(''); $config->setOrder(++$this->orderId); $config->setIsNotWidgetizable(); $widgets[] = $config; foreach ($goals as $goal) { $name = Common::sanitizeInputValue($goal['name']); $goalTranslated = Piwik::translate('Goals_GoalX', array($name)); $config = $this->factory->createWidget(); $config->setName($goalTranslated); $config->setSubcategoryId($subcategory); $config->forceViewDataTable(Sparklines::ID); $config->setParameters(array('idGoal' => $goal['idgoal'])); $config->setOrder(++$this->orderId); $config->setIsNotWidgetizable(); $config->addParameters(array('allow_multiple' => (int) $goal['allow_multiple'], 'only_summary' => '1')); $widgets[] = $config; } $container = $this->createWidgetizableWidgetContainer('GoalsOverview', $subcategory, $widgets); $config = $this->factory->createContainerWidget('Goals'); $config->setSubcategoryId($subcategory); $config->setName('Goals_ConversionsOverviewBy'); $config->setOrder(++$this->orderId); $config->setIsNotWidgetizable(); $this->buildGoalByDimensionView('', $config); $config->setMiddlewareParameters(array( 'module' => 'Goals', 'action' => 'hasConversions' )); return array($container, $config); } /** * @return WidgetConfig[] */ public function createEcommerceOverviewPage() { $category = 'Goals_Ecommerce'; $subcategory = 'General_Overview'; $idGoal = Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER; $widgets = array(); $config = $this->factory->createWidget(); $config->forceViewDataTable(Evolution::ID); $config->setCategoryId($category); $config->setSubcategoryId($subcategory); $config->setAction('getEvolutionGraph'); $config->setOrder(++$this->orderId); $config->setIsNotWidgetizable(); $config->setParameters(array('idGoal' => $idGoal)); $widgets[] = $config; $config = $this->factory->createWidget(); $config->setCategoryId($category); $config->forceViewDataTable(Sparklines::ID); $config->setSubcategoryId($subcategory); $config->setName(''); $config->setModule('Ecommerce'); $config->setAction('getSparklines'); $config->setParameters(array('idGoal' => $idGoal)); $config->setOrder(++$this->orderId); $config->setIsNotWidgetizable(); $widgets[] = $config; $config = $this->factory->createWidget(); $config->setModule('Ecommerce'); $config->setAction('getConversionsOverview'); $config->setSubcategoryId($idGoal); $config->setName('Goals_ConversionsOverview'); $config->setParameters(array('idGoal' => $idGoal)); $config->setOrder(++$this->orderId); $config->setIsNotWidgetizable(); $config->setMiddlewareParameters(array( 'module' => 'Goals', 'action' => 'hasConversions', 'idGoal' => $idGoal )); $widgets[] = $config; $container = $this->createWidgetizableWidgetContainer('EcommerceOverview', $subcategory, $widgets); return array($container); } /** * @return WidgetConfig[] */ public function createEcommerceSalesPage() { $category = 'Goals_Ecommerce'; $subcategory = 'Ecommerce_Sales'; $config = $this->factory->createContainerWidget('GoalsOrder'); $config->setCategoryId($category); $config->setSubcategoryId($subcategory); $config->setName(''); $config->setParameters(array('idGoal' => Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER)); $config->setOrder(++$this->orderId); $config->setIsNotWidgetizable(); $this->buildGoalByDimensionView(Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER, $config); return array($config); } /** * @param array $goal * @return WidgetConfig[] */ public function createGoalDetailPage($goal) { $widgets = array(); $idGoal = (int) $goal['idgoal']; $name = Common::sanitizeInputValue($goal['name']); $params = array('idGoal' => $idGoal); $config = $this->factory->createWidget(); $config->setSubcategoryId($idGoal); $config->forceViewDataTable(Evolution::ID); $config->setAction('getEvolutionGraph'); $config->setParameters($params); $config->setOrder(++$this->orderId); $config->setIsNotWidgetizable(); $widgets[] = $config; $config = $this->factory->createWidget(); $config->setSubcategoryId($idGoal); $config->setName(''); $config->forceViewDataTable(Sparklines::ID); $config->setParameters($params); $config->addParameters(array('allow_multiple' => (int) $goal['allow_multiple'])); $config->setOrder(++$this->orderId); $config->setIsNotWidgetizable(); $config->setIsNotWidgetizable(); $widgets[] = $config; $config = $this->factory->createWidget(); $config->setAction('goalConversionsOverview'); $config->setSubcategoryId($idGoal); $config->setName('Goals_ConversionsOverview'); $config->setParameters($params); $config->setOrder(++$this->orderId); $config->setIsNotWidgetizable(); $config->setMiddlewareParameters(array( 'module' => 'Goals', 'action' => 'hasConversions', 'idGoal' => $idGoal )); $widgets[] = $config; $container = $this->createWidgetizableWidgetContainer('Goal_' . $idGoal, $name, $widgets); $configs = array($container); $config = $this->factory->createContainerWidget('Goals' . $idGoal); $config->setName(Piwik::translate('Goals_GoalConversionsBy', array($name))); $config->setSubcategoryId($idGoal); $config->setParameters(array()); $config->setOrder(++$this->orderId); $config->setIsNotWidgetizable(); $config->setMiddlewareParameters(array( 'module' => 'Goals', 'action' => 'hasConversions', 'idGoal' => $idGoal )); $this->buildGoalByDimensionView($idGoal, $config); $configs[] = $config; return $configs; } private function createWidgetizableWidgetContainer($containerId, $pageName, $widgets) { /** @var \Piwik\Widget\WidgetConfig[] $widgets */ $firstWidget = reset($widgets); /** @var \Piwik\Report\ReportWidgetConfig $firstWidget */ if (!empty($pageName)) { // make sure to not show two titles (one for this container and one for the first widget) $firstWidget->setName(''); } $config = $this->factory->createContainerWidget($containerId); $config->setName($pageName); $config->setCategoryId($firstWidget->getCategoryId()); $config->setSubcategoryId($firstWidget->getSubcategoryId()); $config->setIsWidgetizable(); $config->setOrder($this->orderId++); foreach ($widgets as $widget) { $config->addWidgetConfig($widget); } return $config; } private function buildGoalByDimensionView($idGoal, WidgetContainerConfig $container) { $container->setLayout('ByDimension'); $ecommerce = ($idGoal == Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER); // for non-Goals reports, we show the goals table $customParams = array('documentationForGoalsPage' => '1'); if ($idGoal === '') { // if no idGoal, use 0 for overview. Must be string! Otherwise Piwik_View_HtmlTable_Goals fails. $customParams['idGoal'] = '0'; } else { $customParams['idGoal'] = $idGoal; } $translationHelper = new TranslationHelper(); foreach ($this->allReports as $category => $reports) { $order = ($this->getSortOrderOfCategory($category) * 100); if ($ecommerce) { $categoryText = $translationHelper->translateEcommerceMetricCategory($category); } else { $categoryText = $translationHelper->translateGoalMetricCategory($category); } foreach ($reports as $report) { $order++; if (empty($report['viewDataTable']) && empty($report['abandonedCarts']) ) { $report['viewDataTable'] = 'tableGoals'; } if (!empty($report['parameters'])) { $params = array_merge($customParams, $report['parameters']); } else { $params = $customParams; } $widget = $this->createWidgetForReport($report['module'], $report['action']); if (!empty($report['name'])) { $widget->setName($report['name']); } $widget->setParameters($params); $widget->setCategoryId($categoryText); $widget->setSubcategoryId($categoryText); $widget->setOrder($order); $widget->setIsNotWidgetizable(); if (!empty($report['viewDataTable'])) { $widget->forceViewDataTable($report['viewDataTable']); } $container->addWidgetConfig($widget); } } } private function getSortOrderOfCategory($category) { static $order = null; if (is_null($order)) { $order = array( 'Referrers_Referrers', 'General_Visit', 'General_Visitors', 'VisitsSummary_VisitsSummary', ); } $value = array_search($category, $order); if (false === $value) { $value = count($order) + 1; } return $value; } private function createWidgetForReport($module, $action) { $report = ReportsProvider::factory($module, $action); $factory = new ReportWidgetFactory($report); return $factory->createWidget(); } }