/** * Get report generator form object. * @return ReportGeneratorForm */ function &_getReportGeneratorForm($request) { $router = $request->getRouter(); $context = $router->getContext($request); $metricType = $request->getUserVar('metricType'); if (!$metricType) { $metricType = $context->getDefaultMetricType(); } $statsHelper = new StatisticsHelper(); $reportPlugin = $statsHelper->getReportPluginByMetricType($metricType); if (!is_scalar($metricType) || !$reportPlugin) { fatalError('Invalid metric type.'); } $columns = $reportPlugin->getColumns($metricType); $columns = array_flip(array_intersect(array_flip($statsHelper->getColumnNames()), $columns)); $optionalColumns = $reportPlugin->getOptionalColumns($metricType); $optionalColumns = array_flip(array_intersect(array_flip($statsHelper->getColumnNames()), $optionalColumns)); $objects = $reportPlugin->getObjectTypes($metricType); $objects = array_flip(array_intersect(array_flip($statsHelper->getObjectTypeString()), $objects)); $defaultReportTemplates = $reportPlugin->getDefaultReportTemplates($metricType); // If the report plugin doesn't works with the file type column, // don't load file types. if (isset($columns[STATISTICS_DIMENSION_FILE_TYPE])) { $fileTypes = $statsHelper->getFileTypeString(); } else { $fileTypes = null; } // Metric type will be presented in header, remove if any. if (isset($columns[STATISTICS_DIMENSION_METRIC_TYPE])) { unset($columns[STATISTICS_DIMENSION_METRIC_TYPE]); } $reportTemplate = $request->getUserVar('reportTemplate'); import('controllers.statistics.form.ReportGeneratorForm'); $reportGeneratorForm = new ReportGeneratorForm($columns, $optionalColumns, $objects, $fileTypes, $metricType, $defaultReportTemplates, $reportTemplate); return $reportGeneratorForm; }
/** * Generate statistics reports from passed * request arguments. * @param $args array * @param $request PKPRequest */ function generateReport($args, $request) { $this->setupTemplate($request); AppLocale::requireComponents(LOCALE_COMPONENT_PKP_SUBMISSION); $router = $request->getRouter(); $context = $router->getContext($request); import('classes.statistics.StatisticsHelper'); $statsHelper = new StatisticsHelper(); $metricType = $request->getUserVar('metricType'); if (is_null($metricType)) { $metricType = $context->getDefaultMetricType(); } // Generates only one metric type report at a time. if (is_array($metricType)) { $metricType = current($metricType); } if (!is_scalar($metricType)) { $metricType = null; } $reportPlugin = $statsHelper->getReportPluginByMetricType($metricType); if (!$reportPlugin || is_null($metricType)) { $request->redirect(null, null, 'tools', 'statistics'); } $columns = $request->getUserVar('columns'); $filters = unserialize($request->getUserVar('filters')); if (!$filters) { $filters = $request->getUserVar('filters'); } $orderBy = $request->getUserVar('orderBy'); if ($orderBy) { $orderBy = unserialize($orderBy); if (!$orderBy) { $orderBy = $request->getUserVar('orderBy'); } } else { $orderBy = array(); } $metrics = $reportPlugin->getMetrics($metricType, $columns, $filters, $orderBy); $allColumnNames = $statsHelper->getColumnNames(); $columnOrder = array_keys($allColumnNames); $columnNames = array(); foreach ($columnOrder as $column) { if (in_array($column, $columns)) { $columnNames[$column] = $allColumnNames[$column]; } if ($column == STATISTICS_DIMENSION_ASSOC_TYPE && in_array(STATISTICS_DIMENSION_ASSOC_ID, $columns)) { $columnNames['common.title'] = __('common.title'); } } // Make sure the metric column will always be present. if (!in_array(STATISTICS_METRIC, $columnNames)) { $columnNames[STATISTICS_METRIC] = $allColumnNames[STATISTICS_METRIC]; } header('content-type: text/comma-separated-values'); header('content-disposition: attachment; filename=statistics-' . date('Ymd') . '.csv'); $fp = fopen('php://output', 'wt'); fputcsv($fp, array($reportPlugin->getDisplayName())); fputcsv($fp, array($reportPlugin->getDescription())); fputcsv($fp, array(__('common.metric') . ': ' . $metricType)); fputcsv($fp, array(__('manager.statistics.reports.reportUrl') . ': ' . $request->getCompleteUrl())); fputcsv($fp, array('')); // Just for better displaying. $columnNames = array_merge(array(''), $columnNames); fputcsv($fp, $columnNames); foreach ($metrics as $record) { $row = array(); foreach ($columnNames as $key => $name) { if (empty($name)) { // Column just for better displaying. $row[] = ''; continue; } // Give a chance for subclasses to set the row values. if ($returner = $this->getReportRowValue($key, $record)) { $row[] = $returner; continue; } switch ($key) { case 'common.title': $assocId = $record[STATISTICS_DIMENSION_ASSOC_ID]; $assocType = $record[STATISTICS_DIMENSION_ASSOC_TYPE]; $row[] = $this->getObjectTitle($assocId, $assocType); break; case STATISTICS_DIMENSION_ASSOC_TYPE: $assocType = $record[STATISTICS_DIMENSION_ASSOC_TYPE]; $row[] = $statsHelper->getObjectTypeString($assocType); break; case STATISTICS_DIMENSION_CONTEXT_ID: $assocId = $record[STATISTICS_DIMENSION_CONTEXT_ID]; $assocType = Application::getContextAssocType(); $row[] = $this->getObjectTitle($assocId, $assocType); break; case STATISTICS_DIMENSION_SUBMISSION_ID: if (isset($record[STATISTICS_DIMENSION_SUBMISSION_ID])) { $assocId = $record[STATISTICS_DIMENSION_SUBMISSION_ID]; $assocType = ASSOC_TYPE_SUBMISSION; $row[] = $this->getObjectTitle($assocId, $assocType); } else { $row[] = ''; } break; case STATISTICS_DIMENSION_REGION: if (isset($record[STATISTICS_DIMENSION_REGION]) && isset($record[STATISTICS_DIMENSION_COUNTRY])) { $geoLocationTool = $statsHelper->getGeoLocationTool(); if ($geoLocationTool) { $regions = $geoLocationTool->getRegions($record[STATISTICS_DIMENSION_COUNTRY]); $regionId = $record[STATISTICS_DIMENSION_REGION]; if (strlen($regionId) == 1) { $regionId = '0' . $regionId; } if (isset($regions[$regionId])) { $row[] = $regions[$regionId]; break; } } } $row[] = ''; break; case STATISTICS_DIMENSION_PKP_SECTION_ID: $sectionId = null; if (isset($record[STATISTICS_DIMENSION_PKP_SECTION_ID])) { $sectionId = $record[STATISTICS_DIMENSION_PKP_SECTION_ID]; } if ($sectionId) { $row[] = $this->getObjectTitle($sectionId, ASSOC_TYPE_SECTION); } else { $row[] = ''; } break; case STATISTICS_DIMENSION_FILE_TYPE: if ($record[$key]) { $row[] = $statsHelper->getFileTypeString($record[$key]); } else { $row[] = ''; } break; default: $row[] = $record[$key]; break; } } fputcsv($fp, $row); } fclose($fp); }