21 import(
'lib.pkp.classes.controllers.grid.GridHandler');
22 import(
'controllers.grid.issues.IssueGridRow');
29 parent::__construct();
31 array(ROLE_ID_MANAGER),
33 'fetchGrid',
'fetchRow',
34 'addIssue',
'editIssue',
'editIssueData',
'updateIssue',
35 'uploadFile',
'deleteCoverImage',
38 'deleteIssue',
'publishIssue',
'unpublishIssue',
'setCurrentIssue',
39 'identifiers',
'updateIdentifiers',
'clearPubId',
'clearIssueObjectsPubIds',
40 'access',
'updateAccess',
52 function authorize($request, &$args, $roleAssignments) {
53 import(
'lib.pkp.classes.security.authorization.ContextAccessPolicy');
57 if ($request->getUserVar(
'issueId')) {
58 import(
'classes.security.authorization.OjsIssueRequiredPolicy');
62 return parent::authorize($request, $args, $roleAssignments);
69 parent::initialize($request, $args);
76 import(
'controllers.grid.issues.IssueGridCellProvider');
86 $issueGridCellProvider
96 'editor.issues.numArticles',
99 $issueGridCellProvider
144 if ($issue) $templateMgr->assign(
'issueId', $issue->getId());
145 $publisherIdEnabled = in_array(
'issue', (array) $request->getContext()->getData(
'enablePublisherId'));
147 if ($publisherIdEnabled || count($pubIdPlugins)) {
148 $templateMgr->assign(
'enableIdentifiers',
true);
150 return new JSONMessage(
true, $templateMgr->fetch(
'controllers/grid/issues/issue.tpl'));
162 import(
'controllers.grid.issues.form.IssueForm');
164 $issueForm->initData();
165 return new JSONMessage(
true, $issueForm->fetch($request));
175 $user = $request->getUser();
177 import(
'lib.pkp.classes.file.TemporaryFileManager');
179 $temporaryFile = $temporaryFileManager->handleUpload(
'uploadedFile', $user->getId());
180 if ($temporaryFile) {
182 $json->setAdditionalAttributes(array(
183 'temporaryFileId' => $temporaryFile->getId()
187 return new JSONMessage(
false, __(
'common.uploadFailed'));
200 assert(!empty($args[
'coverImage']) && !empty($args[
'issueId']));
205 $issue = $issueDao->getById((
int) $args[
'issueId']);
207 if ($args[
'coverImage'] != $issue->getCoverImage($locale)) {
208 return new JSONMessage(
false, __(
'editor.issues.removeCoverImageFileNameMismatch'));
211 $file = $args[
'coverImage'];
214 $issue->setCoverImage(
'', $locale);
215 $issue->setCoverImageAltText(
'', $locale);
216 $issueDao->updateObject($issue);
220 if ($publicFileManager->removeContextFile($issue->getJournalId(), $file)) {
222 $json->setEvent(
'fileDeleted');
225 return new JSONMessage(
false, __(
'editor.issues.removeCoverImageFileNotFound'));
239 import(
'controllers.grid.issues.form.IssueForm');
241 $issueForm->readInputData();
243 if ($issueForm->validate()) {
244 $issueForm->execute();
246 $notificationManager->createTrivialNotification($request->getUser()->getId());
249 return new JSONMessage(
true, $issueForm->fetch($request));
262 import(
'controllers.grid.issues.form.IssueAccessForm');
264 $issueAccessForm->initData();
265 return new JSONMessage(
true, $issueAccessForm->fetch($request));
277 import(
'controllers.grid.issues.form.IssueAccessForm');
279 $issueAccessForm->readInputData();
281 if ($issueAccessForm->validate()) {
282 $issueAccessForm->execute();
284 $notificationManager->createTrivialNotification($request->getUser()->getId());
287 return new JSONMessage(
true, $issueAccessForm->fetch($request));
298 if (!$issue || !$request->checkCSRF())
return new JSONMessage(
false);
300 $journal = $request->getJournal();
301 $isBackIssue = $issue->getPublished() > 0 ?
true:
false;
304 import(
'classes.article.ArticleTombstoneManager');
306 $submissionsIterator =
Services::get(
'submission')->getMany([
307 'contextId' => $issue->getJournalId(),
309 'issueIds' => $issue->getId(),
311 foreach ($submissionsIterator as $submission) {
312 $submission =
Services::get(
'submission')->edit($submission, [
'status' => STATUS_QUEUED], $request);
314 $articleTombstoneManager->insertArticleTombstone($submission, $journal);
316 $publications = (array) $submission->getData(
'publications');
317 foreach ($publications as $publication) {
318 $publication =
Services::get(
'publication')->edit($publication, [
'issueId' =>
''], $request);
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);
344 import(
'controllers.tab.pubIds.form.PublicIdentifiersForm');
347 return new JSONMessage(
true, $form->fetch($request));
358 import(
'controllers.tab.pubIds.form.PublicIdentifiersForm');
360 $form->readInputData();
361 if ($form->validate()) {
365 return new JSONMessage(
true, $form->fetch($request));
376 if (!$request->checkCSRF())
return new JSONMessage(
false);
379 import(
'controllers.tab.pubIds.form.PublicIdentifiersForm');
381 $form->clearPubId($request->getUserVar(
'pubIdPlugIn'));
392 if (!$request->checkCSRF())
return new JSONMessage(
false);
395 import(
'controllers.tab.pubIds.form.PublicIdentifiersForm');
397 $form->clearIssueObjectsPubIds($request->getUserVar(
'pubIdPlugIn'));
410 $templateMgr->assign(
'issue', $issue);
411 return new JSONMessage(
true, $templateMgr->fetch(
'controllers/grid/issues/issueToc.tpl'));
423 $dispatcher = $request->getDispatcher();
424 return $templateMgr->fetchAjax(
425 'issueGalleysGridContainer',
427 $request, ROUTE_COMPONENT,
null,
428 'grid.issueGalleys.IssueGalleyGridHandler',
'fetchGrid',
null,
429 array(
'issueId' => $issue->getId())
441 $context = $request->getContext();
442 $contextId = $context->getId();
443 $wasPublished = $issue->getPublished();
445 if (!$wasPublished) {
446 $confirmationText = __(
'editor.issues.confirmPublish');
447 import(
'controllers.grid.pubIds.form.AssignPublicIdentifiersForm');
450 if (!$request->getUserVar(
'confirmed')) {
452 $assignPublicIdentifiersForm->initData();
453 return new JSONMessage(
true, $assignPublicIdentifiersForm->fetch($request));
456 $assignPublicIdentifiersForm->readInputData();
457 $assignPublicIdentifiersForm->execute();
460 $issue->setCurrent(1);
461 $issue->setPublished(1);
466 if ($context->getData(
'publishingMode') == PUBLISHING_MODE_SUBSCRIPTION && ($delayDuration = $context->getData(
'delayedOpenAccessDuration'))) {
467 $delayYears = (int)floor($delayDuration/12);
468 $delayMonths = (int)fmod($delayDuration,12);
470 $curYear = date(
'Y');
471 $curMonth = date(
'n');
474 $delayOpenAccessYear = $curYear + $delayYears + (int)floor(($curMonth+$delayMonths)/12);
475 $delayOpenAccessMonth = (int)fmod($curMonth+$delayMonths,12);
477 $issue->setAccessStatus(ISSUE_ACCESS_SUBSCRIPTION);
478 $issue->setOpenAccessDate(date(
'Y-m-d H:i:s',mktime(0,0,0,$delayOpenAccessMonth,$curDay,$delayOpenAccessYear)));
484 $issueDao->updateCurrent($contextId,$issue);
486 if (!$wasPublished) {
488 import(
'classes.submission.Submission');
489 $submissionsIterator =
Services::get(
'submission')->getMany([
490 'contextId' => $issue->getJournalId(),
491 'issueIds' => $issue->getId(),
492 'status' => STATUS_SCHEDULED,
497 foreach ($submissionsIterator as $submission) {
498 $publications = $submission->getData(
'publications');
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);
507 $dataObjectTombstoneDao->deleteByDataObjectId($submission->getId());
512 if ($request->getUserVar(
'sendIssueNotification') && $context->getData(
'publishingMode') != PUBLISHING_MODE_NONE) {
513 import(
'classes.notification.NotificationManager');
515 $notificationUsers = array();
517 $allUsers = $userGroupDao->getUsersByContextId($contextId);
518 while ($user = $allUsers->next()) {
519 if ($user->getDisabled())
continue;
520 $notificationUsers[] = array(
'id' => $user->getId());
522 foreach ($notificationUsers as $userRole) {
523 $notificationManager->createNotification(
524 $request, $userRole[
'id'], NOTIFICATION_TYPE_PUBLISHED_ISSUE,
525 $contextId, ASSOC_TYPE_ISSUE, $issue->getId()
531 $json->setGlobalEvent(
'issuePublished', array(
'id' => $issue->getId()));
542 $journal = $request->getJournal();
544 if (!$request->checkCSRF())
return new JSONMessage(
false);
546 $issue->setCurrent(0);
547 $issue->setPublished(0);
548 $issue->setDatePublished(
null);
553 $issueDao->updateObject($issue);
556 import(
'classes.submission.Submission');
557 import(
'classes.article.ArticleTombstoneManager');
559 $submissionsIterator =
Services::get(
'submission')->getMany([
560 'contextId' => $issue->getJournalId(),
561 'issueIds' => $issue->getId(),
564 foreach ($submissionsIterator as $submission) {
565 $articleTombstoneManager->insertArticleTombstone($submission, $journal);
567 $publications = $submission->getData(
'publications');
568 foreach ($publications as $publication) {
569 if ($publication->getData(
'status') === STATUS_PUBLISHED && $publication->getData(
'issueId') === (
int) $issue->getId()) {
573 $publication =
Services::get(
'publication')->unpublish($publication);
574 $publication =
Services::get(
'publication')->publish($publication);
579 $dispatcher = $request->getDispatcher();
581 $json->setEvent(
'containerReloadRequested', array(
'tabsUrl' => $dispatcher->url($request, ROUTE_PAGE,
null,
'manageIssues',
'issuesTabs',
null)));
582 $json->setGlobalEvent(
'issueUnpublished', array(
'id' => $issue->getId()));
593 $journal = $request->getJournal();
595 if (!$request->checkCSRF())
return new JSONMessage(
false);
597 $issue->setCurrent(1);
600 $issueDao->updateCurrent($journal->getId(), $issue);
602 $dispatcher = $request->getDispatcher();
604 $json->setEvent(
'containerReloadRequested', array(
'tabsUrl' => $dispatcher->url($request, ROUTE_PAGE,
null,
'manageIssues',
'issuesTabs',
null)));
613 return 'controllers/grid/pubIds/form/assignPublicIdentifiersForm.tpl';