Open Journal Systems  3.3.0
IssueGridHandler.inc.php
1 <?php
21 import('lib.pkp.classes.controllers.grid.GridHandler');
22 import('controllers.grid.issues.IssueGridRow');
23 
28  function __construct() {
29  parent::__construct();
30  $this->addRoleAssignment(
31  array(ROLE_ID_MANAGER),
32  array(
33  'fetchGrid', 'fetchRow',
34  'addIssue', 'editIssue', 'editIssueData', 'updateIssue',
35  'uploadFile', 'deleteCoverImage',
36  'issueToc',
37  'issueGalleys',
38  'deleteIssue', 'publishIssue', 'unpublishIssue', 'setCurrentIssue',
39  'identifiers', 'updateIdentifiers', 'clearPubId', 'clearIssueObjectsPubIds',
40  'access', 'updateAccess',
41  )
42  );
43  }
44 
45 
46  //
47  // Implement template methods from PKPHandler
48  //
52  function authorize($request, &$args, $roleAssignments) {
53  import('lib.pkp.classes.security.authorization.ContextAccessPolicy');
54  $this->addPolicy(new ContextAccessPolicy($request, $roleAssignments));
55 
56  // If a signoff ID was specified, authorize it.
57  if ($request->getUserVar('issueId')) {
58  import('classes.security.authorization.OjsIssueRequiredPolicy');
59  $this->addPolicy(new OjsIssueRequiredPolicy($request, $args));
60  }
61 
62  return parent::authorize($request, $args, $roleAssignments);
63  }
64 
68  function initialize($request, $args = null) {
69  parent::initialize($request, $args);
70 
71  AppLocale::requireComponents(LOCALE_COMPONENT_APP_EDITOR);
72  // Load submission-specific translations
73  AppLocale::requireComponents(LOCALE_COMPONENT_PKP_SUBMISSION);
74 
75  // Grid columns.
76  import('controllers.grid.issues.IssueGridCellProvider');
77  $issueGridCellProvider = new IssueGridCellProvider();
78 
79  // Issue identification
80  $this->addColumn(
81  new GridColumn(
82  'identification',
83  'issue.issue',
84  null,
85  null,
86  $issueGridCellProvider
87  )
88  );
89 
90  $this->_addCenterColumns($issueGridCellProvider);
91 
92  // Number of articles
93  $this->addColumn(
94  new GridColumn(
95  'numArticles',
96  'editor.issues.numArticles',
97  null,
98  null,
99  $issueGridCellProvider
100  )
101  );
102  }
103 
109  protected function _addCenterColumns($issueGridCellProvider) {
110  // Default implementation does nothing.
111  }
112 
117  protected function getRowInstance() {
118  return new IssueGridRow();
119  }
120 
121  //
122  // Public operations
123  //
129  function addIssue($args, $request) {
130  // Calling editIssueData with an empty ID will add
131  // a new issue.
132  return $this->editIssueData($args, $request);
133  }
134 
141  function editIssue($args, $request) {
142  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
143  $templateMgr = TemplateManager::getManager($request);
144  if ($issue) $templateMgr->assign('issueId', $issue->getId());
145  $publisherIdEnabled = in_array('issue', (array) $request->getContext()->getData('enablePublisherId'));
146  $pubIdPlugins = PluginRegistry::getPlugins('pubIds');
147  if ($publisherIdEnabled || count($pubIdPlugins)) {
148  $templateMgr->assign('enableIdentifiers', true);
149  }
150  return new JSONMessage(true, $templateMgr->fetch('controllers/grid/issues/issue.tpl'));
151  }
152 
159  function editIssueData($args, $request) {
160  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
161 
162  import('controllers.grid.issues.form.IssueForm');
163  $issueForm = new IssueForm($issue);
164  $issueForm->initData();
165  return new JSONMessage(true, $issueForm->fetch($request));
166  }
167 
174  function uploadFile($args, $request) {
175  $user = $request->getUser();
176 
177  import('lib.pkp.classes.file.TemporaryFileManager');
178  $temporaryFileManager = new TemporaryFileManager();
179  $temporaryFile = $temporaryFileManager->handleUpload('uploadedFile', $user->getId());
180  if ($temporaryFile) {
181  $json = new JSONMessage(true);
182  $json->setAdditionalAttributes(array(
183  'temporaryFileId' => $temporaryFile->getId()
184  ));
185  return $json;
186  } else {
187  return new JSONMessage(false, __('common.uploadFailed'));
188  }
189  }
190 
199  function deleteCoverImage($args, $request) {
200  assert(!empty($args['coverImage']) && !empty($args['issueId']));
201 
202  // Check if the passed filename matches the filename for this issue's
203  // cover page.
204  $issueDao = DAORegistry::getDAO('IssueDAO'); /* @var $issueDao IssueDAO */
205  $issue = $issueDao->getById((int) $args['issueId']);
206  $locale = AppLocale::getLocale();
207  if ($args['coverImage'] != $issue->getCoverImage($locale)) {
208  return new JSONMessage(false, __('editor.issues.removeCoverImageFileNameMismatch'));
209  }
210 
211  $file = $args['coverImage'];
212 
213  // Remove cover image and alt text from issue settings
214  $issue->setCoverImage('', $locale);
215  $issue->setCoverImageAltText('', $locale);
216  $issueDao->updateObject($issue);
217 
218  // Remove the file
219  $publicFileManager = new PublicFileManager();
220  if ($publicFileManager->removeContextFile($issue->getJournalId(), $file)) {
221  $json = new JSONMessage(true);
222  $json->setEvent('fileDeleted');
223  return $json;
224  } else {
225  return new JSONMessage(false, __('editor.issues.removeCoverImageFileNotFound'));
226  }
227  }
228 
229 
236  function updateIssue($args, $request) {
237  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
238 
239  import('controllers.grid.issues.form.IssueForm');
240  $issueForm = new IssueForm($issue);
241  $issueForm->readInputData();
242 
243  if ($issueForm->validate()) {
244  $issueForm->execute();
245  $notificationManager = new NotificationManager();
246  $notificationManager->createTrivialNotification($request->getUser()->getId());
247  return DAO::getDataChangedEvent();
248  } else {
249  return new JSONMessage(true, $issueForm->fetch($request));
250  }
251  }
252 
259  function access($args, $request) {
260  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
261 
262  import('controllers.grid.issues.form.IssueAccessForm');
263  $issueAccessForm = new IssueAccessForm($issue);
264  $issueAccessForm->initData();
265  return new JSONMessage(true, $issueAccessForm->fetch($request));
266  }
267 
274  function updateAccess($args, $request) {
275  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
276 
277  import('controllers.grid.issues.form.IssueAccessForm');
278  $issueAccessForm = new IssueAccessForm($issue);
279  $issueAccessForm->readInputData();
280 
281  if ($issueAccessForm->validate()) {
282  $issueAccessForm->execute();
283  $notificationManager = new NotificationManager();
284  $notificationManager->createTrivialNotification($request->getUser()->getId());
285  return DAO::getDataChangedEvent();
286  } else {
287  return new JSONMessage(true, $issueAccessForm->fetch($request));
288  }
289  }
290 
296  function deleteIssue($args, $request) {
297  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
298  if (!$issue || !$request->checkCSRF()) return new JSONMessage(false);
299 
300  $journal = $request->getJournal();
301  $isBackIssue = $issue->getPublished() > 0 ? true: false;
302 
303  // remove all published submissions and return original articles to editing queue
304  import('classes.article.ArticleTombstoneManager');
305  $articleTombstoneManager = new ArticleTombstoneManager();
306  $submissionsIterator = Services::get('submission')->getMany([
307  'contextId' => $issue->getJournalId(),
308  'count' => 5000, // large upper-limit
309  'issueIds' => $issue->getId(),
310  ]);
311  foreach ($submissionsIterator as $submission) {
312  $submission = Services::get('submission')->edit($submission, ['status' => STATUS_QUEUED], $request);
313  if ($isBackIssue) {
314  $articleTombstoneManager->insertArticleTombstone($submission, $journal);
315  }
316  $publications = (array) $submission->getData('publications');
317  foreach ($publications as $publication) {
318  $publication = Services::get('publication')->edit($publication, ['issueId' => ''], $request);
319  }
320  }
321 
322  $issueDao = DAORegistry::getDAO('IssueDAO'); /* @var $issueDao IssueDAO */
323  $issueDao->deleteObject($issue);
324  if ($issue->getCurrent()) {
325  $issues = $issueDao->getPublishedIssues($journal->getId());
326  if (!$issues->eof()) {
327  $issue = $issues->next();
328  $issue->setCurrent(1);
329  $issueDao->updateObject($issue);
330  }
331  }
332 
333  return DAO::getDataChangedEvent($issue->getId());
334  }
335 
342  function identifiers($args, $request) {
343  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
344  import('controllers.tab.pubIds.form.PublicIdentifiersForm');
345  $form = new PublicIdentifiersForm($issue);
346  $form->initData();
347  return new JSONMessage(true, $form->fetch($request));
348  }
349 
356  function updateIdentifiers($args, $request) {
357  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
358  import('controllers.tab.pubIds.form.PublicIdentifiersForm');
359  $form = new PublicIdentifiersForm($issue);
360  $form->readInputData();
361  if ($form->validate()) {
362  $form->execute();
363  return DAO::getDataChangedEvent($issue->getId());
364  } else {
365  return new JSONMessage(true, $form->fetch($request));
366  }
367  }
368 
375  function clearPubId($args, $request) {
376  if (!$request->checkCSRF()) return new JSONMessage(false);
377 
378  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
379  import('controllers.tab.pubIds.form.PublicIdentifiersForm');
380  $form = new PublicIdentifiersForm($issue);
381  $form->clearPubId($request->getUserVar('pubIdPlugIn'));
382  return new JSONMessage(true);
383  }
384 
391  function clearIssueObjectsPubIds($args, $request) {
392  if (!$request->checkCSRF()) return new JSONMessage(false);
393 
394  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
395  import('controllers.tab.pubIds.form.PublicIdentifiersForm');
396  $form = new PublicIdentifiersForm($issue);
397  $form->clearIssueObjectsPubIds($request->getUserVar('pubIdPlugIn'));
398  return new JSONMessage(true);
399  }
400 
407  function issueToc($args, $request) {
408  $templateMgr = TemplateManager::getManager($request);
409  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
410  $templateMgr->assign('issue', $issue);
411  return new JSONMessage(true, $templateMgr->fetch('controllers/grid/issues/issueToc.tpl'));
412  }
413 
420  function issueGalleys($args, $request) {
421  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
422  $templateMgr = TemplateManager::getManager($request);
423  $dispatcher = $request->getDispatcher();
424  return $templateMgr->fetchAjax(
425  'issueGalleysGridContainer',
426  $dispatcher->url(
427  $request, ROUTE_COMPONENT, null,
428  'grid.issueGalleys.IssueGalleyGridHandler', 'fetchGrid', null,
429  array('issueId' => $issue->getId())
430  )
431  );
432  }
433 
439  function publishIssue($args, $request) {
440  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
441  $context = $request->getContext();
442  $contextId = $context->getId();
443  $wasPublished = $issue->getPublished();
444 
445  if (!$wasPublished) {
446  $confirmationText = __('editor.issues.confirmPublish');
447  import('controllers.grid.pubIds.form.AssignPublicIdentifiersForm');
448  $formTemplate = $this->getAssignPublicIdentifiersFormTemplate();
449  $assignPublicIdentifiersForm = new AssignPublicIdentifiersForm($formTemplate, $issue, true, $confirmationText);
450  if (!$request->getUserVar('confirmed')) {
451  // Display assign pub ids modal
452  $assignPublicIdentifiersForm->initData();
453  return new JSONMessage(true, $assignPublicIdentifiersForm->fetch($request));
454  }
455  // Asign pub ids
456  $assignPublicIdentifiersForm->readInputData();
457  $assignPublicIdentifiersForm->execute();
458  }
459 
460  $issue->setCurrent(1);
461  $issue->setPublished(1);
462  $issue->setDatePublished(Core::getCurrentDate());
463 
464  // If subscriptions with delayed open access are enabled then
465  // update open access date according to open access delay policy
466  if ($context->getData('publishingMode') == PUBLISHING_MODE_SUBSCRIPTION && ($delayDuration = $context->getData('delayedOpenAccessDuration'))) {
467  $delayYears = (int)floor($delayDuration/12);
468  $delayMonths = (int)fmod($delayDuration,12);
469 
470  $curYear = date('Y');
471  $curMonth = date('n');
472  $curDay = date('j');
473 
474  $delayOpenAccessYear = $curYear + $delayYears + (int)floor(($curMonth+$delayMonths)/12);
475  $delayOpenAccessMonth = (int)fmod($curMonth+$delayMonths,12);
476 
477  $issue->setAccessStatus(ISSUE_ACCESS_SUBSCRIPTION);
478  $issue->setOpenAccessDate(date('Y-m-d H:i:s',mktime(0,0,0,$delayOpenAccessMonth,$curDay,$delayOpenAccessYear)));
479  }
480 
481  HookRegistry::call('IssueGridHandler::publishIssue', array(&$issue));
482 
483  $issueDao = DAORegistry::getDAO('IssueDAO'); /* @var $issueDao IssueDAO */
484  $issueDao->updateCurrent($contextId,$issue);
485 
486  if (!$wasPublished) {
487  // Publish all related publications
488  import('classes.submission.Submission');
489  $submissionsIterator = Services::get('submission')->getMany([
490  'contextId' => $issue->getJournalId(),
491  'issueIds' => $issue->getId(),
492  'status' => STATUS_SCHEDULED,
493  ]);
494 
495  $dataObjectTombstoneDao = DAORegistry::getDAO('DataObjectTombstoneDAO');
497  foreach ($submissionsIterator as $submission) {
498  $publications = $submission->getData('publications');
499 
500  foreach ($publications as $publication) {
501  if ($publication->getData('status') === STATUS_SCHEDULED && $publication->getData('issueId') === (int) $issue->getId()) {
502  $publication = Services::get('publication')->publish($publication);
503  }
504  }
505 
506  // delete article tombstone
507  $dataObjectTombstoneDao->deleteByDataObjectId($submission->getId());
508  }
509  }
510 
511  // Send a notification to associated users if selected and context is publishing content online with OJS
512  if ($request->getUserVar('sendIssueNotification') && $context->getData('publishingMode') != PUBLISHING_MODE_NONE) {
513  import('classes.notification.NotificationManager');
514  $notificationManager = new NotificationManager();
515  $notificationUsers = array();
516  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
517  $allUsers = $userGroupDao->getUsersByContextId($contextId);
518  while ($user = $allUsers->next()) {
519  if ($user->getDisabled()) continue;
520  $notificationUsers[] = array('id' => $user->getId());
521  }
522  foreach ($notificationUsers as $userRole) {
523  $notificationManager->createNotification(
524  $request, $userRole['id'], NOTIFICATION_TYPE_PUBLISHED_ISSUE,
525  $contextId, ASSOC_TYPE_ISSUE, $issue->getId()
526  );
527  }
528  }
529 
530  $json = DAO::getDataChangedEvent();
531  $json->setGlobalEvent('issuePublished', array('id' => $issue->getId()));
532  return $json;
533  }
534 
540  function unpublishIssue($args, $request) {
541  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
542  $journal = $request->getJournal();
543 
544  if (!$request->checkCSRF()) return new JSONMessage(false);
545 
546  $issue->setCurrent(0);
547  $issue->setPublished(0);
548  $issue->setDatePublished(null);
549 
550  HookRegistry::call('IssueGridHandler::unpublishIssue', array(&$issue));
551 
552  $issueDao = DAORegistry::getDAO('IssueDAO'); /* @var $issueDao IssueDAO */
553  $issueDao->updateObject($issue);
554 
555  // insert article tombstones for all articles
556  import('classes.submission.Submission');
557  import('classes.article.ArticleTombstoneManager');
558  $articleTombstoneManager = new ArticleTombstoneManager();
559  $submissionsIterator = Services::get('submission')->getMany([
560  'contextId' => $issue->getJournalId(),
561  'issueIds' => $issue->getId(),
562  ]);
563 
564  foreach ($submissionsIterator as $submission) {
565  $articleTombstoneManager->insertArticleTombstone($submission, $journal);
566 
567  $publications = $submission->getData('publications');
568  foreach ($publications as $publication) {
569  if ($publication->getData('status') === STATUS_PUBLISHED && $publication->getData('issueId') === (int) $issue->getId()) {
570  // Republish the publication in the issue, now that it's status has changed,
571  // to ensure the publication's status is restored to STATUS_SCHEDULED
572  // rather than STATUS_QUEUED
573  $publication = Services::get('publication')->unpublish($publication);
574  $publication = Services::get('publication')->publish($publication);
575  }
576  }
577  }
578 
579  $dispatcher = $request->getDispatcher();
580  $json = new JSONMessage();
581  $json->setEvent('containerReloadRequested', array('tabsUrl' => $dispatcher->url($request, ROUTE_PAGE, null, 'manageIssues', 'issuesTabs', null)));
582  $json->setGlobalEvent('issueUnpublished', array('id' => $issue->getId()));
583  return $json;
584  }
585 
591  function setCurrentIssue($args, $request) {
592  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
593  $journal = $request->getJournal();
594 
595  if (!$request->checkCSRF()) return new JSONMessage(false);
596 
597  $issue->setCurrent(1);
598 
599  $issueDao = DAORegistry::getDAO('IssueDAO'); /* @var $issueDao IssueDAO */
600  $issueDao->updateCurrent($journal->getId(), $issue);
601 
602  $dispatcher = $request->getDispatcher();
603  $json = new JSONMessage();
604  $json->setEvent('containerReloadRequested', array('tabsUrl' => $dispatcher->url($request, ROUTE_PAGE, null, 'manageIssues', 'issuesTabs', null)));
605  return $json;
606  }
607 
613  return 'controllers/grid/pubIds/form/assignPublicIdentifiersForm.tpl';
614  }
615 }
616 
617 
PKPHandler\addRoleAssignment
addRoleAssignment($roleIds, $operations)
Definition: PKPHandler.inc.php:213
TemporaryFileManager
Definition: TemporaryFileManager.inc.php:19
GridColumn
The GridColumn class represents a column within a grid. It is used to format the data presented in a ...
Definition: GridColumn.inc.php:27
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
AssignPublicIdentifiersForm
Displays the assign pub id form.
Definition: AssignPublicIdentifiersForm.inc.php:18
ContextAccessPolicy
Class to control access to PKP applications' setup components.
Definition: ContextAccessPolicy.inc.php:17
PluginRegistry\getPlugins
static & getPlugins($category=null)
Definition: PluginRegistry.inc.php:30
IssueGridHandler\initialize
initialize($request, $args=null)
Definition: IssueGridHandler.inc.php:68
IssueGridHandler\clearIssueObjectsPubIds
clearIssueObjectsPubIds($args, $request)
Definition: IssueGridHandler.inc.php:391
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
IssueGridHandler\editIssue
editIssue($args, $request)
Definition: IssueGridHandler.inc.php:141
IssueGridHandler\unpublishIssue
unpublishIssue($args, $request)
Definition: IssueGridHandler.inc.php:540
OjsIssueRequiredPolicy
Policy that ensures that the request contains a valid issue.
Definition: OjsIssueRequiredPolicy.inc.php:17
PublicIdentifiersForm
Displays a pub ids form.
Definition: PublicIdentifiersForm.inc.php:18
IssueGridHandler\updateIdentifiers
updateIdentifiers($args, $request)
Definition: IssueGridHandler.inc.php:356
IssueGridHandler\identifiers
identifiers($args, $request)
Definition: IssueGridHandler.inc.php:342
IssueGridCellProvider
Grid cell provider for the issue management grid.
Definition: IssueGridCellProvider.inc.php:18
IssueGridHandler\deleteIssue
deleteIssue($args, $request)
Definition: IssueGridHandler.inc.php:296
IssueGridRow
Handle issue grid row requests.
Definition: IssueGridRow.inc.php:18
IssueGridHandler\getRowInstance
getRowInstance()
Definition: IssueGridHandler.inc.php:117
IssueGridHandler\access
access($args, $request)
Definition: IssueGridHandler.inc.php:259
GridHandler\addColumn
addColumn($column)
Definition: GridHandler.inc.php:335
PublicFileManager
Wrapper class for uploading files to a site/journal's public directory.
Definition: PublicFileManager.inc.php:18
IssueGridHandler\setCurrentIssue
setCurrentIssue($args, $request)
Definition: IssueGridHandler.inc.php:591
IssueGridHandler\issueGalleys
issueGalleys($args, $request)
Definition: IssueGridHandler.inc.php:420
IssueGridHandler
Handle issues grid requests.
Definition: IssueGridHandler.inc.php:24
ArticleTombstoneManager
Class defining basic operations for article tombstones.
Definition: ArticleTombstoneManager.inc.php:17
DAO\getDataChangedEvent
static getDataChangedEvent($elementId=null, $parentElementId=null, $content='')
Definition: DAO.inc.php:647
IssueGridHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: IssueGridHandler.inc.php:52
JSONMessage
Class to represent a JSON (Javascript Object Notation) message.
Definition: JSONMessage.inc.php:18
IssueGridHandler\__construct
__construct()
Definition: IssueGridHandler.inc.php:28
IssueGridHandler\publishIssue
publishIssue($args, $request)
Definition: IssueGridHandler.inc.php:439
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
IssueGridHandler\issueToc
issueToc($args, $request)
Definition: IssueGridHandler.inc.php:407
IssueGridHandler\addIssue
addIssue($args, $request)
Definition: IssueGridHandler.inc.php:129
IssueGridHandler\updateIssue
updateIssue($args, $request)
Definition: IssueGridHandler.inc.php:236
IssueGridHandler\deleteCoverImage
deleteCoverImage($args, $request)
Definition: IssueGridHandler.inc.php:199
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
IssueGridHandler\clearPubId
clearPubId($args, $request)
Definition: IssueGridHandler.inc.php:375
IssueGridHandler\uploadFile
uploadFile($args, $request)
Definition: IssueGridHandler.inc.php:174
IssueAccessForm
Form to edit an issue's access settings.
Definition: IssueAccessForm.inc.php:20
Core\getCurrentDate
static getCurrentDate($ts=null)
Definition: Core.inc.php:63
GridHandler
This class defines basic operations for handling HTML grids. Grids are used to implement a standardiz...
Definition: GridHandler.inc.php:58
NotificationManager
Definition: NotificationManager.inc.php:19
IssueGridHandler\_addCenterColumns
_addCenterColumns($issueGridCellProvider)
Definition: IssueGridHandler.inc.php:109
IssueGridHandler\updateAccess
updateAccess($args, $request)
Definition: IssueGridHandler.inc.php:274
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
IssueGridHandler\editIssueData
editIssueData($args, $request)
Definition: IssueGridHandler.inc.php:159
HookRegistry\call
static call($hookName, $args=null)
Definition: HookRegistry.inc.php:86
AppLocale\getLocale
static getLocale()
Definition: env1/MockAppLocale.inc.php:40
IssueForm
Form to create or edit an issue.
Definition: IssueForm.inc.php:23
IssueGridHandler\getAssignPublicIdentifiersFormTemplate
getAssignPublicIdentifiersFormTemplate()
Definition: IssueGridHandler.inc.php:612
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49