190 lines
7.3 KiB
PHP
190 lines
7.3 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file plugins/generic/usageEvent/UsageEventPlugin.php
|
|
*
|
|
* Copyright (c) 2014-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 UsageEventPlugin
|
|
*
|
|
* @ingroup plugins_generic_usageEvent
|
|
*
|
|
* @brief Implement application specifics for generating usage events.
|
|
*/
|
|
|
|
namespace APP\plugins\generic\usageEvent;
|
|
|
|
use APP\core\Application;
|
|
use APP\facades\Repo;
|
|
use APP\submission\Submission;
|
|
|
|
class UsageEventPlugin extends \PKP\plugins\generic\usageEvent\PKPUsageEventPlugin
|
|
{
|
|
//
|
|
// Implement methods from PKPUsageEventPlugin.
|
|
//
|
|
/**
|
|
* @copydoc PKPUsageEventPlugin::getEventHooks()
|
|
*/
|
|
public function getEventHooks()
|
|
{
|
|
return array_merge(parent::getEventHooks(), [
|
|
'ArticleHandler::download',
|
|
'IssueHandler::download',
|
|
'HtmlArticleGalleyPlugin::articleDownload',
|
|
'HtmlArticleGalleyPlugin::articleDownloadFinished',
|
|
'LensGalleyPlugin::articleDownloadFinished'
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* @copydoc PKPUsageEventPlugin::getDownloadFinishedEventHooks()
|
|
*/
|
|
protected function getDownloadFinishedEventHooks()
|
|
{
|
|
return array_merge(parent::getDownloadFinishedEventHooks(), [
|
|
'HtmlArticleGalleyPlugin::articleDownloadFinished',
|
|
'LensGalleyPlugin::articleDownloadFinished'
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* @copydoc PKPUsageEventPlugin::getUSageEventData()
|
|
*/
|
|
protected function getUsageEventData($hookName, $hookArgs, $request, $router, $templateMgr, $context)
|
|
{
|
|
[$pubObject, $downloadSuccess, $assocType, $idParams, $canonicalUrlPage, $canonicalUrlOp, $canonicalUrlParams] =
|
|
parent::getUsageEventData($hookName, $hookArgs, $request, $router, $templateMgr, $context);
|
|
|
|
if (!$pubObject) {
|
|
switch ($hookName) {
|
|
// Press index page, issue content page and article abstract.
|
|
case 'TemplateManager::display':
|
|
$page = $router->getRequestedPage($request);
|
|
$op = $router->getRequestedOp($request);
|
|
$args = $router->getRequestedArgs($request);
|
|
|
|
$wantedPages = ['issue', 'article'];
|
|
$wantedOps = ['index', 'view'];
|
|
|
|
if (!in_array($page, $wantedPages) || !in_array($op, $wantedOps)) {
|
|
break;
|
|
}
|
|
|
|
// View requests with 1 argument might relate to journal
|
|
// or article. With more than 1 is related either with a
|
|
// version of the submission abstract page or
|
|
// with other objects that we are not interested in or
|
|
// that are counted using a different hook.
|
|
// If the operation is 'view' and the arguments count > 1
|
|
// the arguments must be: $submissionId/version/$publicationId.
|
|
if ($op == 'view' && count($args) > 1) {
|
|
if ($args[1] !== 'version') {
|
|
break;
|
|
} elseif (count($args) != 3) {
|
|
break;
|
|
}
|
|
$publicationId = (int) $args[2];
|
|
}
|
|
|
|
|
|
$journal = $templateMgr->getTemplateVars('currentContext');
|
|
$issue = $templateMgr->getTemplateVars('issue');
|
|
$submission = $templateMgr->getTemplateVars('article');
|
|
|
|
// No published objects, no usage event.
|
|
if (!$journal && !$issue && !$submission) {
|
|
break;
|
|
}
|
|
|
|
if ($journal) {
|
|
$pubObject = $journal;
|
|
$assocType = Application::ASSOC_TYPE_JOURNAL;
|
|
$canonicalUrlOp = '';
|
|
}
|
|
|
|
if ($issue) {
|
|
$pubObject = $issue;
|
|
$assocType = Application::ASSOC_TYPE_ISSUE;
|
|
$canonicalUrlParams = [$issue->getId()];
|
|
$idParams = ['s' . $issue->getId()];
|
|
}
|
|
|
|
if ($submission) {
|
|
$pubObject = $submission;
|
|
$assocType = Application::ASSOC_TYPE_SUBMISSION;
|
|
$canonicalUrlParams = [$pubObject->getId()];
|
|
$idParams = ['m' . $pubObject->getId()];
|
|
if (isset($publicationId)) {
|
|
// no need to check if the publication exists (for the submission),
|
|
// 404 would be returned and the usage event would not be there
|
|
$canonicalUrlParams = [$pubObject->getId(), 'version', $publicationId];
|
|
}
|
|
}
|
|
|
|
$downloadSuccess = true;
|
|
$canonicalUrlOp = $op;
|
|
break;
|
|
|
|
// Issue galley.
|
|
case 'IssueHandler::download':
|
|
$assocType = Application::ASSOC_TYPE_ISSUE_GALLEY;
|
|
$issue = $hookArgs[0];
|
|
$galley = $hookArgs[1];
|
|
$canonicalUrlOp = 'download';
|
|
$canonicalUrlParams = [$issue->getId(), $galley->getId()];
|
|
$idParams = ['i' . $issue->getId(), 'f' . $galley->getId()];
|
|
$downloadSuccess = false;
|
|
$pubObject = $galley;
|
|
break;
|
|
|
|
// Article file.
|
|
case 'ArticleHandler::download':
|
|
case 'HtmlArticleGalleyPlugin::articleDownload':
|
|
case 'LensGalleyPlugin::articleDownloadFinished':
|
|
$assocType = Application::ASSOC_TYPE_SUBMISSION_FILE;
|
|
$article = $hookArgs[0];
|
|
$galley = $hookArgs[1];
|
|
$submissionFileId = $hookArgs[2];
|
|
// if file is not a galley file (e.g. CSS or images), there is no usage event.
|
|
if ($galley->getData('submissionFileId') != $submissionFileId) {
|
|
return false;
|
|
}
|
|
$canonicalUrlOp = 'download';
|
|
$canonicalUrlParams = [$article->getId(), $galley->getId(), $submissionFileId];
|
|
$idParams = ['a' . $article->getId(), 'g' . $galley->getId(), 'f' . $submissionFileId];
|
|
$downloadSuccess = false;
|
|
$pubObject = Repo::submissionFile()->get($submissionFileId);
|
|
break;
|
|
default:
|
|
// Why are we called from an unknown hook?
|
|
assert(false);
|
|
}
|
|
}
|
|
|
|
return [$pubObject, $downloadSuccess, $assocType, $idParams, $canonicalUrlPage, $canonicalUrlOp, $canonicalUrlParams];
|
|
}
|
|
|
|
/**
|
|
* @see PKPUsageEventPlugin::getHtmlPageAssocTypes()
|
|
*/
|
|
protected function getHtmlPageAssocTypes()
|
|
{
|
|
return [
|
|
Application::ASSOC_TYPE_JOURNAL,
|
|
Application::ASSOC_TYPE_ISSUE,
|
|
Application::ASSOC_TYPE_SUBMISSION,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @see PKPUsageEventPlugin::isPubIdObjectType()
|
|
*/
|
|
protected function isPubIdObjectType($pubObject)
|
|
{
|
|
return $pubObject instanceof Submission;
|
|
}
|
|
}
|