Example #1
0
 /** 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);
 }
Example #2
0
 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);
 }