forked from rebillar/site-accueil-insa
281 lines
11 KiB
PHP
281 lines
11 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Matomo - free/libre analytics platform
|
|
*
|
|
* @link https://matomo.org
|
|
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
|
*
|
|
*/
|
|
|
|
namespace Piwik\Plugins\Goals\Reports;
|
|
|
|
use Piwik\API\Request;
|
|
use Piwik\Common;
|
|
use Piwik\DataTable;
|
|
use Piwik\DataTable\Filter\CalculateEvolutionFilter;
|
|
use Piwik\Metrics;
|
|
use Piwik\Metrics\Formatter as MetricFormatter;
|
|
use Piwik\NumberFormatter;
|
|
use Piwik\Period\Month;
|
|
use Piwik\Period\Range;
|
|
use Piwik\Piwik;
|
|
use Piwik\Period\Factory as PeriodFactory;
|
|
use Piwik\Plugin;
|
|
use Piwik\Plugin\ViewDataTable;
|
|
use Piwik\Plugins\CoreHome\Columns\Metrics\ConversionRate;
|
|
use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Evolution;
|
|
use Piwik\Plugins\CoreVisualizations\Visualizations\Sparklines;
|
|
use Piwik\Plugins\Goals\Goals;
|
|
use Piwik\Plugins\Goals\Pages;
|
|
use Piwik\Report\ReportWidgetFactory;
|
|
use Piwik\Site;
|
|
use Piwik\Tracker\GoalManager;
|
|
use Piwik\Url;
|
|
use Piwik\Widget\WidgetsList;
|
|
|
|
class Get extends Base
|
|
{
|
|
protected function init()
|
|
{
|
|
parent::init();
|
|
|
|
$this->name = Piwik::translate('Goals_Goals');
|
|
$this->processedMetrics = ['conversion_rate'];
|
|
$this->documentation = Piwik::translate('Goals_OverviewReportDocumentation');
|
|
$this->order = 1;
|
|
$this->orderGoal = 50;
|
|
$this->metrics = ['nb_conversions', 'nb_visits_converted', 'revenue'];
|
|
$this->parameters = null;
|
|
}
|
|
|
|
private function getGoals()
|
|
{
|
|
$idSite = $this->getIdSite();
|
|
$goals = Request::processRequest('Goals.getGoals', ['idSite' => $idSite, 'filter_limit' => '-1'], $default = []);
|
|
return $goals;
|
|
}
|
|
|
|
private function getGoal($goalId)
|
|
{
|
|
$goals = $this->getGoals();
|
|
|
|
if (!empty($goals[$goalId])) {
|
|
return $goals[$goalId];
|
|
}
|
|
}
|
|
|
|
public function configureWidgets(WidgetsList $widgetsList, ReportWidgetFactory $factory)
|
|
{
|
|
$idSite = Common::getRequestVar('idSite', 0, 'int');
|
|
|
|
if (empty($idSite)) {
|
|
return;
|
|
}
|
|
|
|
$goals = $this->getGoals();
|
|
$reports = Goals::getReportsWithGoalMetrics();
|
|
|
|
$page = new Pages($factory, $reports);
|
|
|
|
$widgetsList->addWidgetConfigs($page->createGoalsOverviewPage($goals));
|
|
|
|
if ($this->isEcommerceEnabled($idSite)) {
|
|
$widgetsList->addWidgetConfigs($page->createEcommerceOverviewPage());
|
|
$widgetsList->addWidgetConfigs($page->createEcommerceSalesPage());
|
|
}
|
|
|
|
foreach ($goals as $goal) {
|
|
$widgetsList->addWidgetConfigs($page->createGoalDetailPage($goal));
|
|
}
|
|
}
|
|
|
|
private function getIdSite()
|
|
{
|
|
return Common::getRequestVar('idSite', null, 'int');
|
|
}
|
|
|
|
private function isEcommerceEnabled($idSite)
|
|
{
|
|
if (!Plugin\Manager::getInstance()->isPluginActivated('Ecommerce')) {
|
|
return false;
|
|
}
|
|
|
|
$site = new Site($idSite);
|
|
return $site->isEcommerceEnabled();
|
|
}
|
|
|
|
public function configureView(ViewDataTable $view)
|
|
{
|
|
$idGoal = Common::getRequestVar('idGoal', 0, 'string');
|
|
|
|
$idSite = $this->getIdSite();
|
|
|
|
if ($view->isViewDataTableId(Sparklines::ID)) {
|
|
/** @var Sparklines $view */
|
|
$isEcommerceEnabled = $this->isEcommerceEnabled($idSite);
|
|
|
|
$onlySummary = Common::getRequestVar('only_summary', 0, 'int');
|
|
|
|
if ($onlySummary && !empty($idGoal)) {
|
|
if (is_numeric($idGoal)) {
|
|
$view->config->title_attributes = ['goal-page-link' => $idGoal];
|
|
}
|
|
|
|
// in Goals overview summary we show proper title for a goal
|
|
$goal = $this->getGoal($idGoal);
|
|
if (!empty($goal['name'])) {
|
|
$view->config->title = Piwik::translate('Goals_GoalX', "'" . $goal['name'] . "'");
|
|
}
|
|
} else {
|
|
$view->config->title = '';
|
|
}
|
|
|
|
$view->config->addTranslations([
|
|
'nb_visits' => Piwik::translate('VisitsSummary_NbVisitsDescription'),
|
|
'nb_conversions' => Piwik::translate('Goals_ConversionsDescription'),
|
|
'nb_visits_converted' => Piwik::translate('General_NVisits'),
|
|
'conversion_rate' => Piwik::translate('Goals_OverallConversionRate'),
|
|
'revenue' => Piwik::translate('Goals_OverallRevenue'),
|
|
]);
|
|
|
|
// Adding conversion rate as extra processed metrics ensures it will be formatted
|
|
$view->config->filters[] = function (DataTable $t) {
|
|
$extraProcessedMetrics = $t->getMetadata(DataTable::EXTRA_PROCESSED_METRICS_METADATA_NAME);
|
|
|
|
if (empty($extraProcessedMetrics)) {
|
|
$extraProcessedMetrics = [];
|
|
}
|
|
$extraProcessedMetrics[] = new ConversionRate();
|
|
$t->setMetadata(DataTable::EXTRA_PROCESSED_METRICS_METADATA_NAME, $extraProcessedMetrics);
|
|
};
|
|
|
|
$allowMultiple = Common::getRequestVar('allow_multiple', 0, 'int');
|
|
|
|
if ($allowMultiple) {
|
|
$view->config->addSparklineMetric(['nb_conversions', 'nb_visits_converted'], $order = 10);
|
|
} else {
|
|
$view->config->addSparklineMetric(['nb_conversions'], $order = 10);
|
|
}
|
|
|
|
$view->config->addSparklineMetric(['conversion_rate'], $order = 20);
|
|
|
|
if (empty($idGoal)) {
|
|
// goals overview sparklines below evolution graph
|
|
|
|
if ($isEcommerceEnabled) {
|
|
// this would be ideally done in Ecommerce plugin but then it is hard to keep same order
|
|
$view->config->addSparklineMetric(['revenue'], $order = 30);
|
|
}
|
|
} else {
|
|
if ($onlySummary) {
|
|
// in Goals Overview we list an overview for each goal....
|
|
$view->config->addTranslation('conversion_rate', Piwik::translate('Goals_ConversionRate'));
|
|
} elseif ($isEcommerceEnabled) {
|
|
// in Goals detail page...
|
|
$view->config->addSparklineMetric(['revenue'], $order = 30);
|
|
}
|
|
}
|
|
|
|
// Add evolution values to sparklines
|
|
[$lastPeriodDate, $ignore] = Range::getLastDate();
|
|
if ($lastPeriodDate !== false) {
|
|
|
|
/** @var DataTable $previousData */
|
|
$previousData = Request::processRequest('Goals.get', ['date' => $lastPeriodDate, 'format_metrics' => '0']);
|
|
$previousDataRow = $previousData->getFirstRow();
|
|
|
|
$currentPeriod = PeriodFactory::build(Piwik::getPeriod(), Common::getRequestVar('date'));
|
|
$currentPrettyDate = ($currentPeriod instanceof Month ? $currentPeriod->getLocalizedLongString() : $currentPeriod->getPrettyString());
|
|
$lastPeriod = PeriodFactory::build(Piwik::getPeriod(), $lastPeriodDate);
|
|
$lastPrettyDate = ($currentPeriod instanceof Month ? $lastPeriod->getLocalizedLongString() : $lastPeriod->getPrettyString());
|
|
|
|
$view->config->compute_evolution = function ($columns, $metrics) use ($currentPrettyDate, $lastPrettyDate, $previousDataRow, $idSite) {
|
|
|
|
$value = reset($columns);
|
|
$columnName = key($columns);
|
|
$pastValue = $previousDataRow->getColumn($columnName);
|
|
|
|
if (!is_numeric($value)) {
|
|
return;
|
|
}
|
|
|
|
// Format
|
|
$formatter = new MetricFormatter();
|
|
$currentValueFormatted = $value;
|
|
$pastValueFormatted = $pastValue;
|
|
foreach ($metrics as $metric) {
|
|
if ($metric->getName() === $columnName) {
|
|
$pastValueFormatted = $metric->format($pastValue, $formatter);
|
|
$currentValueFormatted = $metric->format($value, $formatter);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (strpos($columnName, 'revenue') !== false) {
|
|
$currencySymbol = Site::getCurrencySymbolFor($idSite);
|
|
$pastValueFormatted = NumberFormatter::getInstance()->formatCurrency($pastValue, $currencySymbol, GoalManager::REVENUE_PRECISION);
|
|
$currentValueFormatted = NumberFormatter::getInstance()->formatCurrency($value, $currencySymbol, GoalManager::REVENUE_PRECISION);
|
|
}
|
|
|
|
$columnTranslations = Metrics::getDefaultMetricTranslations();
|
|
$columnTranslation = '';
|
|
if (array_key_exists($columnName, $columnTranslations)) {
|
|
$columnTranslation = $columnTranslations[$columnName];
|
|
}
|
|
|
|
return [
|
|
'currentValue' => $value,
|
|
'pastValue' => $pastValue,
|
|
'tooltip' => Piwik::translate('General_EvolutionSummaryGeneric', [
|
|
$currentValueFormatted . ' ' . $columnTranslation,
|
|
$currentPrettyDate,
|
|
$pastValueFormatted . ' ' . $columnTranslation,
|
|
$lastPrettyDate,
|
|
CalculateEvolutionFilter::calculate($value, $pastValue, $precision = 1)
|
|
]),
|
|
];
|
|
};
|
|
}
|
|
} elseif ($view->isViewDataTableId(Evolution::ID)) {
|
|
if (!empty($idSite) && Piwik::isUserHasWriteAccess($idSite)) {
|
|
$view->config->title_edit_entity_url = 'index.php' . Url::getCurrentQueryStringWithParametersModified([
|
|
'module' => 'Goals',
|
|
'action' => 'manage',
|
|
'forceView' => null,
|
|
'viewDataTable' => null,
|
|
'showtitle' => null,
|
|
'random' => null,
|
|
'format_metrics' => 0
|
|
]);
|
|
}
|
|
|
|
$goal = $this->getGoal($idGoal);
|
|
if (!empty($goal['name'])) {
|
|
$view->config->title = Piwik::translate('Goals_GoalX', "'" . $goal['name'] . "'");
|
|
if (!empty($goal['description'])) {
|
|
$view->config->description = $goal['description'];
|
|
}
|
|
} else {
|
|
$view->config->title = Piwik::translate('General_EvolutionOverPeriod');
|
|
}
|
|
|
|
if (empty($view->config->columns_to_display)) {
|
|
$view->config->columns_to_display = ['nb_conversions'];
|
|
}
|
|
}
|
|
}
|
|
|
|
public function configureReportMetadata(&$availableReports, $infos)
|
|
{
|
|
if (!$this->isEnabled()) {
|
|
return;
|
|
}
|
|
|
|
parent::configureReportMetadata($availableReports, $infos);
|
|
|
|
$this->addReportMetadataForEachGoal($availableReports, $infos, function ($goal) {
|
|
return Piwik::translate('Goals_GoalX', $goal['name']);
|
|
}, $isSummary = true);
|
|
}
|
|
}
|