diff options
Diffstat (limited to 'plugins/CoreVisualizations/Visualizations/Sparklines.php')
-rw-r--r-- | plugins/CoreVisualizations/Visualizations/Sparklines.php | 170 |
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']); + } } |