Open Preprint Systems  3.3.0
DOIPubIdPlugin.inc.php
1 <?php
2 
16 import('classes.plugins.PubIdPlugin');
17 
18 class DOIPubIdPlugin extends PubIdPlugin {
19 
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)) {
27  HookRegistry::register('CitationStyleLanguage::citation', array($this, 'getCitationData'));
28  HookRegistry::register('Publication::getProperties::summaryProperties', array($this, 'modifyObjectProperties'));
29  HookRegistry::register('Publication::getProperties::fullProperties', array($this, 'modifyObjectProperties'));
30  HookRegistry::register('Publication::validate', array($this, 'validatePublicationDoi'));
31  HookRegistry::register('Galley::getProperties::summaryProperties', array($this, 'modifyObjectProperties'));
32  HookRegistry::register('Galley::getProperties::fullProperties', array($this, 'modifyObjectProperties'));
33  HookRegistry::register('Publication::getProperties::values', array($this, 'modifyObjectPropertyValues'));
34  HookRegistry::register('Galley::getProperties::values', array($this, 'modifyObjectPropertyValues'));
35  HookRegistry::register('Form::config::before', array($this, 'addPublicationFormFields'));
36  HookRegistry::register('Form::config::before', array($this, 'addPublishFormNotice'));
37  }
38  return $success;
39  }
40 
41  //
42  // Implement template methods from Plugin.
43  //
47  function getDisplayName() {
48  return __('plugins.pubIds.doi.displayName');
49  }
50 
54  function getDescription() {
55  return __('plugins.pubIds.doi.description');
56  }
57 
58 
59  //
60  // Implement template methods from PubIdPlugin.
61  //
65  function constructPubId($pubIdPrefix, $pubIdSuffix, $contextId) {
66  return $pubIdPrefix . '/' . $pubIdSuffix;
67  }
68 
72  function getPubIdType() {
73  return 'doi';
74  }
75 
79  function getPubIdDisplayType() {
80  return 'DOI';
81  }
82 
86  function getPubIdFullName() {
87  return 'Digital Object Identifier';
88  }
89 
93  function getResolvingURL($contextId, $pubId) {
94  return 'https://doi.org/'.$this->_doiURLEncode($pubId);
95  }
96 
100  function getPubIdMetadataFile() {
101  return $this->getTemplateResource('doiSuffixEdit.tpl');
102  }
103 
107  function getPubIdAssignFile() {
108  return $this->getTemplateResource('doiAssign.tpl');
109  }
110 
114  function instantiateSettingsForm($contextId) {
115  $this->import('classes.form.DOISettingsForm');
116  return new DOISettingsForm($this, $contextId);
117  }
118 
122  function getFormFieldNames() {
123  return array('doiSuffix');
124  }
125 
130  return 'assignDoi';
131  }
132 
136  function getPrefixFieldName() {
137  return 'doiPrefix';
138  }
139 
143  function getSuffixFieldName() {
144  return 'doiSuffix';
145  }
146 
150  function getLinkActions($pubObject) {
151  $linkActions = array();
152  import('lib.pkp.classes.linkAction.request.RemoteActionConfirmationModal');
153  $request = Application::get()->getRequest();
154  $userVars = $request->getUserVars();
155  $userVars['pubIdPlugIn'] = get_class($this);
156  // Clear object pub id
157  $linkActions['clearPubIdLinkActionDoi'] = new LinkAction(
158  'clearPubId',
160  $request->getSession(),
161  __('plugins.pubIds.doi.editor.clearObjectsDoi.confirm'),
162  __('common.delete'),
163  $request->url(null, null, 'clearPubId', null, $userVars),
164  'modal_delete'
165  ),
166  __('plugins.pubIds.doi.editor.clearObjectsDoi'),
167  'delete',
168  __('plugins.pubIds.doi.editor.clearObjectsDoi')
169  );
170 
171  return $linkActions;
172  }
173 
178  return array(
179  'Publication' => 'doiPublicationSuffixPattern',
180  'Representation' => 'doiRepresentationSuffixPattern'
181  );
182  }
183 
187  function getDAOFieldNames() {
188  return array('pub-id::doi');
189  }
190 
194  function isObjectTypeEnabled($pubObjectType, $contextId) {
195  return (boolean) $this->getSetting($contextId, "enable${pubObjectType}Doi");
196  }
197 
201  function getNotUniqueErrorMsg() {
202  return __('plugins.pubIds.doi.editor.doiSuffixCustomIdentifierNotUnique');
203  }
204 
208  function validatePubId($pubId) {
209  return preg_match('/^\d+(.\d+)+\//', $pubId);
210  }
211 
212  /*
213  * Public methods
214  */
223  public function getCitationData($hookname, $args) {
224  $citationData = $args[0];
225  $article = $args[2];
226  #$issue = $args[3];
227  $journal = $args[4];
228 
229  if (!$this->getPubId($article)) {
230  return;
231  }
232 
233  $citationData->DOI = $pubId;
234  }
235 
236 
237  /*
238  * Private methods
239  */
245  function _doiURLEncode($pubId) {
246  $search = array ('%', '"', '#', ' ', '<', '>', '{');
247  $replace = array ('%25', '%22', '%23', '%20', '%3c', '%3e', '%7b');
248  $pubId = str_replace($search, $replace, $pubId);
249  return $pubId;
250  }
251 
258  public function validatePublicationDoi($hookName, $args) {
259  $errors =& $args[0];
260  $action = $args[1];
261  $props =& $args[2];
262 
263  if (empty($props['pub-id::doi'])) {
264  return;
265  }
266 
267  if ($action === VALIDATE_ACTION_ADD) {
268  $submission = Services::get('submission')->get($props['submissionId']);
269  } else {
270  $publication = Services::get('publication')->get($props['id']);
271  $submission = Services::get('submission')->get($publication->getData('submissionId'));
272  }
273 
274  $contextId = $submission->getData('contextId');
275  $doiPrefix = $this->getSetting($contextId, 'doiPrefix');
276 
277  $doiErrors = [];
278  if (strpos($props['pub-id::doi'], $doiPrefix) !== 0) {
279  $doiErrors[] = __('plugins.pubIds.doi.editor.missingPrefix', ['doiPrefix' => $doiPrefix]);
280  }
281  if (!$this->checkDuplicate($props['pub-id::doi'], 'Publication', $submission->getId(), $contextId)) {
282  $doiErrors[] = $this->getNotUniqueErrorMsg();
283  }
284  if (!empty($doiErrors)) {
285  $errors['pub-id::doi'] = $doiErrors;
286  }
287  }
288 
302  public function modifyObjectProperties($hookName, $args) {
303  $props =& $args[0];
304 
305  $props[] = 'pub-id::doi';
306  }
307 
321  public function modifyObjectPropertyValues($hookName, $args) {
322  $values =& $args[0];
323  $object = $args[1];
324  $props = $args[2];
325 
326  // DOIs are already added to property values for Publications and Galleys
327  if (get_class($object) === 'Publication' || get_class($object) === 'ArticleGalley') {
328  return;
329  }
330 
331  if (in_array('pub-id::doi', $props)) {
332  $pubId = $this->getPubId($object);
333  $values['pub-id::doi'] = $pubId ? $pubId : null;
334  }
335  }
336 
343  public function addPublicationFormFields($hookName, $form) {
344 
345  if ($form->id !== 'publicationIdentifiers') {
346  return;
347  }
348 
349  if (!$this->getSetting($form->submissionContext->getId(), 'enablePublicationDoi')) {
350  return;
351  }
352 
353  $prefix = $this->getSetting($form->submissionContext->getId(), 'doiPrefix');
354 
355  $suffixType = $this->getSetting($form->submissionContext->getId(), 'doiSuffix');
356  $pattern = '';
357  if ($suffixType === 'default') {
358  $pattern = '%j.%a';
359  } elseif ($suffixType === 'pattern') {
360  $pattern = $this->getSetting($form->submissionContext->getId(), 'doiPublicationSuffixPattern');
361  }
362 
363  // Add a text field to enter the DOI if no pattern exists
364  if (!$pattern) {
365  $form->addField(new \PKP\components\forms\FieldText('pub-id::doi', [
366  'label' => __('metadata.property.displayName.doi'),
367  'description' => __('plugins.pubIds.doi.editor.doi.description', ['prefix' => $prefix]),
368  'value' => $form->publication->getData('pub-id::doi'),
369  ]));
370  } else {
371  $fieldData = [
372  'label' => __('metadata.property.displayName.doi'),
373  'value' => $form->publication->getData('pub-id::doi'),
374  'prefix' => $prefix,
375  'pattern' => $pattern,
376  'contextInitials' => PKPString::regexp_replace('/[^A-Za-z0-9]/', '', PKPString::strtolower($form->submissionContext->getData('acronym', $form->submissionContext->getData('primaryLocale')))) ?? '',
377  'separator' => '/',
378  'submissionId' => $form->publication->getData('submissionId'),
379  'publicationId' => $form->publication->getId(),
380  'i18n' => [
381  'assignId' => __('plugins.pubIds.doi.editor.doi.assignDoi'),
382  'clearId' => __('plugins.pubIds.doi.editor.clearObjectsDoi'),
383  'missingParts' => __('plugins.pubIds.doi.editor.missingParts'),
384  ]
385  ];
386  if ($form->publication->getData('pub-id::publisher-id')) {
387  $fieldData['publisherId'] = $form->publication->getData('pub-id::publisher-id');
388  }
389  $form->addField(new \PKP\components\forms\FieldPubId('pub-id::doi', $fieldData));
390  }
391  }
392 
399  public function addPublishFormNotice($hookName, $form) {
400 
401  if ($form->id !== 'publish' || !empty($form->errors)) {
402  return;
403  }
404 
405  $submission = Services::get('submission')->get($form->publication->getData('submissionId'));
406  $publicationDoiEnabled = $this->getSetting($submission->getData('contextId'), 'enablePublicationDoi');
407  $galleyDoiEnabled = $this->getSetting($submission->getData('contextId'), 'enableRepresentationDoi');
408  $warningIconHtml = '<span class="fa fa-exclamation-triangle pkpIcon--inline"></span>';
409 
410  if (!$publicationDoiEnabled && !$galleyDoiEnabled) {
411  return;
412 
413  // Use a simplified view when only assigning to the publication
414  } else if (!$galleyDoiEnabled) {
415  if ($form->publication->getData('pub-id::doi')) {
416  $msg = __('plugins.pubIds.doi.editor.preview.publication', ['doi' => $form->publication->getData('pub-id::doi')]);
417  } else {
418  $msg = '<div class="pkpNotification pkpNotification--warning">' . $warningIconHtml . __('plugins.pubIds.doi.editor.preview.publication.none') . '</div>';
419  }
420  $form->addField(new \PKP\components\forms\FieldHTML('doi', [
421  'description' => $msg,
422  'groupId' => 'default',
423  ]));
424  return;
425 
426  // Show a table if more than one DOI is going to be created
427  } else {
428  $doiTableRows = [];
429  if ($publicationDoiEnabled) {
430  if ($form->publication->getData('pub-id::doi')) {
431  $doiTableRows[] = [$form->publication->getData('pub-id::doi'), 'Publication'];
432  } else {
433  $doiTableRows[] = [$warningIconHtml . __('submission.status.unassigned'), 'Publication'];
434  }
435  }
436  if ($galleyDoiEnabled) {
437  foreach ((array) $form->publication->getData('galleys') as $galley) {
438  if ($galley->getStoredPubId('doi')) {
439  $doiTableRows[] = [$galley->getStoredPubId('doi'), __('plugins.pubIds.doi.editor.preview.galleys', ['galleyLabel' => $galley->getGalleyLabel()])];
440  } else {
441  $doiTableRows[] = [$warningIconHtml . __('submission.status.unassigned'),__('plugins.pubIds.doi.editor.preview.galleys', ['galleyLabel' => $galley->getGalleyLabel()])];
442  }
443  }
444  }
445  if (!empty($doiTableRows)) {
446  $table = '<table class="pkpTable"><thead><tr>' .
447  '<th>' . __('plugins.pubIds.doi.editor.doi') . '</th>' .
448  '<th>' . __('plugins.pubIds.doi.editor.preview.objects') . '</th>' .
449  '</tr></thead><tbody>';
450  foreach ($doiTableRows as $doiTableRow) {
451  $table .= '<tr><td>' . $doiTableRow[0] . '</td><td>' . $doiTableRow[1] . '</td></tr>';
452  }
453  $table .= '</tbody></table>';
454  }
455  $form->addField(new \PKP\components\forms\FieldHTML('doi', [
456  'description' => $table,
457  'groupId' => 'default',
458  ]));
459  }
460  }
461 }
DOIPubIdPlugin\getResolvingURL
getResolvingURL($contextId, $pubId)
Definition: DOIPubIdPlugin.inc.php:93
DOIPubIdPlugin\getCitationData
getCitationData($hookname, $args)
Definition: DOIPubIdPlugin.inc.php:223
DOIPubIdPlugin\getPubIdType
getPubIdType()
Definition: DOIPubIdPlugin.inc.php:72
DOIPubIdPlugin\getDAOFieldNames
getDAOFieldNames()
Definition: DOIPubIdPlugin.inc.php:187
PKPString\regexp_replace
static regexp_replace($pattern, $replacement, $subject, $limit=-1)
Definition: PKPString.inc.php:279
RemoteActionConfirmationModal
Class defining a simple confirmation modal with a remote action and ok/cancel buttons.
Definition: RemoteActionConfirmationModal.inc.php:18
PKP
FieldPubId
A field for generating a pub id, like a DOI.
DOISettingsForm
Form for journal managers to setup DOI plugin.
Definition: DOISettingsForm.inc.php:19
PubIdPlugin
Public identifiers plugins common functions.
Definition: PubIdPlugin.inc.php:18
DOIPubIdPlugin\_doiURLEncode
_doiURLEncode($pubId)
Definition: DOIPubIdPlugin.inc.php:245
DOIPubIdPlugin\getNotUniqueErrorMsg
getNotUniqueErrorMsg()
Definition: DOIPubIdPlugin.inc.php:201
DOIPubIdPlugin\getPubIdDisplayType
getPubIdDisplayType()
Definition: DOIPubIdPlugin.inc.php:79
DOIPubIdPlugin\addPublicationFormFields
addPublicationFormFields($hookName, $form)
Definition: DOIPubIdPlugin.inc.php:343
DOIPubIdPlugin\getSuffixFieldName
getSuffixFieldName()
Definition: DOIPubIdPlugin.inc.php:143
DOIPubIdPlugin\modifyObjectPropertyValues
modifyObjectPropertyValues($hookName, $args)
Definition: DOIPubIdPlugin.inc.php:321
DOIPubIdPlugin\addPublishFormNotice
addPublishFormNotice($hookName, $form)
Definition: DOIPubIdPlugin.inc.php:399
DOIPubIdPlugin\instantiateSettingsForm
instantiateSettingsForm($contextId)
Definition: DOIPubIdPlugin.inc.php:114
Plugin\getEnabled
getEnabled()
Definition: Plugin.inc.php:868
DOIPubIdPlugin\getFormFieldNames
getFormFieldNames()
Definition: DOIPubIdPlugin.inc.php:122
Plugin\getSetting
getSetting($contextId, $name)
Definition: Plugin.inc.php:473
Config\getVar
static getVar($section, $key, $default=null)
Definition: Config.inc.php:35
PKPPubIdPlugin\checkDuplicate
checkDuplicate($pubId, $pubObjectType, $excludeId, $contextId)
Definition: PKPPubIdPlugin.inc.php:414
LinkAction
Base class defining an action that can be performed by the user in the user interface.
Definition: LinkAction.inc.php:22
DOIPubIdPlugin\validatePubId
validatePubId($pubId)
Definition: DOIPubIdPlugin.inc.php:208
DOIPubIdPlugin\getPubIdAssignFile
getPubIdAssignFile()
Definition: DOIPubIdPlugin.inc.php:107
DOIPubIdPlugin\getSuffixPatternsFieldNames
getSuffixPatternsFieldNames()
Definition: DOIPubIdPlugin.inc.php:177
PubIdPlugin\getPubId
getPubId($pubObject)
Definition: PubIdPlugin.inc.php:84
DOIPubIdPlugin\validatePublicationDoi
validatePublicationDoi($hookName, $args)
Definition: DOIPubIdPlugin.inc.php:258
DOIPubIdPlugin\getPubIdMetadataFile
getPubIdMetadataFile()
Definition: DOIPubIdPlugin.inc.php:100
DOIPubIdPlugin
DOI plugin class.
Definition: DOIPubIdPlugin.inc.php:18
DOIPubIdPlugin\getPrefixFieldName
getPrefixFieldName()
Definition: DOIPubIdPlugin.inc.php:136
Plugin\getTemplateResource
getTemplateResource($template=null, $inCore=false)
Definition: Plugin.inc.php:349
PKPString\strtolower
static strtolower($string)
Definition: PKPString.inc.php:169
Plugin\$request
$request
Definition: Plugin.inc.php:68
HookRegistry\register
static register($hookName, $callback, $hookSequence=HOOK_SEQUENCE_NORMAL)
Definition: HookRegistry.inc.php:70
DOIPubIdPlugin\modifyObjectProperties
modifyObjectProperties($hookName, $args)
Definition: DOIPubIdPlugin.inc.php:302
DOIPubIdPlugin\isObjectTypeEnabled
isObjectTypeEnabled($pubObjectType, $contextId)
Definition: DOIPubIdPlugin.inc.php:194
FieldText
A basic text field in a form.
DOIPubIdPlugin\getPubIdFullName
getPubIdFullName()
Definition: DOIPubIdPlugin.inc.php:86
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
DOIPubIdPlugin\getDescription
getDescription()
Definition: DOIPubIdPlugin.inc.php:54
DOIPubIdPlugin\constructPubId
constructPubId($pubIdPrefix, $pubIdSuffix, $contextId)
Definition: DOIPubIdPlugin.inc.php:65
FieldHTML
A component for inserting HTML into a form, when you don't need any input fields or values stored.
DOIPubIdPlugin\getDisplayName
getDisplayName()
Definition: DOIPubIdPlugin.inc.php:47
DOIPubIdPlugin\getAssignFormFieldName
getAssignFormFieldName()
Definition: DOIPubIdPlugin.inc.php:129
DOIPubIdPlugin\getLinkActions
getLinkActions($pubObject)
Definition: DOIPubIdPlugin.inc.php:150
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49