/** Get row evolution for a multiple labels */ private function getMultiRowEvolution($idSite, $period, $date, $apiModule, $apiAction, $labels, $segment, $column, $language = false, $idGoal = false, $legendAppendMetric = true, $labelUseAbsoluteUrl = true) { $actualLabels = $logos = array(); $metadata = $this->getRowEvolutionMetaData($idSite, $period, $date, $apiModule, $apiAction, $language, $idGoal); if (!isset($metadata['metrics'][$column])) { // invalid column => use the first one that's available $metrics = array_keys($metadata['metrics']); $column = reset($metrics); } // load the tables for each label $dataTablesPerLabel = array(); $dataTableMetadata = false; foreach ($labels as $labelIndex => $label) { $dataTable = $this->loadRowEvolutionDataFromAPI($idSite, $period, $date, $apiModule, $apiAction, $label, $segment, $idGoal); $dataTablesPerLabel[$labelIndex] = $dataTable->getArray(); if (!$dataTableMetadata) { $dataTableMetadata = $dataTable->metadata; } $urlFound = false; foreach ($dataTablesPerLabel[$labelIndex] as $table) { if ($table->getRowsCount() > 0) { $firstRow = $table->getFirstRow(); // in case labels were replaced in the data table (e.g. for browsers report), // display the label from the table, not the one passed as filter $columnLabel = $firstRow->getColumn('label'); if (!empty($columnLabel)) { $actualLabels[$labelIndex] = $columnLabel; } list($actualLabel, $urlFound) = $this->cleanUrlForLabel($firstRow, $apiModule, $apiAction, $labelUseAbsoluteUrl); if ($actualLabel) { $actualLabels[$labelIndex] = $actualLabel; } // Forward the logo path to display logos in multi rows comparison $logos[$labelIndex] = $firstRow->getMetadata('logo'); break; } } if (!$urlFound) { $actualLabels[$labelIndex] = str_replace(Piwik_API_DataTableManipulator_LabelFilter::SEPARATOR_RECURSIVE_LABEL, ' - ', $label); } } // combine the tables $dataTableMulti = new Piwik_DataTable_Array(); $dataTableMulti->setKeyName($dataTable->getKeyName()); $dataTableMulti->metadata = $dataTableMetadata; foreach (array_keys(reset($dataTablesPerLabel)) as $dateLabel) { $newRow = new Piwik_DataTable_Row(); foreach ($dataTablesPerLabel as $labelIndex => $tableArray) { $table = $tableArray[$dateLabel]; if ($table->getRowsCount() == 0) { $value = 0; } else { $value = $table->getFirstRow()->getColumn($column); $value = floatVal(str_replace(',', '.', $value)); if ($value == '') { $value = 0; } } // keep metric in the label so that unit (%, s, ...) can be guessed correctly $label = $column . '_' . $labelIndex; $newRow->addColumn($label, $value); } $newTable = new Piwik_DataTable(); $newTable->addRow($newRow); $dataTableMulti->addTable($newTable, $dateLabel); } // the available metrics for the report are returned as metadata / columns $metadata['columns'] = $metadata['metrics']; // metadata / metrics should document the rows that are compared // this way, UI code can be reused $metadata['metrics'] = array(); foreach ($actualLabels as $labelIndex => $label) { if ($legendAppendMetric) { $label .= ' (' . $metadata['columns'][$column] . ')'; } $metricName = $column . '_' . $labelIndex; $metadata['metrics'][$metricName] = Piwik_DataTable_Filter_SafeDecodeLabel::safeDecodeLabel($label); if (!empty($logos[$labelIndex])) { $metadata['logos'][$metricName] = $logos[$labelIndex]; } } $this->enhanceRowEvolutionMetaData($metadata, $dataTableMulti); return array('column' => $column, 'reportData' => $dataTableMulti, 'metadata' => $metadata); }
protected function handleDataTable($datatable) { // if the flag disable_generic_filters is defined we skip the generic filters if (0 == Piwik_Common::getRequestVar('disable_generic_filters', '0', 'string', $this->request)) { $genericFilter = new Piwik_API_DataTableGenericFilter($this->request); $genericFilter->filter($datatable); } // we automatically safe decode all datatable labels (against xss) $datatable->queueFilter('SafeDecodeLabel'); // if the flag disable_queued_filters is defined we skip the filters that were queued if (Piwik_Common::getRequestVar('disable_queued_filters', 'false', 'string', $this->request) == 'false') { $datatable->applyQueuedFilters(); } // apply label filter: only return a single row matching the label parameter $label = Piwik_Common::getRequestVar('label', '', 'string', $this->request); if ($label !== '') { $label = Piwik_Common::unsanitizeInputValue($label); $label = Piwik_DataTable_Filter_SafeDecodeLabel::filterValue($label); $filter = new Piwik_API_DataTableLabelFilter(); $datatable = $filter->filter($label, $datatable, $this->apiModule, $this->apiMethod, $this->request); } return $this->getRenderedDataTable($datatable); }