213 lines
5.7 KiB
PHP
213 lines
5.7 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file classes/plugins/DOIPubIdExportPlugin.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 DOIPubIdExportPlugin
|
|
*
|
|
* @ingroup plugins
|
|
*
|
|
* @brief Basis class for DOI XML metadata export plugins
|
|
*/
|
|
|
|
namespace APP\plugins;
|
|
|
|
use APP\facades\Repo;
|
|
use APP\issue\Issue;
|
|
use APP\journal\Journal;
|
|
use APP\submission\Submission;
|
|
use APP\template\TemplateManager;
|
|
use PKP\core\PKPString;
|
|
use PKP\galley\Galley;
|
|
use PKP\submission\PKPSubmission;
|
|
|
|
// Configuration errors.
|
|
define('DOI_EXPORT_CONFIG_ERROR_DOIPREFIX', 0x01);
|
|
|
|
// The name of the setting used to save the registered DOI.
|
|
define('DOI_EXPORT_REGISTERED_DOI', 'registeredDoi');
|
|
|
|
abstract class DOIPubIdExportPlugin extends PubObjectsExportPlugin
|
|
{
|
|
/**
|
|
* @copydoc ImportExportPlugin::display()
|
|
*/
|
|
public function display($args, $request)
|
|
{
|
|
switch (array_shift($args)) {
|
|
case 'index':
|
|
case '':
|
|
$templateMgr = TemplateManager::getManager($request);
|
|
$templateMgr->display($this->getTemplateResource('index.tpl'));
|
|
break;
|
|
default:
|
|
parent::display($args, $request);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get pub ID type
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getPubIdType()
|
|
{
|
|
return 'doi';
|
|
}
|
|
|
|
/**
|
|
* Get pub ID display type
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getPubIdDisplayType()
|
|
{
|
|
return 'DOI';
|
|
}
|
|
|
|
/**
|
|
* Mark selected submissions or issues as registered.
|
|
*
|
|
* @param Journal $context
|
|
* @param array $objects Array of published submissions, issues or galleys
|
|
*/
|
|
public function markRegistered($context, $objects)
|
|
{
|
|
foreach ($objects as $object) {
|
|
$doiId = $object->getData('doiId');
|
|
|
|
if ($doiId != null) {
|
|
Repo::doi()->markRegistered($doiId);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Saving object's DOI to the object's
|
|
* "registeredDoi" setting.
|
|
* We prefix the setting with the plugin's
|
|
* id so that we do not get name clashes
|
|
* when several DOI registration plug-ins
|
|
* are active at the same time.
|
|
*
|
|
* @param Journal $context
|
|
* @param Issue|Submission|Galley $object
|
|
* @param string $testPrefix
|
|
*/
|
|
public function saveRegisteredDoi($context, $object, $testPrefix = '10.1234')
|
|
{
|
|
$registeredDoi = $object->getStoredPubId('doi');
|
|
assert(!empty($registeredDoi));
|
|
if ($this->isTestMode($context)) {
|
|
$registeredDoi = PKPString::regexp_replace('#^[^/]+/#', $testPrefix . '/', $registeredDoi);
|
|
}
|
|
$object->setData($this->getPluginSettingsPrefix() . '::' . DOI_EXPORT_REGISTERED_DOI, $registeredDoi);
|
|
$this->updateObject($object);
|
|
}
|
|
|
|
/**
|
|
* Get a list of additional setting names that should be stored with the objects.
|
|
*
|
|
* @return array
|
|
*/
|
|
protected function _getObjectAdditionalSettings()
|
|
{
|
|
return array_merge(parent::_getObjectAdditionalSettings(), [
|
|
$this->getPluginSettingsPrefix() . '::' . DOI_EXPORT_REGISTERED_DOI
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Get published submissions with a DOI assigned from submission IDs.
|
|
*
|
|
* @param array $submissionIds
|
|
* @param Journal $context
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getPublishedSubmissions($submissionIds, $context)
|
|
{
|
|
$allSubmissionIds = Repo::submission()
|
|
->getCollector()
|
|
->filterByContextIds([$context->getId()])
|
|
->filterByStatus([PKPSubmission::STATUS_PUBLISHED])
|
|
->getIds()
|
|
->toArray();
|
|
$validSubmissionIds = array_intersect($allSubmissionIds, $submissionIds);
|
|
$submissions = array_map(function ($submissionId) {
|
|
return Repo::submission()->get($submissionId);
|
|
}, $validSubmissionIds);
|
|
return array_filter($submissions, function ($submission) {
|
|
return $submission->getCurrentPublication()->getDoi() !== null;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Get published issues with a DOI assigned from issue IDs.
|
|
*
|
|
* @param array $issueIds
|
|
* @param Journal $context
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getPublishedIssues($issueIds, $context)
|
|
{
|
|
return Repo::issue()
|
|
->getCollector()
|
|
->filterByContextIds([$context->getId()])
|
|
->filterByIssueIds($issueIds)
|
|
->filterByPublished(true)
|
|
->filterByHasDois(true)
|
|
->getMany()
|
|
->toArray();
|
|
}
|
|
|
|
/**
|
|
* Get article galleys with a DOI assigned from galley IDs.
|
|
*
|
|
* @param array $galleyIds
|
|
* @param Journal $context
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getArticleGalleys($galleyIds, $context)
|
|
{
|
|
$allGalleyIds = Repo::galley()
|
|
->getCollector()
|
|
->filterByContextIds([$context->getId()])
|
|
->getIds()
|
|
->toArray();
|
|
$validGalleyIds = array_intersect($allGalleyIds, $galleyIds);
|
|
$galleys = array_map(function ($galleyId) {
|
|
return Repo::galley()->get($galleyId);
|
|
}, $validGalleyIds);
|
|
return array_filter($galleys, function ($galley) {
|
|
return $galley->getDoi() !== null;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @copydoc ImportExportPlugin::executeCLI()
|
|
*/
|
|
public function executeCLI($scriptName, &$args)
|
|
{
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* @copydoc ImportExportPlugin::supportsCLI()
|
|
*/
|
|
public function supportsCLI(): bool
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (!PKP_STRICT_MODE) {
|
|
class_alias('\APP\plugins\DOIPubIdExportPlugin', '\DOIPubIdExportPlugin');
|
|
}
|