2023-01-23 11:03:31 +01:00

357 lines
12 KiB
PHP

<?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\Common;
use Piwik\Piwik;
use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Evolution;
use Piwik\Plugins\CoreVisualizations\Visualizations\Sparklines;
use Piwik\Plugin\ReportsProvider;
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();
$extraParameters = [ 'segmented_visitor_log_segment_suffix' => 'visitEcommerceStatus==ordered' ];
$this->buildGoalByDimensionView(Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER, $config, $extraParameters);
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, $extraParameters = [])
{
$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 (!$widget) {
continue;
}
if (!empty($report['name'])) {
$widget->setName($report['name']);
}
$widget->setParameters($params);
$widget->addParameters($extraParameters);
$widget->setCategoryId($categoryText);
$widget->setSubcategoryId($categoryText);
$widget->setOrder($order);
if ($ecommerce) {
$widget->setIsWidgetizable();
} else {
$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);
if ($report) {
$factory = new ReportWidgetFactory($report);
return $factory->createWidget();
}
}
}