Skip to content
Extraits de code Groupes Projets
Pages.php 11,5 ko
Newer Older
  • Learn to ignore specific revisions
  • <?php
    /**
     * Piwik - free/libre analytics platform
     *
     * @link http://piwik.org
     * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
     *
     */
    namespace Piwik\Plugins\Goals;
    
    use Piwik\Cache;
    use Piwik\Common;
    use Piwik\Piwik;
    use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Evolution;
    use Piwik\Plugins\CoreVisualizations\Visualizations\Sparklines;
    
    use Piwik\Widget\WidgetContainerConfig;
    use Piwik\Widget\WidgetConfig;
    use Piwik\Report\ReportWidgetFactory;
    
    class Pages
    {
        private $orderId = 0;
        private $allReports = array();
        private $factory = array();
        private $conversions;
    
        public function __construct(ReportWidgetFactory $reportFactory, $reportsWithGoalMetrics)
        {
            $this->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(5);
    
            $config->setIsNotWidgetizable();
            $widgets[] = $config;
    
            $config = $this->factory->createWidget();
            $config->forceViewDataTable(Sparklines::ID);
            $config->setSubcategoryId($subcategory);
            $config->setName('');
    
            $config->setOrder(15);
    
            $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(25);
    
                $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(35);
    
            $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(5);
    
            $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(15);
    
            $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(25);
    
            $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(5);
    
            $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(5);
    
            $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(15);
    
            $config->setIsNotWidgetizable();
            $widgets[] = $config;
    
            $config = $this->factory->createWidget();
            $config->setAction('goalConversionsOverview');
            $config->setSubcategoryId($idGoal);
            $config->setName('Goals_ConversionsOverview');
            $config->setParameters($params);
    
            $config->setOrder(25);
    
            $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(35);
    
            $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';
                    }
    
    
    Thomas Steur's avatar
    Thomas Steur a validé
                    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']);
                    }
    
    Thomas Steur's avatar
    Thomas Steur a validé
                    $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);
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $factory = new ReportWidgetFactory($report);