KONTOLODON
/
var
/
www
/
ojs-3.3.0-13
/
plugins
/
reports
/
counter
/
classes
/
Nama File / Folder
Size
Action
COUNTER
--
NONE
reports
--
NONE
LegacyJR1.inc.php
10.537KB
Hapus
Edit
Rename
<?php /** * @file plugins/reports/counter/classes/LegacyJR1.inc.php * * Copyright (c) 2014 University of Pittsburgh * Distributed under the GNU GPL v2 or later. For full terms see the file docs/COPYING. * * @class LegacyJR1 * @ingroup plugins_reports_counter * * @brief The Legacy COUNTER JR1 (r3) report */ class LegacyJR1 { /** * @var Plugin The COUNTER report plugin. */ var $_plugin; /** * Constructor * @param Plugin $plugin */ function LegacyJR1($plugin) { $this->_plugin = $plugin; } /** * Display the JR1 (R3) report * @param $request PKPRequest */ function display($request) { $oldStats = (boolean) $request->getUserVar('useOldCounterStats'); $year = (string) $request->getUserVar('year'); $type = (string) $request->getUserVar('type'); switch ($type) { case 'report': $this->_report($request, $year, $oldStats); break; case 'reportxml': $this->_reportXml($request, $year, $oldStats); break; } } /** * Generate a report file. * @param $request PKPRequest * @param $year string * @param $useLegacyStats boolean Use the old counter plugin data. */ function _report($request, $year, $useLegacyStats) { $journal = $request->getContext(); list($begin, $end) = $this->_getLimitDates($year); header('content-type: text/comma-separated-values'); header('content-disposition: attachment; filename=counter-' . date('Ymd') . '.csv'); $fp = fopen('php://output', 'wt'); fputcsv($fp, array(__('plugins.reports.counter.1a.title1'))); fputcsv($fp, array(__('plugins.reports.counter.1a.title2', array('year' => $year)))); fputcsv($fp, array()); // FIXME: Criteria should be here? fputcsv($fp, array(__('plugins.reports.counter.1a.dateRun'))); fputcsv($fp, array(strftime("%Y-%m-%d"))); $cols = array( '', __('plugins.reports.counter.1a.publisher'), __('plugins.reports.counter.1a.platform'), __('plugins.reports.counter.1a.printIssn'), __('plugins.reports.counter.1a.onlineIssn') ); for ($i=1; $i<=12; $i++) { $time = strtotime($year . '-' . $i . '-01'); strftime('%b', $time); $cols[] = strftime('%b-%Y', $time); } $cols[] = __('plugins.reports.counter.1a.ytdTotal'); $cols[] = __('plugins.reports.counter.1a.ytdHtml'); $cols[] = __('plugins.reports.counter.1a.ytdPdf'); fputcsv($fp, $cols); // Display the totals first $totals = $this->_getMonthlyTotalRange($begin, $end, $useLegacyStats); $cols = array( __('plugins.reports.counter.1a.totalForAllJournals'), '-', // Publisher '', // Platform '-', '-' ); $this->_formColumns($cols, $totals); fputcsv($fp, $cols); // Get statistics from the log. $journalDao = DAORegistry::getDAO('JournalDAO'); /* @var $journalDao JournalDAO */ $journalIds = $this->_getJournalIds($useLegacyStats); foreach ($journalIds as $journalId) { $journal = $journalDao->getById($journalId); if (!$journal) continue; $entries = $this->_getMonthlyLogRange($journalId, $begin, $end, $useLegacyStats); $cols = array( $journal->getLocalizedName(), $journal->getData('publisherInstitution'), __('common.software'), // Platform $journal->getData('printIssn'), $journal->getData('onlineIssn') ); $this->_formColumns($cols, $entries); fputcsv($fp, $cols); unset($journal, $entry); } fclose($fp); } /** * Internal function to form some of the CSV columns * @param $cols array() by reference * @param $entries array() * $cols will be modified */ function _formColumns(&$cols, $entries) { $allMonthsTotal = 0; $currTotal = 0; $htmlTotal = 0; $pdfTotal = 0; for ($i = 1; $i <= 12; $i++) { $currTotal = 0; foreach ($entries as $entry) { $month = (int) substr($entry[STATISTICS_DIMENSION_MONTH], 4, 2); if ($i == $month) { $metric = $entry[STATISTICS_METRIC]; $currTotal += $metric; if ($entry[STATISTICS_DIMENSION_FILE_TYPE] == STATISTICS_FILE_TYPE_HTML) { $htmlTotal += $metric; } else if ($entry[STATISTICS_DIMENSION_FILE_TYPE] == STATISTICS_FILE_TYPE_PDF) { $pdfTotal += $metric; } } } $cols[]=$currTotal; $allMonthsTotal += $currTotal; } $cols[] = $allMonthsTotal; $cols[] = $htmlTotal; $cols[] = $pdfTotal; } /** * Internal function to assign information for the Counter part of a report * @param $request PKPRequest * @param $templateManager PKPTemplateManager * @param $begin string * @param $end string * @param $useLegacyStats boolean */ function _assignTemplateCounterXML($request, $templateManager, $begin, $end='', $useLegacyStats) { $journal = $request->getContext(); $journalDao = DAORegistry::getDAO('JournalDAO'); /* @var $journalDao JournalDAO */ $journalIds = $this->_getJournalIds($useLegacyStats); $site = $request->getSite(); $availableContexts = $journalDao->getAvailable(); list($firstContext, $secondContext) = [$availableContexts->next(), $availableContexts->next()]; if ($secondContext) { // Multiple contexts $vendorName = $site->getLocalizedTitle(); } else { $vendorName = $journal->getData('publisherInstitution'); if (empty($vendorName)) { $vendorName = $journal->getLocalizedName(); } } if ($end == '') $end = $begin; $i=0; foreach ($journalIds as $journalId) { $journal = $journalDao->getById($journalId); if (!$journal) continue; $entries = $this->_getMonthlyLogRange($journalId, $begin, $end, $useLegacyStats); $journalsArray[$i]['entries'] = $this->_arrangeEntries($entries); $journalsArray[$i]['journalTitle'] = $journal->getLocalizedName(); $journalsArray[$i]['publisherInstitution'] = $journal->getData('publisherInstitution'); $journalsArray[$i]['printIssn'] = $journal->getData('printIssn'); $journalsArray[$i]['onlineIssn'] = $journal->getData('onlineIssn'); $i++; } $base_url = Config::getVar('general','base_url'); $reqUser = $request->getUser(); if ($reqUser) { $templateManager->assign('reqUserName', $reqUser->getUsername()); $templateManager->assign('reqUserId', $reqUser->getId()); } else { $templateManager->assign('reqUserName', __('plugins.reports.counter.1a.anonymous')); $templateManager->assign('reqUserId', ''); } $templateManager->assign('journalsArray', $journalsArray); $templateManager->assign('vendorName', $vendorName); $templateManager->assign('base_url', $base_url); } /** * Internal function to collect structures for output * @param $entries array() */ function _arrangeEntries($entries) { $ret = array(); $i = 0; foreach ($entries as $entry) { $year = substr($entry['month'], 0, 4); $month = substr($entry['month'], 4, 2); $start = date("Y-m-d", mktime(0, 0, 0, $month, 1, $year)); $end = date("Y-m-t", mktime(0, 0, 0, $month, 1, $year)); $rangeExists = false; foreach ($ret as $key => $record) { if ($record['start'] == $start && $record['end'] == $end) { $rangeExists = true; break; } } if (!$rangeExists) { $workingKey = $i; $i++; $ret[$workingKey]['start'] = $start; $ret[$workingKey]['end'] = $end; } else { $workingKey = $key; } if (array_key_exists('count_total', $ret[$workingKey])) { $totalCount = $ret[$workingKey]['count_total']; } else { $totalCount = 0; } $ret[$workingKey]['count_total'] = $entry[STATISTICS_METRIC] + $totalCount; if ($entry[STATISTICS_DIMENSION_FILE_TYPE] == STATISTICS_FILE_TYPE_HTML) { $ret[$workingKey]['count_html'] = $entry[STATISTICS_METRIC]; } else if ($entry[STATISTICS_DIMENSION_FILE_TYPE] == STATISTICS_FILE_TYPE_PDF) { $ret[$workingKey]['count_pdf'] = $entry[STATISTICS_METRIC]; } } return $ret; } /** * Return the begin and end dates * based on the passed year. * @param $year string * @return array */ function _getLimitDates($year) { $begin = "$year-01-01"; $end = "$year-12-01"; return array($begin, $end); } /** * Get the valid journal IDs for which log entries exist in the DB. * @param $useLegacyStats boolean Use the old counter plugin data. * @return array */ function _getJournalIds($useLegacyStats = false) { $metricsDao = DAORegistry::getDAO('MetricsDAO'); /* @var $metricsDao MetricsDAO */ if ($useLegacyStats) { $results = $metricsDao->getMetrics(OJS_METRIC_TYPE_LEGACY_COUNTER, array(STATISTICS_DIMENSION_ASSOC_ID)); $fieldId = STATISTICS_DIMENSION_ASSOC_ID; } else { $filter = array(STATISTICS_DIMENSION_ASSOC_TYPE => ASSOC_TYPE_SUBMISSION_FILE); $results = $metricsDao->getMetrics(METRIC_TYPE_COUNTER, array(STATISTICS_DIMENSION_CONTEXT_ID), $filter); $fieldId = STATISTICS_DIMENSION_CONTEXT_ID; } $journalIds = array(); foreach($results as $record) { $journalIds[] = $record[$fieldId]; } return $journalIds; } /** * Retrieve a monthly log entry range. * @param $journalId int * @param $begin * @param $end * @param $useLegacyStats boolean Use the old counter plugin data. * @return 2D array */ function _getMonthlyLogRange($journalId = null, $begin, $end, $useLegacyStats = false) { $begin = date('Ym', strtotime($begin)); $end = date('Ym', strtotime($end)); $metricsDao = DAORegistry::getDAO('MetricsDAO'); /* @var $metricsDao MetricsDAO */ $columns = array(STATISTICS_DIMENSION_MONTH, STATISTICS_DIMENSION_FILE_TYPE); $filter = array( STATISTICS_DIMENSION_MONTH => array('from' => $begin, 'to' => $end) ); if ($useLegacyStats) { $dimension = STATISTICS_DIMENSION_ASSOC_ID; $metricType = OJS_METRIC_TYPE_LEGACY_COUNTER; } else { $dimension = STATISTICS_DIMENSION_CONTEXT_ID; $metricType = METRIC_TYPE_COUNTER; $filter[STATISTICS_DIMENSION_ASSOC_TYPE] = ASSOC_TYPE_SUBMISSION_FILE; } if ($journalId) { $columns[] = $dimension; $filter[$dimension] = $journalId; } $results = $metricsDao->getMetrics($metricType, $columns, $filter); return $results; } /** * Retrieve a monthly log entry range. * @param $begin * @param $end * @param $useLegacyStats boolean Use the old counter plugin data. * @return 2D array */ function _getMonthlyTotalRange($begin, $end, $useLegacyStats = false) { return $this->_getMonthlyLogRange(null, $begin, $end, $useLegacyStats); } /** * * Counter report in XML * @param $request PKPRequest * @param $year string * @param $useLegacyStats boolean */ function _reportXML($request, $year, $useLegacyStats) { $templateManager = TemplateManager::getManager(); list($begin, $end) = $this->_getLimitDates($year); $this->_assignTemplateCounterXML($request, $templateManager, $begin, $end, $useLegacyStats); $reportContents = $templateManager->fetch($this->_plugin->getTemplateResource('reportxml.tpl')); header('Content-type: text/xml'); echo $reportContents; } }