self::NEW_VISITOR_SEGMENT, self::RETURNING_COLUMN_SUFFIX => self::RETURNING_VISITOR_SEGMENT ); $columns = Piwik::getArrayFromApiParameter($columns); /** @var \Piwik\DataTable\DataTableInterface $resultSet */ if ($idSite === 'all') { $resultSet = new DataTable\Map(); $resultSet->setKeyName('idSite'); } else if (Period::isMultiplePeriod($date, $period)) { $resultSet = new DataTable\Map(); $resultSet->setKeyName('period'); } else { $resultSet = new DataTable\Simple(); } foreach ($visitTypes as $columnSuffix => $visitorTypeSegment) { $modifiedSegment = Segment::combine($segment, SegmentExpression::AND_DELIMITER, $visitorTypeSegment); $columnsForVisitType = empty($columns) ? array() : $this->unprefixColumns($columns, $columnSuffix); // Only make the API call if either $columns is empty (i.e. no list of columns was passed in, so we // should fetch all columns) or if one of the columns that was passed in is for this visitor type if (!empty($columns) && empty($columnsForVisitType)) { continue; } $params = array( 'idSite' => $idSite, 'period' => $period, 'date' => $date, 'segment' => $modifiedSegment, 'columns' => implode(',', $columnsForVisitType), 'format' => 'original', 'format_metrics' => 0 ); /** @var \Piwik\DataTable\Map $response */ $response = Request::processRequest('VisitsSummary.get', $params); $this->prefixColumns($response, $period, $columnSuffix); if ($resultSet === null) { $resultSet = $response; } else { $merger = new MergeDataTables(); $merger->mergeDataTables($resultSet, $response); } } return $resultSet; } protected function unprefixColumns(array $requestedColumns, $suffix) { $result = array(); foreach ($requestedColumns as $column) { if (strpos($column, $suffix) !== false) { $result[] = str_replace($suffix, '', $column); } } return $result; } protected function prefixColumns($table, $period, $suffix) { $rename = array(); foreach ($table->getColumns() as $oldColumn) { $rename[$oldColumn] = $oldColumn . $suffix; } $table->filter('ReplaceColumnNames', array($rename)); } }