Open Monograph Press  3.3.0
DOIPubIdPlugin.inc.php
1 <?php
2 
17 import('classes.plugins.PubIdPlugin');
18 
19 class DOIPubIdPlugin extends PubIdPlugin {
20 
24  public function register($category, $path, $mainContextId = null) {
25  $success = parent::register($category, $path, $mainContextId);
26  if (!Config::getVar('general', 'installed') || defined('RUNNING_UPGRADE')) return $success;
27  if ($success && $this->getEnabled($mainContextId)) {
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('Publication::getProperties::values', array($this, 'modifyObjectPropertyValues'));
32  HookRegistry::register('Form::config::before', array($this, 'addPublicationFormFields'));
33  HookRegistry::register('Form::config::before', array($this, 'addPublishFormNotice'));
34  }
35  return $success;
36  }
37 
38  //
39  // Implement template methods from Plugin.
40  //
44  function getDisplayName() {
45  return __('plugins.pubIds.doi.displayName');
46  }
47 
51  function getDescription() {
52  return __('plugins.pubIds.doi.description');
53  }
54 
55 
56  //
57  // Implement template methods from PubIdPlugin.
58  //
62  function constructPubId($pubIdPrefix, $pubIdSuffix, $contextId) {
63  return $pubIdPrefix . '/' . $pubIdSuffix;
64  }
65 
69  function getPubIdType() {
70  return 'doi';
71  }
72 
76  function getPubIdDisplayType() {
77  return 'DOI';
78  }
79 
83  function getPubIdFullName() {
84  return 'Digital Object Identifier';
85  }
86 
90  function getResolvingURL($contextId, $pubId) {
91  return 'https://doi.org/'.$this->_doiURLEncode($pubId);
92  }
93 
97  function getPubIdMetadataFile() {
98  return $this->getTemplateResource('doiSuffixEdit.tpl');
99  }
100 
104  function getPubIdAssignFile() {
105  return $this->getTemplateResource('doiAssign.tpl');
106  }
107 
111  function instantiateSettingsForm($contextId) {
112  $this->import('classes.form.DOISettingsForm');
113  return new DOISettingsForm($this, $contextId);
114  }
115 
119  function getFormFieldNames() {
120  return array('doiSuffix');
121  }
122 
127  return 'assignDoi';
128  }
129 
133  function getPrefixFieldName() {
134  return 'doiPrefix';
135  }
136 
140  function getSuffixFieldName() {
141  return 'doiSuffix';
142  }
143 
147  function getLinkActions($pubObject) {
148  $linkActions = array();
149  import('lib.pkp.classes.linkAction.request.RemoteActionConfirmationModal');
150  $request = Application::get()->getRequest();
151  $userVars = $request->getUserVars();
152  $userVars['pubIdPlugIn'] = get_class($this);
153  // Clear object pub id
154  $linkActions['clearPubIdLinkActionDoi'] = new LinkAction(
155  'clearPubId',
157  $request->getSession(),
158  __('plugins.pubIds.doi.editor.clearObjectsDoi.confirm'),
159  __('common.delete'),
160  $request->url(null, null, 'clearPubId', null, $userVars),
161  'modal_delete'
162  ),
163  __('plugins.pubIds.doi.editor.clearObjectsDoi'),
164  'delete',
165  __('plugins.pubIds.doi.editor.clearObjectsDoi')
166  );
167  return $linkActions;
168  }
169 
174  return array(
175  'Submission' => 'doiPublicationSuffixPattern',
176  'Representation' => 'doiRepresentationSuffixPattern',
177  'SubmissionFile' => 'doiSubmissionFileSuffixPattern',
178  'Chapter' => 'doiChapterSuffixPattern',
179  );
180  }
181 
185  function getDAOFieldNames() {
186  return array('pub-id::doi');
187  }
188 
192  function isObjectTypeEnabled($pubObjectType, $contextId) {
193  return (boolean) $this->getSetting($contextId, "enable${pubObjectType}Doi");
194  }
195 
199  function getNotUniqueErrorMsg() {
200  return __('plugins.pubIds.doi.editor.doiSuffixCustomIdentifierNotUnique');
201  }
202 
206  function validatePubId($pubId) {
207  return preg_match('/^\d+(.\d+)+\//', $pubId);
208  }
209 
210 
211  /*
212  * Private methods
213  */
219  function _doiURLEncode($pubId) {
220  $search = array ('%', '"', '#', ' ', '<', '>', '{');
221  $replace = array ('%25', '%22', '%23', '%20', '%3c', '%3e', '%7b');
222  $pubId = str_replace($search, $replace, $pubId);
223  return $pubId;
224  }
225 
232  public function validatePublicationDoi($hookName, $args) {
233  $errors =& $args[0];
234  $action = $args[1];
235  $props =& $args[2];
236 
237  if (empty($props['pub-id::doi'])) {
238  return;
239  }
240 
241  if ($action === VALIDATE_ACTION_ADD) {
242  $submission = Services::get('submission')->get($props['submissionId']);
243  } else {
244  $publication = Services::get('publication')->get($props['id']);
245  $submission = Services::get('submission')->get($publication->getData('submissionId'));
246  }
247 
248  $contextId = $submission->getData('contextId');
249  $doiPrefix = $this->getSetting($contextId, 'doiPrefix');
250 
251  $doiErrors = [];
252  if (strpos($props['pub-id::doi'], $doiPrefix) !== 0) {
253  $doiErrors[] = __('plugins.pubIds.doi.editor.missingPrefix', ['doiPrefix' => $doiPrefix]);
254  }
255  if (!$this->checkDuplicate($props['pub-id::doi'], 'Publication', $submission->getId(), $contextId)) {
256  $doiErrors[] = $this->getNotUniqueErrorMsg();
257  }
258  if (!empty($doiErrors)) {
259  $errors['pub-id::doi'] = $doiErrors;
260  }
261  }
262 
276  public function modifyObjectProperties($hookName, $args) {
277  $props =& $args[0];
278 
279  $props[] = 'pub-id::doi';
280  }
281 
295  public function modifyObjectPropertyValues($hookName, $args) {
296  $values =& $args[0];
297  $object = $args[1];
298  $props = $args[2];
299 
300  if (in_array('pub-id::doi', $props)) {
301  $pubId = $this->getPubId($object);
302  $values['pub-id::doi'] = $pubId ? $pubId : null;
303  }
304  }
305 
312  public function addPublicationFormFields($hookName, $form) {
313 
314  if ($form->id !== 'publicationIdentifiers') {
315  return;
316  }
317 
318  if (!$this->getSetting($form->submissionContext->getId(), 'enablePublicationDoi')) {
319  return;
320  }
321 
322  $prefix = $this->getSetting($form->submissionContext->getId(), 'doiPrefix');
323 
324  $suffixType = $this->getSetting($form->submissionContext->getId(), 'doiSuffix');
325  $pattern = '';
326  if ($suffixType === 'default') {
327  $pattern = '%p.%m';
328  } elseif ($suffixType === 'pattern') {
329  $pattern = $this->getSetting($form->submissionContext->getId(), 'doiPublicationSuffixPattern');
330  }
331 
332  // Add a text field to enter the DOI if no pattern exists
333  if (!$pattern) {
334  $form->addField(new \PKP\components\forms\FieldText('pub-id::doi', [
335  'label' => __('metadata.property.displayName.doi'),
336  'description' => __('plugins.pubIds.doi.editor.doi.description', ['prefix' => $prefix]),
337  'value' => $form->publication->getData('pub-id::doi'),
338  ]));
339  } else {
340  $fieldData = [
341  'label' => __('metadata.property.displayName.doi'),
342  'value' => $form->publication->getData('pub-id::doi'),
343  'prefix' => $prefix,
344  'pattern' => $pattern,
345  'contextInitials' => $form->submissionContext->getData('acronym', $form->submissionContext->getData('primaryLocale')) ?? '',
346  'isPForPress' => true,
347  'separator' => '/',
348  'submissionId' => $form->publication->getData('submissionId'),
349  'assignIdLabel' => __('plugins.pubIds.doi.editor.doi.assignDoi'),
350  'clearIdLabel' => __('plugins.pubIds.doi.editor.clearObjectsDoi'),
351  'missingPartsLabel' => __('plugins.pubIds.doi.editor.missingParts'),
352  ];
353  if ($form->publication->getData('pub-id::publisher-id')) {
354  $fieldData['publisherId'] = $form->publication->getData('pub-id::publisher-id');
355  }
356  if ($form->publication->getData('pages')) {
357  $fieldData['pages'] = $form->publication->getData('pages');
358  }
359  if ($form->publication->getData('issueId')) {
360  $issue = Services::get('issue')->get($form->publication->getData('issueId'));
361  if ($issue) {
362  $fieldData['issueNumber'] = $issue->getNumber() ?? '';
363  $fieldData['issueVolume'] = $issue->getVolume() ?? '';
364  $fieldData['year'] = $issue->getYear() ?? '';
365  }
366  }
367  $form->addField(new \PKP\components\forms\FieldPubId('pub-id::doi', $fieldData));
368  }
369  }
370 
377  public function addPublishFormNotice($hookName, $form) {
378 
379  if ($form->id !== 'publish' || !empty($form->errors)) {
380  return;
381  }
382 
383  $submission = Services::get('submission')->get($form->publication->getData('submissionId'));
384  $publicationDoiEnabled = $this->getSetting($submission->getData('contextId'), 'enablePublicationDoi');
385  $chapterDoiEnabled = $this->getSetting($submission->getData('contextId'), 'enableChapterDoi');
386  $pubFormatDoiEnabled = $this->getSetting($submission->getData('contextId'), 'enableRepresentationDoi');
387  $submissionFileDoiEnabled = $this->getSetting($submission->getData('contextId'), 'enableSubmissionFileDoi');
388  $warningIconHtml = '<span class="fa fa-exclamation-triangle pkpIcon--inline"></span>';
389 
390  if (!$publicationDoiEnabled && !$chapterDoiEnabled && !$pubFormatDoiEnabled && !$submissionFileDoiEnabled) {
391  return;
392 
393  // Use a simplified view when only assigning to the publication
394  } else if (!$chapterDoiEnabled && !$pubFormatDoiEnabled && !$submissionFileDoiEnabled) {
395  if ($form->publication->getData('pub-id::doi')) {
396  $msg = __('plugins.pubIds.doi.editor.preview.publication', ['doi' => $form->publication->getData('pub-id::doi')]);
397  } else {
398  $msg = '<div class="pkpNotification pkpNotification--warning">' . $warningIconHtml . __('plugins.pubIds.doi.editor.preview.publication.none') . '</div>';
399  }
400  $form->addField(new \PKP\components\forms\FieldHTML('doi', [
401  'description' => $msg,
402  'groupId' => 'default',
403  ]));
404  return;
405 
406  // Show a table if more than one DOI is going to be created
407  } else {
408  $doiTableRows = [];
409  if ($publicationDoiEnabled) {
410  if ($form->publication->getData('pub-id::doi')) {
411  $doiTableRows[] = [$form->publication->getData('pub-id::doi'), 'Publication'];
412  } else {
413  $doiTableRows[] = [$warningIconHtml . __('submission.status.unassigned'), 'Publication'];
414  }
415  }
416  if ($chapterDoiEnabled) {
417  foreach ((array) $form->publication->getData('chapters') as $chapter) {
418  if ($chapter->getStoredPubId('doi')) {
419  $doiTableRows[] = [$chapter->getStoredPubId('doi'), __('plugins.pubIds.doi.editor.preview.chapters', ['title' => $chapter->getLocalizedFullTitle()])];
420  } else {
421  $doiTableRows[] = [$warningIconHtml . __('submission.status.unassigned'),__('plugins.pubIds.doi.editor.preview.chapters', ['title' => $chapter->getLocalizedFullTitle()])];
422  }
423  }
424  }
425  if ($pubFormatDoiEnabled) {
426  foreach ((array) $form->publication->getData('publicationFormats') as $publicationFormat) {
427  if ($publicationFormat->getStoredPubId('doi')) {
428  $doiTableRows[] = [$publicationFormat->getStoredPubId('doi'), __('plugins.pubIds.doi.editor.preview.publicationFormats', ['title' => $publicationFormat->getLocalizedName()])];
429  } else {
430  $doiTableRows[] = [$warningIconHtml . __('submission.status.unassigned'),__('plugins.pubIds.doi.editor.preview.publicationFormats', ['title' => $publicationFormat->getLocalizedName()])];
431  }
432  }
433  }
434  if ($submissionFileDoiEnabled) {
435  foreach ((array) $form->publication->getData('publicationFormats') as $publicationFormat) {
436  $files = (array) $publicationFormat->getRepresentationFiles();
437  foreach ($files as $file) {
438  if ($file->getStoredPubId('doi')) {
439  $doiTableRows[] = [$file->getStoredPubId('doi'), __('plugins.pubIds.doi.editor.preview.files', ['title' => $file->getLocalizedName()])];
440  } else {
441  $doiTableRows[] = [$warningIconHtml . __('submission.status.unassigned'),__('plugins.pubIds.doi.editor.preview.files', ['title' => $file->getLocalizedName()])];
442  }
443  }
444  }
445  }
446  if (!empty($doiTableRows)) {
447  $table = '<table class="pkpTable"><thead><tr>' .
448  '<th>' . __('plugins.pubIds.doi.editor.doi') . '</th>' .
449  '<th>' . __('plugins.pubIds.doi.editor.preview.objects') . '</th>' .
450  '</tr></thead><tbody>';
451  foreach ($doiTableRows as $doiTableRow) {
452  $table .= '<tr><td>' . $doiTableRow[0] . '</td><td>' . $doiTableRow[1] . '</td></tr>';
453  }
454  $table .= '</tbody></table>';
455  }
456  $form->addField(new \PKP\components\forms\FieldHTML('doi', [
457  'description' => $table,
458  'groupId' => 'default',
459  ]));
460  }
461  }
462 }
463 
464 
DOIPubIdPlugin\getResolvingURL
getResolvingURL($contextId, $pubId)
Definition: DOIPubIdPlugin.inc.php:90
DOIPubIdPlugin\getPubIdType
getPubIdType()
Definition: DOIPubIdPlugin.inc.php:69
DOIPubIdPlugin\getDAOFieldNames
getDAOFieldNames()
Definition: DOIPubIdPlugin.inc.php:185
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 press 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:219
DOIPubIdPlugin\getNotUniqueErrorMsg
getNotUniqueErrorMsg()
Definition: DOIPubIdPlugin.inc.php:199
PubIdPlugin\checkDuplicate
checkDuplicate($pubId, $pubObjectType, $excludeId, $contextId)
Definition: PubIdPlugin.inc.php:168
DOIPubIdPlugin\getPubIdDisplayType
getPubIdDisplayType()
Definition: DOIPubIdPlugin.inc.php:76
DOIPubIdPlugin\addPublicationFormFields
addPublicationFormFields($hookName, $form)
Definition: DOIPubIdPlugin.inc.php:312
DOIPubIdPlugin\getSuffixFieldName
getSuffixFieldName()
Definition: DOIPubIdPlugin.inc.php:140
DOIPubIdPlugin\modifyObjectPropertyValues
modifyObjectPropertyValues($hookName, $args)
Definition: DOIPubIdPlugin.inc.php:295
DOIPubIdPlugin\addPublishFormNotice
addPublishFormNotice($hookName, $form)
Definition: DOIPubIdPlugin.inc.php:377
DOIPubIdPlugin\instantiateSettingsForm
instantiateSettingsForm($contextId)
Definition: DOIPubIdPlugin.inc.php:111
Plugin\getEnabled
getEnabled()
Definition: Plugin.inc.php:868
DOIPubIdPlugin\getFormFieldNames
getFormFieldNames()
Definition: DOIPubIdPlugin.inc.php:119
Plugin\getSetting
getSetting($contextId, $name)
Definition: Plugin.inc.php:473
Config\getVar
static getVar($section, $key, $default=null)
Definition: Config.inc.php:35
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:206
DOIPubIdPlugin\getPubIdAssignFile
getPubIdAssignFile()
Definition: DOIPubIdPlugin.inc.php:104
DOIPubIdPlugin\getSuffixPatternsFieldNames
getSuffixPatternsFieldNames()
Definition: DOIPubIdPlugin.inc.php:173
PubIdPlugin\getPubId
getPubId($pubObject)
Definition: PubIdPlugin.inc.php:43
DOIPubIdPlugin\validatePublicationDoi
validatePublicationDoi($hookName, $args)
Definition: DOIPubIdPlugin.inc.php:232
DOIPubIdPlugin\getPubIdMetadataFile
getPubIdMetadataFile()
Definition: DOIPubIdPlugin.inc.php:97
DOIPubIdPlugin
DOI plugin class.
Definition: DOIPubIdPlugin.inc.php:19
DOIPubIdPlugin\getPrefixFieldName
getPrefixFieldName()
Definition: DOIPubIdPlugin.inc.php:133
Plugin\getTemplateResource
getTemplateResource($template=null, $inCore=false)
Definition: Plugin.inc.php:349
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:276
DOIPubIdPlugin\isObjectTypeEnabled
isObjectTypeEnabled($pubObjectType, $contextId)
Definition: DOIPubIdPlugin.inc.php:192
FieldText
A basic text field in a form.
DOIPubIdPlugin\getPubIdFullName
getPubIdFullName()
Definition: DOIPubIdPlugin.inc.php:83
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
DOIPubIdPlugin\getDescription
getDescription()
Definition: DOIPubIdPlugin.inc.php:51
DOIPubIdPlugin\constructPubId
constructPubId($pubIdPrefix, $pubIdSuffix, $contextId)
Definition: DOIPubIdPlugin.inc.php:62
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:44
DOIPubIdPlugin\getAssignFormFieldName
getAssignFormFieldName()
Definition: DOIPubIdPlugin.inc.php:126
DOIPubIdPlugin\getLinkActions
getLinkActions($pubObject)
Definition: DOIPubIdPlugin.inc.php:147
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49