Open Journal Systems  3.3.0
PKPPublicationService.inc.php
1 <?php
15 namespace PKP\Services;
16 
17 use Application;
18 use \Core;
19 use \DAOResultFactory;
20 use \DAORegistry;
21 use \DBResultRange;
22 use HookRegistry;
23 use \Services;
24 use SubmissionLog;
25 use \PKP\Services\interfaces\EntityPropertyInterface;
26 use \PKP\Services\interfaces\EntityReadInterface;
27 use \PKP\Services\interfaces\EntityWriteInterface;
28 use \PKP\Services\QueryBuilders\PKPPublicationQueryBuilder;
29 
30 import('lib.pkp.classes.db.DBResultRange');
31 
32 class PKPPublicationService implements EntityPropertyInterface, EntityReadInterface, EntityWriteInterface {
33 
37  public function get($publicationId) {
38  $publicationDao = DAORegistry::getDAO('PublicationDAO'); /* @var $publicationDao PublicationDAO */
39  return $publicationDao->getById($publicationId);
40  }
41 
45  public function getCount($args = []) {
46  return $this->getQueryBuilder($args)->getCount();
47  }
48 
52  public function getIds($args = []) {
53  return $this->getQueryBuilder($args)->getIds();
54  }
55 
66  public function getMany($args = []) {
67  $range = null;
68  if (isset($args['count'])) {
69  $range = new DBResultRange($args['count'], null, isset($args['offset']) ? $args['offset'] : 0);
70  }
71  // Pagination is handled by the DAO, so don't pass count and offset
72  // arguments to the QueryBuilder.
73  if (isset($args['count'])) unset($args['count']);
74  if (isset($args['offset'])) unset($args['offset']);
75  $publicationQO = $this->getQueryBuilder($args)->getQuery();
76  $publicationDao = DAORegistry::getDAO('PublicationDAO'); /* @var $publicationDao PublicationDAO */
77  $result = $publicationDao->retrieveRange($publicationQO->toSql(), $publicationQO->getBindings(), $range);
78  $queryResults = new DAOResultFactory($result, $publicationDao, '_fromRow');
79 
80  return $queryResults->toIterator();
81  }
82 
86  public function getMax($args = []) {
87  // Don't accept args to limit the results
88  if (isset($args['count'])) unset($args['count']);
89  if (isset($args['offset'])) unset($args['offset']);
90  return $this->getQueryBuilder($args)->getCount();
91  }
92 
97  public function getQueryBuilder($args = []) {
98 
99  $defaultArgs = [
100  'contextIds' => [],
101  'submissionIds' => [],
102  ];
103 
104  $args = array_merge($defaultArgs, $args);
105 
106  $publicationQB = new PKPPublicationQueryBuilder();
107  $publicationQB
108  ->filterByContextIds($args['contextIds'])
109  ->filterBySubmissionIds($args['submissionIds']);
110 
111  if (isset($args['count'])) {
112  $publicationQB->limitTo($args['count']);
113  }
114 
115  if (isset($args['offset'])) {
116  $publicationQB->offsetBy($args['count']);
117  }
118 
119  HookRegistry::call('Publication::getMany::queryBuilder', [$publicationQB, $args]);
120 
121  return $publicationQB;
122  }
123 
127  public function getProperties($publication, $props, $args = null) {
128  $request = $args['request'];
129  $dispatcher = $request->getDispatcher();
130 
131  // Get required submission and context
132  $submission = !empty($args['submission'])
133  ? $args['submission']
134  : $args['submission'] = Services::get('submission')->get($publication->getData('submissionId'));
135 
136  $submissionContext = !empty($args['context'])
137  ? $args['context']
138  : $args['context'] = Services::get('context')->get($submission->getData('contextId'));
139 
140  // Users assigned as reviewers should not receive author details
141  if (array_intersect(['authors', 'authorsString', 'authorsStringShort', 'galleys'], $props)) {
142  $currentUserReviewAssignment = isset($args['currentUserReviewAssignment'])
143  ? $args['currentUserReviewAssignment']
144  : DAORegistry::getDAO('ReviewAssignmentDAO')
145  ->getLastReviewRoundReviewAssignmentByReviewer(
146  $submission->getId(),
147  $request->getUser()->getId()
148  );
149  }
150 
151  $values = [];
152 
153  foreach ($props as $prop) {
154  switch ($prop) {
155  case '_href':
156  $values[$prop] = $dispatcher->url(
157  $request,
158  ROUTE_API,
159  $submissionContext->getData('urlPath'),
160  'submissions/' . $publication->getData('submissionId') . '/publications/' . $publication->getId()
161  );
162  break;
163  case 'authors':
164  if ($currentUserReviewAssignment && $currentUserReviewAssignment->getReviewMethod() === SUBMISSION_REVIEW_METHOD_DOUBLEBLIND) {
165  $values[$prop] = [];
166  } else {
167  $values[$prop] = array_map(
168  function($author) use ($request) {
169  return Services::get('author')->getSummaryProperties($author, ['request' => $request]);
170  },
171  $publication->getData('authors')
172  );
173  }
174  break;
175  case 'authorsString':
176  $values[$prop] = '';
177  if ((!$currentUserReviewAssignment || $currentUserReviewAssignment->getReviewMethod() !== SUBMISSION_REVIEW_METHOD_DOUBLEBLIND)
178  && isset($args['userGroups'])) {
179  $values[$prop] = $publication->getAuthorString($args['userGroups']);
180  }
181  break;
182  case 'authorsStringShort':
183  if ($currentUserReviewAssignment && $currentUserReviewAssignment->getReviewMethod() === SUBMISSION_REVIEW_METHOD_DOUBLEBLIND) {
184  $values[$prop] = '';
185  } else {
186  $values[$prop] = $publication->getShortAuthorString();
187  }
188  break;
189  case 'citations':
190  $citationDao = DAORegistry::getDAO('CitationDAO'); /* @var $citationDao CitationDAO */
191  $values[$prop] = array_map(
192  function($citation) {
193  return $citation->getCitationWithLinks();
194  },
195  $citationDao->getByPublicationId($publication->getId())->toArray()
196  );
197  break;
198  case 'fullTitle':
199  $values[$prop] = $publication->getFullTitles();
200  break;
201  case 'galleys':
202  if ($currentUserReviewAssignment && $currentUserReviewAssignment->getReviewMethod() === SUBMISSION_REVIEW_METHOD_DOUBLEBLIND) {
203  $values[$prop] = [];
204  } else {
205  $galleyArgs = array_merge($args, ['publication' => $publication]);
206  $values[$prop] = array_map(
207  function($galley) use ($request, $galleyArgs) {
208  return Services::get('galley')->getSummaryProperties($galley, $galleyArgs);
209  },
210  $publication->getData('galleys')
211  );
212  }
213  break;
214  default:
215  $values[$prop] = $publication->getData($prop);
216  break;
217  }
218  }
219 
220  $values = Services::get('schema')->addMissingMultilingualValues(SCHEMA_PUBLICATION, $values, $submissionContext->getSupportedSubmissionLocales());
221 
222  HookRegistry::call('Publication::getProperties', [&$values, $publication, $props, $args]);
223 
224  ksort($values);
225 
226  return $values;
227  }
228 
232  public function getSummaryProperties($publication, $args = null) {
233  $props = Services::get('schema')->getSummaryProps(SCHEMA_PUBLICATION);
234 
235  return $this->getProperties($publication, $props, $args);
236  }
237 
241  public function getFullProperties($publication, $args = null) {
242  $props = Services::get('schema')->getFullProps(SCHEMA_PUBLICATION);
243 
244  return $this->getProperties($publication, $props, $args);
245  }
246 
253  public function getDateBoundaries($args) {
254  $publicationQO = $this->getQueryBuilder($args)->getDateBoundaries();
255  $publicationDao = DAORegistry::getDAO('PublicationDAO'); /* @var $publicationDao PublicationDAO */
256  $result = $publicationDao->retrieve($publicationQO->toSql(), $publicationQO->getBindings());
257  if (!empty($result->fields)) {
258  return [$result->fields[0], $result->fields[1]];
259  }
260  import('classes.statistics.StatisticsHelper');
261  return [STATISTICS_EARLIEST_DATE, date('Y-m-d', strtotime('yesterday'))];
262  }
263 
267  public function validate($action, $props, $allowedLocales, $primaryLocale) {
268  \AppLocale::requireComponents(LOCALE_COMPONENT_PKP_SUBMISSION, LOCALE_COMPONENT_APP_SUBMISSION);
269  $schemaService = Services::get('schema');
270 
271  import('lib.pkp.classes.validation.ValidatorFactory');
272  $validator = \ValidatorFactory::make(
273  $props,
274  $schemaService->getValidationRules(SCHEMA_PUBLICATION, $allowedLocales),
275  [
276  'locale.regex' => __('validator.localeKey'),
277  'datePublished.date_format' => __('publication.datePublished.errorFormat'),
278  'urlPath.regex' => __('validator.alpha_dash'),
279  ]
280  );
281 
282  // Check required fields
284  $validator,
285  $action,
286  $schemaService->getRequiredProps(SCHEMA_PUBLICATION),
287  $schemaService->getMultilingualProps(SCHEMA_PUBLICATION),
288  $allowedLocales,
289  $primaryLocale
290  );
291 
292  // Check for input from disallowed locales
293  \ValidatorFactory::allowedLocales($validator, $schemaService->getMultilingualProps(SCHEMA_PUBLICATION), $allowedLocales);
294 
295  // The submissionId must match an existing submission
296  if (isset($props['submissionId'])) {
297  $validator->after(function($validator) use ($props) {
298  if (!$validator->errors()->get('submissionId')) {
299  $submission = Services::get('submission')->get($props['submissionId']);
300  if (!$submission) {
301  $validator->errors()->add('submissionId', __('publication.invalidSubmission'));
302  }
303  }
304  });
305  }
306 
307  // The urlPath must not be used in a publication attached to
308  // any submission other than this publication's submission
309  if (!empty($props['urlPath'])) {
310  $validator->after(function($validator) use ($action, $props) {
311  if (!$validator->errors()->get('urlPath')) {
312 
313  if (ctype_digit((string) $props['urlPath'])) {
314  $validator->errors()->add('urlPath', __('publication.urlPath.numberInvalid'));
315  return;
316  }
317 
318  // If there is no submissionId the validator will throw it back anyway
319  if ($action === VALIDATE_ACTION_ADD && !empty($props['submissionId'])) {
320  $submission = Services::get('submission')->get($props['submissionId']);
321  } elseif ($action === VALIDATE_ACTION_EDIT) {
322  $publication = Services::get('publication')->get($props['id']);
323  $submission = Services::get('submission')->get($publication->getData('submissionId'));
324  }
325 
326  // If there's no submission we can't validate but the validator should
327  // fail anyway, so we can return without setting a separate validation
328  // error.
329  if (!$submission) {
330  return;
331  }
332 
333  $qb = new PKPPublicationQueryBuilder();
334  if ($qb->isDuplicateUrlPath($props['urlPath'], $submission->getId(), $submission->getData('contextId'))) {
335  $validator->errors()->add('urlPath', __('publication.urlPath.duplicate'));
336  }
337  }
338  });
339  }
340 
341  // If a new file has been uploaded, check that the temporary file exists and
342  // the current user owns it
343  $user = Application::get()->getRequest()->getUser();
345  $validator,
346  ['coverImage'],
347  ['coverImage'],
348  $props,
349  $allowedLocales,
350  $user ? $user->getId() : null
351  );
352 
353  if ($validator->fails()) {
354  $errors = $schemaService->formatValidationErrors($validator->errors(), $schemaService->get(SCHEMA_PUBLICATION), $allowedLocales);
355  }
356 
357  HookRegistry::call('Publication::validate', [&$errors, $action, $props, $allowedLocales, $primaryLocale]);
358 
359  return $errors;
360  }
361 
382  public function validatePublish($publication, $submission, $allowedLocales, $primaryLocale) {
383 
384  $errors = [];
385 
386  // Don't allow declined submissions to be published
387  if ($submission->getData('status') === STATUS_DECLINED) {
388  $errors['declined'] = __('publication.required.declined');
389  }
390 
391  // Don't allow a publication to be published before passing the review stage
392  if ($submission->getData('stageId') < WORKFLOW_STAGE_ID_EXTERNAL_REVIEW) {
393  $errors['reviewStage'] = __('publication.required.reviewStage');
394  }
395 
396  HookRegistry::call('Publication::validatePublish', [&$errors, $publication, $submission, $allowedLocales, $primaryLocale]);
397 
398  return $errors;
399  }
400 
404  public function add($publication, $request) {
405  $publication->stampModified();
406  $publicationDao = DAORegistry::getDAO('PublicationDAO'); /* @var $publicationDao PublicationDAO */
407  $publicationId = $publicationDao->insertObject($publication);
408  $publication = $this->get($publicationId);
409  $submission = Services::get('submission')->get($publication->getData('submissionId'));
410 
411  // Parse the citations
412  if ($publication->getData('citationsRaw')) {
413  $citationDao = DAORegistry::getDAO('CitationDAO'); /* @var $citationDao CitationDAO */
414  $citationDao->importCitations($publication->getId(), $publication->getData('citationsRaw'));
415  }
416 
417  // Move uploaded files into place and update the settings
418  if ($publication->getData('coverImage')) {
419  $userId = $request->getUser() ? $request->getUser()->getId() : null;
420 
421  $submissionContext = Application::get()->getRequest()->getContext();
422  if ($submissionContext->getId() !== $submission->getData('contextId')) {
423  $submissionContext = Services::get('context')->get($submission->getData('contextId'));
424  }
425 
426  $supportedLocales = $submissionContext->getSupportedSubmissionLocales();
427  foreach ($supportedLocales as $localeKey) {
428  if (!array_key_exists($localeKey, $publication->getData('coverImage'))) {
429  continue;
430  }
431  $value[$localeKey] = $this->_saveFileParam($publication, $submission, $publication->getData('coverImage', $localeKey), 'coverImage', $userId, $localeKey, true);
432  }
433 
434  $publication = $this->edit($publication, ['coverImage' => $value], $request);
435  }
436 
437  HookRegistry::call('Publication::add', [$publication, $request]);
438 
439  // Update a submission's status based on the status of its publications
440  $submission = Services::get('submission')->updateStatus($submission);
441 
442  return $publication;
443  }
444 
455  public function version($publication, $request) {
456  $newPublication = clone $publication;
457  $newPublication->setData('id', null);
458  $newPublication->setData('datePublished', '');
459  $newPublication->setData('status', STATUS_QUEUED);
460  $newPublication->setData('version', $publication->getData('version') + 1);
461  $newPublication->stampModified();
462  $newPublication = $this->add($newPublication, $request);
463 
464  $authors = $publication->getData('authors');
465  if (!empty($authors)) {
466  foreach ($authors as $author) {
467  $newAuthor = clone $author;
468  $newAuthor->setData('id', null);
469  $newAuthor->setData('publicationId', $newPublication->getId());
470  $newAuthor = Services::get('author')->add($newAuthor, $request);
471 
472  if ($author->getId() === $publication->getData('primaryContactId')) {
473  $newPublication = $this->edit($newPublication, ['primaryContactId' => $newAuthor->getId()], $request);
474  }
475  }
476  }
477 
478  if (!empty($newPublication->getData('citationsRaw'))) {
479  $citationDao = DAORegistry::getDAO('CitationDAO'); /* @var $citationDao CitationDAO */
480  $citationDao->importCitations($newPublication->getId(), $newPublication->getData('citationsRaw'));
481  }
482 
483  $newPublication = $this->get($newPublication->getId());
484 
485  HookRegistry::call('Publication::version', [&$newPublication, $publication, $request]);
486 
487  $submission = Services::get('submission')->get($newPublication->getData('submissionId'));
488  import('lib.pkp.classes.log.SubmissionLog');
489  import('classes.log.SubmissionEventLogEntry');
490  SubmissionLog::logEvent(Application::get()->getRequest(), $submission, SUBMISSION_LOG_CREATE_VERSION, 'publication.event.versionCreated');
491 
492  return $newPublication;
493  }
494 
498  public function edit($publication, $params, $request) {
499  $submission = Services::get('submission')->get($publication->getData('submissionId'));
500 
501  // Move uploaded files into place and update the params
502  if (array_key_exists('coverImage', $params)) {
503  $userId = $request->getUser() ? $request->getUser()->getId() : null;
504 
505  $submissionContext = Application::get()->getRequest()->getContext();
506  if ($submissionContext->getId() !== $submission->getData('contextId')) {
507  $submissionContext = Services::get('context')->get($submission->getData('contextId'));
508  }
509 
510  $supportedLocales = $submissionContext->getSupportedSubmissionLocales();
511  foreach ($supportedLocales as $localeKey) {
512  if (!array_key_exists($localeKey, $params['coverImage'])) {
513  continue;
514  }
515  $params['coverImage'][$localeKey] = $this->_saveFileParam($publication, $submission, $params['coverImage'][$localeKey], 'coverImage', $userId, $localeKey, true);
516  }
517  }
518 
519  $publicationDao = DAORegistry::getDAO('PublicationDAO'); /* @var $publicationDao PublicationDAO */
520  $newPublication = $publicationDao->newDataObject();
521  $newPublication->_data = array_merge($publication->_data, $params);
522  $newPublication->stampModified();
523 
524  HookRegistry::call('Publication::edit', [$newPublication, $publication, $params, $request]);
525 
526  $publicationDao->updateObject($newPublication);
527  $newPublication = $this->get($newPublication->getId());
528 
529  // Parse the citations
530  if (array_key_exists('citationsRaw', $params)) {
531  $citationDao = DAORegistry::getDAO('CitationDAO'); /* @var $citationDao CitationDAO */
532  $citationDao->importCitations($newPublication->getId(), $newPublication->getData('citationsRaw'));
533  }
534 
535  // Log an event when publication data is updated
536  import('lib.pkp.classes.log.SubmissionLog');
537  import('classes.log.SubmissionEventLogEntry');
538  SubmissionLog::logEvent($request, $submission, SUBMISSION_LOG_METADATA_UPDATE, 'submission.event.general.metadataUpdated');
539 
540  return $newPublication;
541  }
542 
550  public function publish($publication) {
551  $newPublication = clone $publication;
552 
553  if (!$newPublication->getData('datePublished')) {
554  $newPublication->setData('datePublished', Core::getCurrentDate());
555  }
556 
557  if (strtotime($newPublication->getData('datePublished')) <= strtotime(Core::getCurrentDate())) {
558  $newPublication->setData('status', STATUS_PUBLISHED);
559  } else {
560  $newPublication->setData('status', STATUS_SCHEDULED);
561  }
562 
563  $newPublication->stampModified();
564 
565  // Set the copyright and license information
566  $submission = Services::get('submission')->get($newPublication->getData('submissionId'));
567  if ($newPublication->getData('status') === STATUS_PUBLISHED) {
568  if (!$newPublication->getData('copyrightHolder')) {
569  $newPublication->setData('copyrightHolder', $submission->_getContextLicenseFieldValue(null, PERMISSIONS_FIELD_COPYRIGHT_HOLDER, $newPublication));
570  }
571  if (!$newPublication->getData('copyrightYear')) {
572  $newPublication->setData('copyrightYear', $submission->_getContextLicenseFieldValue(null, PERMISSIONS_FIELD_COPYRIGHT_YEAR, $newPublication));
573  }
574  if (!$newPublication->getData('licenseUrl')) {
575  $newPublication->setData('licenseUrl', $submission->_getContextLicenseFieldValue(null, PERMISSIONS_FIELD_LICENSE_URL, $newPublication));
576  }
577  }
578 
579  HookRegistry::call('Publication::publish::before', [$newPublication, $publication]);
580 
581  $publicationDao = DAORegistry::getDAO('PublicationDAO'); /* @var $publicationDao PublicationDAO */
582  $publicationDao->updateObject($newPublication);
583 
584  $newPublication = $this->get($newPublication->getId());
585  $submission = Services::get('submission')->get($newPublication->getData('submissionId'));
586 
587  // Update a submission's status based on the status of its publications
588  if ($newPublication->getData('status') !== $publication->getData('status')) {
589  $submission = Services::get('submission')->updateStatus($submission);
590  }
591 
592  // Log an event when publication is published. Adjust the message depending
593  // on whether this is the first publication or a subsequent version
594  if (count($submission->getData('publications')) > 1) {
595  $msg = $newPublication->getData('status') === STATUS_SCHEDULED ? 'publication.event.versionScheduled' : 'publication.event.versionPublished';
596  } else {
597  $msg = $newPublication->getData('status') === STATUS_SCHEDULED ? 'publication.event.scheduled' : 'publication.event.published';
598  }
599  import('lib.pkp.classes.log.SubmissionLog');
600  import('classes.log.SubmissionEventLogEntry');
601  SubmissionLog::logEvent(Application::get()->getRequest(), $submission, SUBMISSION_LOG_METADATA_PUBLISH, $msg);
602 
603  HookRegistry::call('Publication::publish', [$newPublication, $publication, $submission]);
604 
605  // Update the search index.
606  if ($newPublication->getData('status') === STATUS_PUBLISHED) {
607  Application::getSubmissionSearchIndex()->submissionMetadataChanged($submission);
608  Application::getSubmissionSearchIndex()->submissionFilesChanged($submission);
609  Application::getSubmissionSearchDAO()->flushCache();
610  Application::getSubmissionSearchIndex()->submissionChangesFinished();
611  }
612 
613  return $newPublication;
614  }
615 
622  public function unpublish($publication) {
623  $newPublication = clone $publication;
624  $newPublication->setData('status', STATUS_QUEUED);
625  $newPublication->stampModified();
626 
627  HookRegistry::call('Publication::unpublish::before', [$newPublication, $publication]);
628 
629  $publicationDao = DAORegistry::getDAO('PublicationDAO'); /* @var $publicationDao PublicationDAO */
630  $publicationDao->updateObject($newPublication);
631  $newPublication = $this->get($newPublication->getId());
632  $submission = Services::get('submission')->get($newPublication->getData('submissionId'));
633 
634  // Update a submission's status based on the status of its publications
635  if ($newPublication->getData('status') !== $publication->getData('status')) {
636  $submission = Services::get('submission')->updateStatus($submission);
637  }
638 
639  // Log an event when publication is unpublished. Adjust the message depending
640  // on whether this is the first publication or a subsequent version
641  $msg = count($submission->getData('publications')) > 1 ? 'publication.event.versionUnpublished' : 'publication.event.unpublished';
642  import('lib.pkp.classes.log.SubmissionLog');
643  import('classes.log.SubmissionEventLogEntry');
644  SubmissionLog::logEvent(Application::get()->getRequest(), $submission, SUBMISSION_LOG_METADATA_UNPUBLISH, $msg);
645 
646  HookRegistry::call('Publication::unpublish', [$newPublication, $publication, $submission]);
647 
648  // Update the metadata in the search index.
649  if ($submission->getData('status') !== STATUS_PUBLISHED) {
650  Application::getSubmissionSearchIndex()->deleteTextIndex($submission->getId());
651  Application::getSubmissionSearchIndex()->clearSubmissionFiles($submission);
652  } else {
653  Application::getSubmissionSearchIndex()->submissionMetadataChanged($submission);
654  Application::getSubmissionSearchIndex()->submissionFilesChanged($submission);
655  }
656  Application::getSubmissionSearchDAO()->flushCache();
657  Application::getSubmissionSearchIndex()->submissionChangesFinished();
658 
659  return $newPublication;
660  }
661 
665  public function delete($publication) {
666  HookRegistry::call('Publication::delete::before', [$publication]);
667 
668  $publicationDao = DAORegistry::getDAO('PublicationDAO'); /* @var $publicationDao PublicationDAO */
669  $publicationDao->deleteObject($publication);
670 
671  // Update a submission's status based on the status of its remaining publications
672  $submission = Services::get('submission')->get($publication->getData('submissionId'));
673  $submission = $submission = Services::get('submission')->updateStatus($submission);
674 
675  HookRegistry::call('Publication::delete', [$publication]);
676  }
677 
700  protected function _saveFileParam($publication, $submission, $value, $settingName, $userId, $localeKey = '', $isImage = false) {
701 
702  // If the value is null, delete any existing unused file in the system
703  if (is_null($value)) {
704  $oldPublication = Services::get('publication')->get($publication->getId());
705  $oldValue = $oldPublication->getData($settingName, $localeKey);
706  $fileName = $oldValue['uploadName'];
707  if ($fileName) {
708  // File may be in use by other publications
709  $fileInUse = false;
710  foreach ((array) $submission->getData('publications') as $iPublication) {
711  if ($publication->getId() === $iPublication->getId()) {
712  continue;
713  }
714  $iValue = $iPublication->getData($settingName, $localeKey);
715  if (!empty($iValue['uploadName']) && $iValue['uploadName'] === $fileName) {
716  $fileInUse = true;
717  continue;
718  }
719  }
720  if (!$fileInUse) {
721  import('classes.file.PublicFileManager');
722  $publicFileManager = new \PublicFileManager();
723  $publicFileManager->removeContextFile($submission->getData('contextId'), $fileName);
724  }
725  }
726  return null;
727  }
728 
729  // Check if there is something to upload
730  if (empty($value['temporaryFileId'])) {
731  return $value;
732  }
733 
734  // Get the submission context
735  $submissionContext = Application::get()->getRequest()->getContext();
736  if ($submissionContext->getId() !== $submission->getData('contextId')) {
737  $submissionContext = Services::get('context')->get($submission->getData('contextId'));
738  }
739 
740  import('lib.pkp.classes.file.TemporaryFileManager');
741  $temporaryFileManager = new \TemporaryFileManager();
742  $temporaryFile = $temporaryFileManager->getFile((int) $value['temporaryFileId'], $userId);
743  $fileNameBase = join('_', ['submission', $submission->getId(), $publication->getId(), $settingName]); // eg - submission_1_1_coverImage
744  $fileName = Services::get('context')->moveTemporaryFile($submissionContext, $temporaryFile, $fileNameBase, $userId, $localeKey);
745 
746  if ($fileName) {
747  if ($isImage) {
748  return [
749  'altText' => !empty($value['altText']) ? $value['altText'] : '',
750  'dateUploaded' => \Core::getCurrentDate(),
751  'uploadName' => $fileName,
752  ];
753  } else {
754  return [
755  'dateUploaded' => \Core::getCurrentDate(),
756  'uploadName' => $fileName,
757  ];
758  }
759  }
760 
761  return false;
762  }
763 }
PKP\Services
PKP\Services\PKPPublicationService\getQueryBuilder
getQueryBuilder($args=[])
Definition: PKPPublicationService.inc.php:97
DBResultRange
Container class for range information when retrieving a result set.
Definition: DBResultRange.inc.php:17
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
DAOResultFactory
Wrapper around ADORecordSet providing "factory" features for generating objects from DAOs.
Definition: DAOResultFactory.inc.php:21
ValidatorFactory\temporaryFilesExist
static temporaryFilesExist($validator, $uploadProps, $multilingualUploadProps, $props, $allowedLocales, $userId)
Definition: ValidatorFactory.inc.php:354
PKP\Services\PKPPublicationService\version
version($publication, $request)
Definition: PKPPublicationService.inc.php:455
PKPPublicationQueryBuilder
Class for building database queries for publications.
PKP\Services\PKPPublicationService\_saveFileParam
_saveFileParam($publication, $submission, $value, $settingName, $userId, $localeKey='', $isImage=false)
Definition: PKPPublicationService.inc.php:700
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
PKP\Services\SCHEMA_PUBLICATION
const SCHEMA_PUBLICATION
Definition: PKPSchemaService.inc.php:23
PKP\Services\QueryBuilders\PKPPublicationQueryBuilder
Definition: PKPPublicationQueryBuilder.inc.php:20
ValidatorFactory\allowedLocales
static allowedLocales($validator, $multilingualProps, $allowedLocales)
Definition: ValidatorFactory.inc.php:320
SubmissionLog
Static class for adding / accessing PKP log entries.
Definition: SubmissionLog.inc.php:23
Application
Class describing this application.
Definition: Application.inc.php:36
SubmissionLog\logEvent
static logEvent($request, $submission, $eventType, $messageKey, $params=array())
Definition: SubmissionLog.inc.php:34
PKP\Services\PKPPublicationService\add
add($publication, $request)
Definition: PKPPublicationService.inc.php:404
ValidatorFactory\required
static required($validator, $action, $requiredProps, $multilingualProps, $allowedLocales, $primaryLocale)
Definition: ValidatorFactory.inc.php:261
HookRegistry
Class for linking core functionality with plugins.
Definition: HookRegistry.inc.php:21
PKP\Services\PKPPublicationService\getProperties
getProperties($publication, $props, $args=null)
Definition: PKPPublicationService.inc.php:127
PKP\Services\PKPPublicationService\edit
edit($publication, $params, $request)
Definition: PKPPublicationService.inc.php:498
PKP\Services\PKPPublicationService\getCount
getCount($args=[])
Definition: PKPPublicationService.inc.php:45
ValidatorFactory\make
static make($props, $rules, $messages=[])
Definition: ValidatorFactory.inc.php:38
PKP\Services\PKPPublicationService\publish
publish($publication)
Definition: PKPPublicationService.inc.php:550
PKP\Services\PKPPublicationService
Definition: PKPPublicationService.inc.php:32
PKP\Services\PKPPublicationService\unpublish
unpublish($publication)
Definition: PKPPublicationService.inc.php:622
PKP\Services\PKPPublicationService\getMax
getMax($args=[])
Definition: PKPPublicationService.inc.php:86
Core\getCurrentDate
static getCurrentDate($ts=null)
Definition: Core.inc.php:63
PKP\Services\PKPPublicationService\validatePublish
validatePublish($publication, $submission, $allowedLocales, $primaryLocale)
Definition: PKPPublicationService.inc.php:382
PKP\Services\PKPPublicationService\getIds
getIds($args=[])
Definition: PKPPublicationService.inc.php:52
PKP\Services\PKPPublicationService\getFullProperties
getFullProperties($publication, $args=null)
Definition: PKPPublicationService.inc.php:241
Application\getSubmissionSearchIndex
static getSubmissionSearchIndex()
Definition: Application.inc.php:169
PKP\Services\PKPPublicationService\getDateBoundaries
getDateBoundaries($args)
Definition: PKPPublicationService.inc.php:253
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
PKP\Services\PKPPublicationService\validate
validate($action, $props, $allowedLocales, $primaryLocale)
Definition: PKPPublicationService.inc.php:267
Application\getSubmissionSearchDAO
static getSubmissionSearchDAO()
Definition: Application.inc.php:177
HookRegistry\call
static call($hookName, $args=null)
Definition: HookRegistry.inc.php:86
PKP\Services\PKPPublicationService\getMany
getMany($args=[])
Definition: PKPPublicationService.inc.php:66
PKP\Services\PKPPublicationService\getSummaryProperties
getSummaryProperties($publication, $args=null)
Definition: PKPPublicationService.inc.php:232
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49