195 lines
6.4 KiB
PHP
195 lines
6.4 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file pages/stats/StatsHandler.php
|
|
*
|
|
* Copyright (c) 2013-2021 Simon Fraser University
|
|
* Copyright (c) 2003-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class StatsHandler
|
|
*
|
|
* @ingroup pages_stats
|
|
*
|
|
* @brief Handle requests for statistics pages.
|
|
*/
|
|
|
|
namespace APP\pages\stats;
|
|
|
|
use APP\core\Application;
|
|
use APP\core\Request;
|
|
use APP\core\Services;
|
|
use APP\facades\Repo;
|
|
use APP\template\TemplateManager;
|
|
use PKP\core\PKPApplication;
|
|
use PKP\pages\stats\PKPStatsHandler;
|
|
use PKP\plugins\Hook;
|
|
use PKP\security\Role;
|
|
use PKP\statistics\PKPStatisticsHelper;
|
|
|
|
class StatsHandler extends PKPStatsHandler
|
|
{
|
|
/**
|
|
* Constructor.
|
|
*/
|
|
public function __construct()
|
|
{
|
|
parent::__construct();
|
|
$this->addRoleAssignment(
|
|
[Role::ROLE_ID_SITE_ADMIN, Role::ROLE_ID_MANAGER, Role::ROLE_ID_SUB_EDITOR],
|
|
['issues']
|
|
);
|
|
Hook::add('TemplateManager::display', [$this, 'addSectionFilters']);
|
|
}
|
|
|
|
/**
|
|
* Display issues stats
|
|
*
|
|
*/
|
|
public function issues(array $args, Request $request): void
|
|
{
|
|
$dispatcher = $request->getDispatcher();
|
|
$context = $request->getContext();
|
|
|
|
if (!$context) {
|
|
$dispatcher->handle404();
|
|
}
|
|
|
|
$templateMgr = TemplateManager::getManager($request);
|
|
$this->setupTemplate($request);
|
|
|
|
$dateStart = date('Y-m-d', strtotime('-31 days'));
|
|
$dateEnd = date('Y-m-d', strtotime('yesterday'));
|
|
$count = 30;
|
|
|
|
$timeline = Services::get('issueStats')->getTimeline(PKPStatisticsHelper::STATISTICS_DIMENSION_DAY, [
|
|
'assocTypes' => [Application::ASSOC_TYPE_ISSUE],
|
|
'contextIds' => [$context->getId()],
|
|
'count' => $count,
|
|
'dateStart' => $dateStart,
|
|
'dateEnd' => $dateEnd,
|
|
]);
|
|
|
|
$statsComponent = new \APP\components\StatsIssuePage(
|
|
$dispatcher->url($request, PKPApplication::ROUTE_API, $context->getPath(), 'stats/issues'),
|
|
[
|
|
'timeline' => $timeline,
|
|
'timelineInterval' => PKPStatisticsHelper::STATISTICS_DIMENSION_DAY,
|
|
'timelineType' => 'toc',
|
|
'tableColumns' => [
|
|
[
|
|
'name' => 'title',
|
|
'label' => __('issue.issue'),
|
|
],
|
|
[
|
|
'name' => 'tocViews',
|
|
'label' => __('stats.views'),
|
|
'value' => 'tocViews',
|
|
],
|
|
[
|
|
'name' => 'issueGalleyViews',
|
|
'label' => __('stats.downloads'),
|
|
'value' => 'issueGalleyViews',
|
|
],
|
|
[
|
|
'name' => 'total',
|
|
'label' => __('stats.total'),
|
|
'value' => 'totalViews',
|
|
'orderBy' => 'totalViews',
|
|
'initialOrderDirection' => true,
|
|
],
|
|
],
|
|
'count' => $count,
|
|
'dateStart' => $dateStart,
|
|
'dateEnd' => $dateEnd,
|
|
'dateRangeOptions' => [
|
|
[
|
|
'dateStart' => $dateStart,
|
|
'dateEnd' => $dateEnd,
|
|
'label' => __('stats.dateRange.last30Days'),
|
|
],
|
|
[
|
|
'dateStart' => date('Y-m-d', strtotime('-91 days')),
|
|
'dateEnd' => $dateEnd,
|
|
'label' => __('stats.dateRange.last90Days'),
|
|
],
|
|
[
|
|
'dateStart' => date('Y-m-d', strtotime('-12 months')),
|
|
'dateEnd' => $dateEnd,
|
|
'label' => __('stats.dateRange.last12Months'),
|
|
],
|
|
[
|
|
'dateStart' => '',
|
|
'dateEnd' => '',
|
|
'label' => __('stats.dateRange.allDates'),
|
|
],
|
|
],
|
|
'orderBy' => 'total',
|
|
'orderDirection' => true,
|
|
]
|
|
);
|
|
$templateMgr->setState($statsComponent->getConfig());
|
|
$templateMgr->assign([
|
|
'pageComponent' => 'StatsIssuesPage',
|
|
'pageTitle' => __('stats.issueStats'),
|
|
'pageWidth' => TemplateManager::PAGE_WIDTH_WIDE
|
|
]);
|
|
|
|
$templateMgr->display('stats/issues.tpl');
|
|
}
|
|
|
|
/**
|
|
* Add OJS-specific configuration options to the stats component data
|
|
*
|
|
* Fired when the `TemplateManager::display` hook is called.
|
|
*
|
|
* @param array $args [$templateMgr, $template, $sendContentType, $charset, $output]
|
|
*/
|
|
public function addSectionFilters($hookName, $args)
|
|
{
|
|
$templateMgr = $args[0];
|
|
$template = $args[1];
|
|
|
|
if (!in_array($template, ['stats/publications.tpl', 'stats/editorial.tpl'])) {
|
|
return;
|
|
}
|
|
|
|
$context = Application::get()->getRequest()->getContext();
|
|
|
|
$filters = $templateMgr->getState('filters');
|
|
if (is_null($filters)) {
|
|
$filters = [];
|
|
}
|
|
$sections = Repo::section()->getSectionList($context->getId());
|
|
$filters[] = [
|
|
'heading' => __('section.sections'),
|
|
'filters' => array_map(function ($section) {
|
|
return [
|
|
'param' => 'sectionIds',
|
|
'value' => (int) $section['id'],
|
|
'title' => $section['title'],
|
|
];
|
|
}, $sections),
|
|
];
|
|
if ($template == 'stats/publications.tpl') {
|
|
$issues = Repo::issue()->getCollector()
|
|
->filterByContextIds([$context->getId()])
|
|
->filterByPublished(true)
|
|
->getMany();
|
|
$filters[] = [
|
|
'heading' => __('issue.issues'),
|
|
'filters' => $issues->map(function ($issue, $key) {
|
|
return [
|
|
'param' => 'issueIds',
|
|
'value' => (int) $issue->getId(),
|
|
'title' => $issue->getIssueIdentification(),
|
|
];
|
|
})->toArray(),
|
|
];
|
|
}
|
|
$templateMgr->setState([
|
|
'filters' => $filters
|
|
]);
|
|
}
|
|
}
|