16 import(
'classes.plugins.PubIdPlugin');
23 public function register($category, $path, $mainContextId =
null) {
24 $success = parent::register($category, $path, $mainContextId);
25 if (!
Config::getVar(
'general',
'installed') || defined(
'RUNNING_UPGRADE'))
return $success;
26 if ($success && $this->
getEnabled($mainContextId)) {
28 HookRegistry::register(
'Publication::getProperties::summaryProperties', array($this,
'modifyObjectProperties'));
29 HookRegistry::register(
'Publication::getProperties::fullProperties', array($this,
'modifyObjectProperties'));
33 HookRegistry::register(
'Galley::getProperties::summaryProperties', array($this,
'modifyObjectProperties'));
51 return __(
'plugins.pubIds.doi.displayName');
58 return __(
'plugins.pubIds.doi.description');
69 return $pubIdPrefix .
'/' . $pubIdSuffix;
90 return 'Digital Object Identifier';
97 return 'https://doi.org/'.$this->_doiURLEncode($pubId);
118 $this->
import(
'classes.form.DOISettingsForm');
126 return array(
'doiSuffix');
154 $linkActions = array();
155 import(
'lib.pkp.classes.linkAction.request.RemoteActionConfirmationModal');
157 $userVars =
$request->getUserVars();
158 $userVars[
'pubIdPlugIn'] = get_class($this);
160 $linkActions[
'clearPubIdLinkActionDoi'] =
new LinkAction(
164 __(
'plugins.pubIds.doi.editor.clearObjectsDoi.confirm'),
166 $request->url(
null,
null,
'clearPubId',
null, $userVars),
169 __(
'plugins.pubIds.doi.editor.clearObjectsDoi'),
171 __(
'plugins.pubIds.doi.editor.clearObjectsDoi')
174 if (is_a($pubObject,
'Issue')) {
176 $linkActions[
'clearIssueObjectsPubIdsLinkActionDoi'] =
new LinkAction(
177 'clearObjectsPubIds',
180 __(
'plugins.pubIds.doi.editor.clearIssueObjectsDoi.confirm'),
182 $request->url(
null,
null,
'clearIssueObjectsPubIds',
null, $userVars),
185 __(
'plugins.pubIds.doi.editor.clearIssueObjectsDoi'),
187 __(
'plugins.pubIds.doi.editor.clearIssueObjectsDoi')
199 'Issue' =>
'doiIssueSuffixPattern',
200 'Publication' =>
'doiPublicationSuffixPattern',
201 'Representation' =>
'doiRepresentationSuffixPattern'
209 return array(
'pub-id::doi');
216 return (
boolean) $this->
getSetting($contextId,
"enable${pubObjectType}Doi");
223 return __(
'plugins.pubIds.doi.editor.doiSuffixCustomIdentifierNotUnique');
230 return preg_match(
'/^\d+(.\d+)+\//', $pubId);
245 $citationData = $args[0];
250 if ($issue && $issue->getPublished()) {
251 $pubId = $article->getStoredPubId($this->
getPubIdType());
260 $citationData->DOI = $pubId;
273 $search = array (
'%',
'"',
'#',
' ',
'<',
'>',
'{');
274 $replace = array (
'%25',
'%22',
'%23',
'%20',
'%3c',
'%3e',
'%7b');
275 $pubId = str_replace($search, $replace, $pubId);
290 if (empty($props[
'pub-id::doi'])) {
294 if ($action === VALIDATE_ACTION_ADD) {
295 $submission =
Services::get(
'submission')->get($props[
'submissionId']);
297 $publication =
Services::get(
'publication')->get($props[
'id']);
298 $submission =
Services::get(
'submission')->get($publication->getData(
'submissionId'));
301 $contextId = $submission->getData(
'contextId');
302 $doiPrefix = $this->
getSetting($contextId,
'doiPrefix');
305 if (strpos($props[
'pub-id::doi'], $doiPrefix) !== 0) {
306 $doiErrors[] = __(
'plugins.pubIds.doi.editor.missingPrefix', [
'doiPrefix' => $doiPrefix]);
308 if (!$this->
checkDuplicate($props[
'pub-id::doi'],
'Publication', $submission->getId(), $contextId)) {
311 if (!empty($doiErrors)) {
312 $errors[
'pub-id::doi'] = $doiErrors;
332 $props[] =
'pub-id::doi';
354 if (get_class($object) ===
'IssueGalley') {
359 if (get_class($object) ===
'Publication' || get_class($object) ===
'ArticleGalley') {
363 if (in_array(
'pub-id::doi', $props)) {
365 $values[
'pub-id::doi'] = $pubId ? $pubId :
null;
377 if ($form->id !==
'publicationIdentifiers') {
381 if (!$this->
getSetting($form->submissionContext->getId(),
'enablePublicationDoi')) {
385 $prefix = $this->
getSetting($form->submissionContext->getId(),
'doiPrefix');
387 $suffixType = $this->
getSetting($form->submissionContext->getId(),
'doiSuffix');
389 if ($suffixType ===
'default') {
390 $pattern =
'%j.v%vi%i.%a';
391 } elseif ($suffixType ===
'pattern') {
392 $pattern = $this->
getSetting($form->submissionContext->getId(),
'doiPublicationSuffixPattern');
397 $form->addField(
new \
PKP\components\forms\
FieldText(
'pub-id::doi', [
398 'label' => __(
'metadata.property.displayName.doi'),
399 'description' => __(
'plugins.pubIds.doi.editor.doi.description', [
'prefix' => $prefix]),
400 'value' => $form->publication->getData(
'pub-id::doi'),
404 'label' => __(
'metadata.property.displayName.doi'),
405 'value' => $form->publication->getData(
'pub-id::doi'),
407 'pattern' => $pattern,
410 'submissionId' => $form->publication->getData(
'submissionId'),
411 'assignIdLabel' => __(
'plugins.pubIds.doi.editor.doi.assignDoi'),
412 'clearIdLabel' => __(
'plugins.pubIds.doi.editor.clearObjectsDoi'),
414 if ($form->publication->getData(
'pub-id::publisher-id')) {
415 $fieldData[
'publisherId'] = $form->publication->getData(
'pub-id::publisher-id');
417 if ($form->publication->getData(
'pages')) {
418 $fieldData[
'pages'] = $form->publication->getData(
'pages');
420 if ($form->publication->getData(
'issueId')) {
421 $issue =
Services::get(
'issue')->get($form->publication->getData(
'issueId'));
423 $fieldData[
'issueNumber'] = $issue->getNumber() ??
'';
424 $fieldData[
'issueVolume'] = $issue->getVolume() ??
'';
425 $fieldData[
'year'] = $issue->getYear() ??
'';
428 if ($suffixType ===
'default') {
429 $fieldData[
'missingPartsLabel'] = __(
'plugins.pubIds.doi.editor.missingIssue');
431 $fieldData[
'missingPartsLabel'] = __(
'plugins.pubIds.doi.editor.missingParts');
433 $form->addField(
new \
PKP\components\forms\
FieldPubId(
'pub-id::doi', $fieldData));
445 if ($form->id !==
'publish' || !empty($form->errors)) {
449 $submission =
Services::get(
'submission')->get($form->publication->getData(
'submissionId'));
450 $publicationDoiEnabled = $this->
getSetting($submission->getData(
'contextId'),
'enablePublicationDoi');
451 $galleyDoiEnabled = $this->
getSetting($submission->getData(
'contextId'),
'enableRepresentationDoi');
452 $warningIconHtml =
'<span class="fa fa-exclamation-triangle pkpIcon--inline"></span>';
454 if (!$publicationDoiEnabled && !$galleyDoiEnabled) {
458 }
else if (!$galleyDoiEnabled) {
459 if ($form->publication->getData(
'pub-id::doi')) {
460 $msg = __(
'plugins.pubIds.doi.editor.preview.publication', [
'doi' => $form->publication->getData(
'pub-id::doi')]);
462 $msg =
'<div class="pkpNotification pkpNotification--warning">' . $warningIconHtml . __(
'plugins.pubIds.doi.editor.preview.publication.none') .
'</div>';
464 $form->addField(
new \
PKP\components\forms\
FieldHTML(
'doi', [
465 'description' => $msg,
466 'groupId' =>
'default',
473 if ($publicationDoiEnabled) {
474 if ($form->publication->getData(
'pub-id::doi')) {
475 $doiTableRows[] = [$form->publication->getData(
'pub-id::doi'),
'Publication'];
477 $doiTableRows[] = [$warningIconHtml . __(
'submission.status.unassigned'),
'Publication'];
480 if ($galleyDoiEnabled) {
481 foreach ((array) $form->publication->getData(
'galleys') as $galley) {
482 if ($galley->getStoredPubId(
'doi')) {
483 $doiTableRows[] = [$galley->getStoredPubId(
'doi'), __(
'plugins.pubIds.doi.editor.preview.galleys', [
'galleyLabel' => $galley->getGalleyLabel()])];
485 $doiTableRows[] = [$warningIconHtml . __(
'submission.status.unassigned'),__(
'plugins.pubIds.doi.editor.preview.galleys', [
'galleyLabel' => $galley->getGalleyLabel()])];
489 if (!empty($doiTableRows)) {
490 $table =
'<table class="pkpTable"><thead><tr>' .
491 '<th>' . __(
'plugins.pubIds.doi.editor.doi') .
'</th>' .
492 '<th>' . __(
'plugins.pubIds.doi.editor.preview.objects') .
'</th>' .
493 '</tr></thead><tbody>';
494 foreach ($doiTableRows as $doiTableRow) {
495 $table .=
'<tr><td>' . $doiTableRow[0] .
'</td><td>' . $doiTableRow[1] .
'</td></tr>';
497 $table .=
'</tbody></table>';
499 $form->addField(
new \
PKP\components\forms\
FieldHTML(
'doi', [
500 'description' => $table,
501 'groupId' =>
'default',