diff options
Diffstat (limited to 'plugins/CoreVisualizations/JqplotDataGenerator.php')
-rw-r--r-- | plugins/CoreVisualizations/JqplotDataGenerator.php | 142 |
1 files changed, 115 insertions, 27 deletions
diff --git a/plugins/CoreVisualizations/JqplotDataGenerator.php b/plugins/CoreVisualizations/JqplotDataGenerator.php index d725d22b04..e120764005 100644 --- a/plugins/CoreVisualizations/JqplotDataGenerator.php +++ b/plugins/CoreVisualizations/JqplotDataGenerator.php @@ -10,11 +10,16 @@ namespace Piwik\Plugins\CoreVisualizations; use Exception; +use Piwik\API\Request; use Piwik\Common; use Piwik\DataTable; +use Piwik\DataTable\Row; use Piwik\Metrics; +use Piwik\Period\Factory; use Piwik\Piwik; +use Piwik\Plugins\API\Filter\DataComparisonFilter; use Piwik\Plugins\CoreVisualizations\JqplotDataGenerator\Chart; +use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph; require_once PIWIK_INCLUDE_PATH . '/plugins/CoreVisualizations/JqplotDataGenerator/Evolution.php'; @@ -26,7 +31,7 @@ require_once PIWIK_INCLUDE_PATH . '/plugins/CoreVisualizations/JqplotDataGenerat class JqplotDataGenerator { /** - * View properties. @see Piwik\ViewDataTable for more info. + * View properties. @see \Piwik\ViewDataTable for more info. * * @var array */ @@ -34,6 +39,15 @@ class JqplotDataGenerator protected $graphType; + protected $isComparing; + + private $availableSegments; + + /** + * @var JqplotGraph + */ + protected $graph; + /** * Creates a new JqplotDataGenerator instance for a graph type and view properties. * @@ -42,14 +56,14 @@ class JqplotDataGenerator * @throws \Exception * @return JqplotDataGenerator */ - public static function factory($type, $properties) + public static function factory($type, $properties, JqplotGraph $graph) { switch ($type) { case 'evolution': - return new JqplotDataGenerator\Evolution($properties, $type); + return new JqplotDataGenerator\Evolution($properties, $type, $graph); case 'pie': case 'bar': - return new JqplotDataGenerator($properties, $type); + return new JqplotDataGenerator($properties, $type, $graph); default: throw new Exception("Unknown JqplotDataGenerator type '$type'."); } @@ -63,10 +77,14 @@ class JqplotDataGenerator * * @internal param \Piwik\Plugin\ViewDataTable $visualization */ - public function __construct($properties, $graphType) + public function __construct($properties, $graphType, JqplotGraph $graph) { $this->properties = $properties; $this->graphType = $graphType; + $this->isComparing = $graph->isComparing(); + $this->graph = $graph; + + $this->availableSegments = Request::processRequest('SegmentEditor.getAll', $override = [], $default = []); } /** @@ -80,12 +98,6 @@ class JqplotDataGenerator $visualization = new Chart(); if ($dataTable->getRowsCount() > 0) { - // if addTotalRow was called in GenerateGraphHTML, add a row containing totals of - // different metrics - if ($this->properties['add_total_row']) { - $dataTable->queueFilter('AddSummaryRow', Piwik::translate('General_Total')); - } - $dataTable->applyQueuedFilters(); $this->initChartObjectData($dataTable, $visualization); } @@ -101,47 +113,123 @@ class JqplotDataGenerator { $xLabels = $dataTable->getColumn('label'); - $columnNames = $this->properties['columns_to_display']; - if (($labelColumnIndex = array_search('label', $columnNames)) !== false) { - unset($columnNames[$labelColumnIndex]); + $columnsToDisplay = array_values($this->properties['columns_to_display']); + if (($labelColumnIndex = array_search('label', $columnsToDisplay)) !== false) { + unset($columnsToDisplay[$labelColumnIndex]); } - $columnNameToTranslation = $columnNameToValue = array(); - foreach ($columnNames as $columnName) { - $columnNameToTranslation[$columnName] = @$this->properties['translations'][$columnName]; - - $columnNameToValue[$columnName] = $dataTable->getColumn($columnName); + $seriesMetadata = null; + if ($this->isComparing) { + list($yLabels, $serieses, $seriesMetadata) = $this->getComparisonTableSerieses($dataTable, $columnsToDisplay); + } else { + list($yLabels, $serieses) = $this->getMainTableSerieses($dataTable, $columnsToDisplay); } $visualization->dataTable = $dataTable; $visualization->properties = $this->properties; $visualization->setAxisXLabels($xLabels); - $visualization->setAxisYValues($columnNameToValue); - $visualization->setAxisYLabels($columnNameToTranslation); + $visualization->setAxisYValues($serieses, $seriesMetadata); + $visualization->setAxisYLabels($yLabels); - $units = $this->getUnitsForColumnsToDisplay(); + $units = $this->getUnitsForSerieses($yLabels); $visualization->setAxisYUnits($units); } - protected function getUnitsForColumnsToDisplay() + private function getMainTableSerieses(DataTable $dataTable, $columnNames) + { + $columnNameToTranslation = []; + + foreach ($columnNames as $columnName) { + $columnNameToTranslation[$columnName] = @$this->properties['translations'][$columnName]; + } + + $columnNameToValue = array(); + foreach ($columnNames as $columnName) { + $columnNameToValue[$columnName] = $dataTable->getColumn($columnName); + } + + return [$columnNameToTranslation, $columnNameToValue]; + } + + private function getComparisonTableSerieses(DataTable $dataTable, $columnsToDisplay) + { + $seriesLabels = []; + $serieses = []; + $seriesMetadata = []; + + $seriesIndices = []; + + foreach ($dataTable->getRows() as $row) { + /** @var DataTable $comparisonTable */ + $comparisonTable = $row->getComparisons(); + if (empty($comparisonTable)) { + continue; + } + + foreach ($comparisonTable->getRows() as $index => $compareRow) { + foreach ($columnsToDisplay as $columnIndex => $columnName) { + $seriesId = $columnName . '|' . $index; + + if (!isset($seriesIndices[$seriesId])) { + $seriesIndices[$seriesId] = count($seriesIndices); + } + + $seriesLabel = $this->getComparisonSeriesLabel($compareRow, $columnName); + $seriesLabels[$seriesId] = $seriesLabel; + $serieses[$seriesId][] = $compareRow->getColumn($columnName); + + $seriesMetadata[$seriesId] = [ + 'seriesIndex' => $seriesIndices[$seriesId], + 'metricIndex' => $columnIndex, + ]; + } + } + } + + return [$seriesLabels, $serieses, $seriesMetadata]; + } + + protected function getComparisonSeriesLabel(Row $compareRow, $columnName, $rowLabel = false) + { + return $this->getComparisonSeriesLabelFromCompareSeries($compareRow->getMetadata('compareSeriesPretty'), $columnName, $rowLabel); + } + + protected function getComparisonSeriesLabelFromCompareSeries($compareSeriesPretty, $columnName, $rowLabel = false) + { + $columnTranslation = @$this->properties['translations'][$columnName]; + + if (empty($rowLabel)) { + $label = $columnTranslation; + } else { + $label = "$rowLabel ($columnTranslation)"; + } + + $label .= ' ' . $compareSeriesPretty; + return $label; + } + + protected function getUnitsForSerieses($yLabels) { // derive units from column names - $units = $this->deriveUnitsFromRequestedColumnNames(); + $units = $this->deriveUnitsFromRequestedColumnNames($yLabels); if (!empty($this->properties['y_axis_unit'])) { $units = array_fill(0, count($units), $this->properties['y_axis_unit']); } return $units; } - private function deriveUnitsFromRequestedColumnNames() + private function deriveUnitsFromRequestedColumnNames($yLabels) { $idSite = Common::getRequestVar('idSite', null, 'int'); $units = array(); - foreach ($this->properties['columns_to_display'] as $columnName) { + foreach ($yLabels as $seriesId => $ignore) { + $parts = explode('|', $seriesId, 2); + $columnName = $parts[0]; + $derivedUnit = Metrics::getUnit($columnName, $idSite); - $units[$columnName] = empty($derivedUnit) ? false : $derivedUnit; + $units[$seriesId] = empty($derivedUnit) ? false : $derivedUnit; } return $units; } |