/**
  * @see ReportPlugin::display()
  */
 function display($args, $request)
 {
     $router = $request->getRouter();
     $context = $router->getContext($request);
     $metricType = $this->getMetricTypes();
     import('classes.statistics.StatisticsHelper');
     $statsHelper = new StatisticsHelper();
     $columns = array_keys($statsHelper->getColumnNames());
     $reportArgs = array('metricType' => $metricType, 'columns' => $columns, 'filters' => serialize(array(STATISTICS_DIMENSION_CONTEXT_ID => $context->getId())), 'orderBy' => serialize(array(STATISTICS_DIMENSION_MONTH => STATISTICS_ORDER_ASC)));
     Request::redirect(null, null, 'tools', 'generateReport', $reportArgs);
 }
 /**
  * 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;
 }
示例#3
0
 /**
  * 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);
 }
 /**
  * @copydoc Form::fetch()
  */
 function fetch($request)
 {
     $router = $request->getRouter();
     $context = $router->getContext($request);
     $columns = $this->_columns;
     $statsHelper = new StatisticsHelper();
     $availableMetricTypeStrings = $statsHelper->getAllMetricTypeStrings();
     if (count($availableMetricTypeStrings) > 1) {
         $this->setData('metricTypeOptions', $availableMetricTypeStrings);
     }
     $reportTemplateOptions = array();
     $reportTemplates = $this->_defaultReportTemplates;
     foreach ($reportTemplates as $reportTemplate) {
         $reportTemplateOptions[] = __($reportTemplate['nameLocaleKey']);
     }
     if (!empty($reportTemplateOptions)) {
         $this->setData('reportTemplateOptions', $reportTemplateOptions);
     }
     $reportTemplateIndex = (int) $this->_reportTemplateIndex;
     if (!is_null($reportTemplateIndex) && isset($reportTemplates[$reportTemplateIndex])) {
         $reportTemplate = $reportTemplates[$reportTemplateIndex];
         $reportColumns = $reportTemplate['columns'];
         if (!is_array($reportColumns)) {
             continue;
         }
         $this->setData('columns', $reportColumns);
         $this->setData('reportTemplate', $reportTemplateIndex);
         if (isset($reportTemplate['aggregationColumns'])) {
             $aggreationColumns = $reportTemplate['aggregationColumns'];
             if (!is_array($aggreationColumns)) {
                 continue;
             }
             $aggreationOptions = $selectedAggregationOptions = array();
             foreach ($aggreationColumns as $column) {
                 $columnName = $statsHelper->getColumnNames($column);
                 if (!$columnName) {
                     continue;
                 }
                 $aggreationOptions[$column] = $columnName;
             }
             $this->setData('aggregationOptions', $aggreationOptions);
             $this->setData('selectedAggregationOptions', array_intersect($aggreationColumns, $reportColumns));
         }
         if (isset($reportTemplate['filter']) && is_array($reportTemplate['filter'])) {
             foreach ($reportTemplate['filter'] as $dimension => $filter) {
                 switch ($dimension) {
                     case STATISTICS_DIMENSION_ASSOC_TYPE:
                         $this->setData('objectTypes', $filter);
                         break;
                 }
             }
         }
     }
     $timeFilterSelectedOption = $request->getUserVar('timeFilterOption');
     if (is_null($timeFilterSelectedOption)) {
         $timeFilterSelectedOption = TIME_FILTER_OPTION_CURRENT_MONTH;
     }
     switch ($timeFilterSelectedOption) {
         case TIME_FILTER_OPTION_YESTERDAY:
             $this->setData('yesterday', true);
             break;
         case TIME_FILTER_OPTION_CURRENT_MONTH:
         default:
             $this->setData('currentMonth', true);
             break;
         case TIME_FILTER_OPTION_RANGE_DAY:
             $this->setData('byDay', true);
             break;
         case TIME_FILTER_OPTION_RANGE_MONTH:
             $this->setData('byMonth', true);
             break;
     }
     $startTime = $request->getUserDateVar('dateStart');
     $endTime = $request->getUserDateVar('dateEnd');
     if (!$startTime) {
         $startTime = time();
     }
     if (!$endTime) {
         $endTime = time();
     }
     $this->setData('dateStart', $startTime);
     $this->setData('dateEnd', $endTime);
     if (isset($columns[STATISTICS_DIMENSION_COUNTRY])) {
         $geoLocationTool = $statsHelper->getGeoLocationTool();
         if ($geoLocationTool) {
             $countryCodes = $geoLocationTool->getAllCountryCodes();
             if (!$countryCodes) {
                 $countryCodes = array();
             }
             $countryCodes = array_combine($countryCodes, $countryCodes);
             $this->setData('countriesOptions', $countryCodes);
         }
         $this->setData('showRegionInput', isset($columns[STATISTICS_DIMENSION_REGION]));
         $this->setData('showCityInput', isset($columns[STATISTICS_DIMENSION_CITY]));
     }
     $this->setData('showMonthInputs', isset($columns[STATISTICS_DIMENSION_MONTH]));
     $this->setData('showDayInputs', isset($columns[STATISTICS_DIMENSION_DAY]));
     $orderColumns = $this->_columns;
     $nonOrderableColumns = array(STATISTICS_DIMENSION_ASSOC_TYPE, STATISTICS_DIMENSION_SUBMISSION_ID, STATISTICS_DIMENSION_CONTEXT_ID, STATISTICS_DIMENSION_REGION, STATISTICS_DIMENSION_FILE_TYPE, STATISTICS_DIMENSION_METRIC_TYPE);
     foreach ($nonOrderableColumns as $column) {
         unset($orderColumns[$column]);
     }
     $this->setData('metricType', $this->_metricType);
     $this->setData('objectTypesOptions', $this->_objects);
     if ($this->_fileTypes) {
         $this->setData('fileTypesOptions', $this->_fileTypes);
     }
     $this->setData('fileAssocTypes', $this->getFileAssocTypes());
     $this->setData('orderColumnsOptions', $orderColumns);
     $this->setData('orderDirectionsOptions', array(STATISTICS_ORDER_ASC => __('manager.statistics.reports.orderDir.asc'), STATISTICS_ORDER_DESC => __('manager.statistics.reports.orderDir.desc')));
     $columnsOptions = $this->_columns;
     // Reports will always include this column.
     unset($columnsOptions[STATISTICS_METRIC]);
     $this->setData('columnsOptions', $columnsOptions);
     $this->setData('optionalColumns', $this->_optionalColumns);
     return parent::fetch($request);
 }
 /**
  * Get optional columns list.
  * @return array
  */
 function getOptionalColumnsList()
 {
     import('classes.statistics.StatisticsHelper');
     $statsHelper = new StatisticsHelper();
     $plugin = $this->plugin;
     $reportPlugin = $plugin->getReportPlugin();
     $metricType = $reportPlugin->getMetricTypes();
     $optionalColumns = $reportPlugin->getOptionalColumns($metricType);
     $columnsList = array();
     foreach ($optionalColumns as $column) {
         $columnsList[$column] = $statsHelper->getColumnNames($column);
     }
     return $columnsList;
 }
 /**
  * Get optional columns list.
  * @return array
  */
 function getOptionalColumnsList()
 {
     import('classes.statistics.StatisticsHelper');
     $statsHelper = new StatisticsHelper();
     return array(STATISTICS_DIMENSION_CITY => $statsHelper->getColumnNames(STATISTICS_DIMENSION_CITY), STATISTICS_DIMENSION_REGION => $statsHelper->getColumnNames(STATISTICS_DIMENSION_REGION));
 }