Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/CoreVisualizations/Visualizations/Sparklines.php')
-rw-r--r--plugins/CoreVisualizations/Visualizations/Sparklines.php170
1 files changed, 149 insertions, 21 deletions
diff --git a/plugins/CoreVisualizations/Visualizations/Sparklines.php b/plugins/CoreVisualizations/Visualizations/Sparklines.php
index 2d11723bef..c3d8556e00 100644
--- a/plugins/CoreVisualizations/Visualizations/Sparklines.php
+++ b/plugins/CoreVisualizations/Visualizations/Sparklines.php
@@ -8,10 +8,14 @@
*/
namespace Piwik\Plugins\CoreVisualizations\Visualizations;
+use Piwik\API\Request;
use Piwik\Common;
use Piwik\DataTable;
use Piwik\Metrics;
+use Piwik\Period\Factory;
use Piwik\Plugin\ViewDataTable;
+use Piwik\Plugins\API\Filter\DataComparisonFilter;
+use Piwik\SettingsPiwik;
use Piwik\Url;
use Piwik\View;
@@ -48,6 +52,11 @@ class Sparklines extends ViewDataTable
return new Sparklines\Config();
}
+ public function supportsComparison()
+ {
+ return true;
+ }
+
/**
* @see ViewDataTable::main()
* @return mixed
@@ -82,6 +91,7 @@ class Sparklines extends ViewDataTable
$view->titleAttributes = $this->config->title_attributes;
$view->footerMessage = $this->config->show_footer_message;
$view->areSparklinesLinkable = $this->config->areSparklinesLinkable();
+ $view->isComparing = $this->isComparing();
$view->title = '';
if ($this->config->show_title) {
@@ -103,13 +113,35 @@ class Sparklines extends ViewDataTable
}
}
- $translations = $this->config->translations;
-
$firstRow = $data->getFirstRow();
+ $comparisons = $firstRow->getComparisons();
+
+ $originalDate = Common::getRequestVar('date');
+ $originalPeriod = Common::getRequestVar('period');
+
+ if ($this->isComparing() && !empty($comparisons)) {
+ $comparisonRows = [];
+ foreach ($comparisons->getRows() as $comparisonRow) {
+ $segment = $comparisonRow->getMetadata('compareSegment');
+ if ($segment === false) {
+ $segment = Request::getRawSegmentFromRequest() ?: '';;
+ }
- foreach ($this->config->getSparklineMetrics() as $sparklineMetric) {
+ $date = $comparisonRow->getMetadata('compareDate');
+ $period = $comparisonRow->getMetadata('comparePeriod');
+
+ $comparisonRows[$segment][$period][$date] = $comparisonRow;
+ }
+ }
+
+ foreach ($this->config->getSparklineMetrics() as $sparklineMetricIndex => $sparklineMetric) {
$column = $sparklineMetric['columns'];
$order = $sparklineMetric['order'];
+ $graphParams = $sparklineMetric['graphParams'];
+
+ if (!isset($order)) {
+ $order = 1000;
+ }
if ($column === 'label') {
continue;
@@ -120,31 +152,87 @@ class Sparklines extends ViewDataTable
continue;
}
- if (!is_array($column)) {
- $column = array($column);
- }
+ $sparklineUrlParams = array(
+ 'columns' => $column,
+ 'module' => $this->requestConfig->getApiModuleToRequest(),
+ 'action' => $this->requestConfig->getApiMethodToRequest()
+ );
+
+ if ($this->isComparing() && !empty($comparisons)) {
+ $periodObj = Factory::build($originalPeriod, $originalDate);
+
+ $sparklineUrlParams['compareSegments'] = [];
+
+ $comparePeriods = $data->getMetadata('comparePeriods');
+ $compareDates = $data->getMetadata('compareDates');
+
+ $compareSegments = $data->getMetadata('compareSegments');
+ foreach ($compareSegments as $segmentIndex => $segment) {
+ $metrics = [];
+ $seriesIndices = [];
- $values = array();
- $descriptions = array();
+ foreach ($comparePeriods as $periodIndex => $period) {
+ $date = $compareDates[$periodIndex];
- foreach ($column as $col) {
- $value = $firstRow->getColumn($col);
+ $compareRow = $comparisonRows[$segment][$period][$date];
+ $segmentPretty = $compareRow->getMetadata('compareSegmentPretty');
+ $periodPretty = $compareRow->getMetadata('comparePeriodPretty');
- if ($value === false) {
- $value = 0;
+ $columnToUse = $this->removeUniqueVisitorsIfNotEnabledForPeriod($column, $period);
+ list($compareValues, $compareDescriptions, $evolutions) = $this->getValuesAndDescriptions($compareRow, $columnToUse);
+
+ foreach ($compareValues as $i => $value) {
+ $metricInfo = [
+ 'value' => $value,
+ 'description' => $compareDescriptions[$i],
+ 'group' => $periodPretty,
+ ];
+
+ if ($periodIndex > 0
+ && isset($evolutions[$i])
+ ) {
+ $metricInfo['evolution'] = $evolutions[$i];
+ }
+
+ $metrics[] = $metricInfo;
+ }
+
+ $seriesIndices[] = DataComparisonFilter::getComparisonSeriesIndex($data, $periodIndex, $segmentIndex);
+ }
+
+ // only set the title (which is the segment) if comparing more than one segment
+ $title = count($compareSegments) > 1 ? $segmentPretty : null;
+
+ $params = array_merge($sparklineUrlParams, [
+ 'segment' => $segment,
+ 'period' => $periodObj->getLabel(),
+ 'date' => $periodObj->getRangeString(),
+ ]);
+ $this->config->addSparkline($params, $metrics, $desc = null, null, ($order * 100) + $segmentIndex, $title, $sparklineMetricIndex, $seriesIndices, $graphParams);
}
+ } else {
+ list($values, $descriptions) = $this->getValuesAndDescriptions($firstRow, $column);
- $values[] = $value;
- $descriptions[] = isset($translations[$col]) ? $translations[$col] : $col;
- }
+ $metrics = [];
+ foreach ($values as $i => $value) {
+ $newMetric = [
+ 'value' => $value,
+ 'description' => $descriptions[$i],
+ ];
- $sparklineUrlParams = array(
- 'columns' => $column,
- 'module' => $this->requestConfig->getApiModuleToRequest(),
- 'action' => $this->requestConfig->getApiMethodToRequest()
- );
+ $metrics[] = $newMetric;
+ }
- $this->config->addSparkline($sparklineUrlParams, $values, $descriptions, null, $order);
+ $evolution = null;
+
+ $computeEvolution = $this->config->compute_evolution;
+ if ($computeEvolution) {
+ $evolution = $computeEvolution(array_combine($column, $values));
+ $newMetric['evolution'] = $evolution;
+ }
+
+ $this->config->addSparkline($sparklineUrlParams, $metrics, $desc = null, $evolution, $order, $title = null, $group = $sparklineMetricIndex, $seriesIndices = null, $graphParams);
+ }
}
}
@@ -161,4 +249,44 @@ class Sparklines extends ViewDataTable
$table->applyQueuedFilters();
}
+
+ private function getValuesAndDescriptions(DataTable\Row $firstRow, $columns)
+ {
+ if (!is_array($columns)) {
+ $columns = array($columns);
+ }
+
+ $translations = $this->config->translations;
+
+ $values = array();
+ $descriptions = array();
+ $evolutions = [];
+
+ foreach ($columns as $col) {
+ $value = $firstRow->getColumn($col);
+
+ if ($value === false) {
+ $value = 0;
+ }
+
+ $evolution = $firstRow->getColumn($col . '_change'); // for comparison rows
+ if ($evolution !== false) {
+ $evolutions[] = ['percent' => ltrim($evolution, '+'), 'tooltip' => ''];
+ }
+
+ $values[] = $value;
+ $descriptions[] = isset($translations[$col]) ? $translations[$col] : $col;
+ }
+
+ return [$values, $descriptions, $evolutions];
+ }
+
+ private function removeUniqueVisitorsIfNotEnabledForPeriod($columns, $period)
+ {
+ if (SettingsPiwik::isUniqueVisitorsEnabled($period)) {
+ return $columns;
+ }
+
+ return array_diff($columns, ['nb_users', 'nb_uniq_visitors']);
+ }
}