Open Journal Systems  3.3.0
QuickSubmitForm.inc.php
1 <?php
2 
17 import('lib.pkp.classes.form.Form');
18 import('classes.submission.SubmissionMetadataFormImplementation');
19 import('classes.publication.Publication');
20 
21 class QuickSubmitForm extends Form {
23  protected $_request;
24 
26  protected $_submission;
27 
29  protected $context;
30 
33 
39  function __construct($plugin, $request) {
40  parent::__construct($plugin->getTemplateResource('index.tpl'));
41 
42  $this->_request = $request;
43  $this->_context = $request->getContext();
44 
45  $this->_metadataFormImplem = new SubmissionMetadataFormImplementation($this);
46 
47  $locale = $request->getUserVar('locale');
48  if ($locale && ($locale != AppLocale::getLocale())) {
49  $this->setDefaultFormLocale($locale);
50  }
51 
52  if ($submissionId = $request->getUserVar('submissionId')) {
53  $submissionDao = Application::getSubmissionDAO();
54  $this->_submission = $submissionDao->getById($submissionId);
55  if ($this->_submission->getContextId() != $this->_context->getId()) throw new Exeption('Submission not in context!');
56  $this->_submission->setLocale($this->getDefaultFormLocale());
57  $submissionDao->updateObject($this->_submission);
58 
59  $this->_metadataFormImplem->addChecks($this->_submission);
60  }
61 
62  $this->addCheck(new FormValidatorPost($this));
63  $this->addCheck(new FormValidatorCSRF($this));
64  $this->addCheck(new FormValidatorCustom($this, 'sectionId', 'required', 'author.submit.form.sectionRequired', array(DAORegistry::getDAO('SectionDAO'), 'sectionExists'), array($this->_context->getId())));
65 
66  // Validation checks for this form
67  $supportedSubmissionLocales = $this->_context->getSupportedSubmissionLocales();
68  if (!is_array($supportedSubmissionLocales) || count($supportedSubmissionLocales) < 1)
69  $supportedSubmissionLocales = array($this->_context->getPrimaryLocale());
70  $this->addCheck(new FormValidatorInSet($this, 'locale', 'required', 'submission.submit.form.localeRequired', $supportedSubmissionLocales));
71 
72  $this->addCheck(new FormValidatorURL($this, 'licenseUrl', 'optional', 'form.url.invalid'));
73  }
74 
79  function getSubmission() {
80  return $this->_submission;
81  }
82 
87  function getLocaleFieldNames() {
88  return $this->_metadataFormImplem->getLocaleFieldNames();
89  }
90 
94  function display($request = null, $template = null) {
95  $templateMgr = TemplateManager::getManager($request);
96 
97  $templateMgr->assign(
98  'supportedSubmissionLocaleNames',
99  $this->_context->getSupportedSubmissionLocaleNames()
100  );
101 
102  // Tell the form what fields are enabled (and which of those are required)
103  foreach (Application::getMetadataFields() as $field) {
104  $templateMgr->assign(array(
105  $field . 'Enabled' => in_array($this->_context->getData($field), array(METADATA_ENABLE, METADATA_REQUEST, METADATA_REQUIRE)),
106  $field . 'Required' => $this->_context->getData($field) === METADATA_REQUIRE,
107  ));
108  }
109 
110  // Cover image delete link action
111  $locale = AppLocale::getLocale();
112 
113  import('lib.pkp.classes.linkAction.LinkAction');
114  import('lib.pkp.classes.linkAction.request.AjaxModal');
115  $router = $this->_request->getRouter();
116  $templateMgr->assign('openCoverImageLinkAction', new LinkAction(
117  'uploadFile',
118  new AjaxModal(
119  $router->url($this->_request, null, null, 'importexport', array('plugin', 'QuickSubmitPlugin', 'uploadCoverImage'), array(
120  'coverImage' => $this->_submission->getCoverImage($locale),
121  'submissionId' => $this->_submission->getId(),
122  'publicationId' => $this->_submission->getCurrentPublication()->getId(),
123  // This action can be performed during any stage,
124  // but we have to provide a stage id to make calls
125  // to IssueEntryTabHandler
126  'stageId' => WORKFLOW_STAGE_ID_PRODUCTION,
127  )),
128  __('common.upload'),
129  'modal_add_file'
130  ),
131  __('common.upload'),
132  'add'
133  ));
134 
135  // Get section for this context
136  $sectionDao = DAORegistry::getDAO('SectionDAO');
137  $sectionOptions = array('0' => '') + $sectionDao->getTitlesByContextId($this->_context->getId());
138  $templateMgr->assign('sectionOptions', $sectionOptions);
139 
140  // Get published Issues
141  $issueDao = DAORegistry::getDAO('IssueDAO');
142  $issuesIterator = $issueDao->getIssues($this->_context->getId());
143  $issues = $issuesIterator->toArray();
144  $templateMgr->assign('hasIssues', count($issues) > 0);
145 
146  // Get Issues
147  $templateMgr->assign(array(
148  'issueOptions' => $this->getIssueOptions($this->_context),
149  'submission' => $this->_submission,
150  'locale' => $this->getDefaultFormLocale(),
151  'publicationId' => $this->_submission->getCurrentPublication()->getId(),
152  ));
153 
154  $sectionDao = DAORegistry::getDAO('SectionDAO');
155  $sectionId = $this->getData('sectionId') ?: $this->_submission->getSectionId();
156  $section = $sectionDao->getById($sectionId, $this->_context->getId());
157  $templateMgr->assign(array(
158  'wordCount' => $section->getAbstractWordCount(),
159  'abstractsRequired' => !$section->getAbstractsNotRequired(),
160  ));
161 
162  parent::display($request, $template);
163  }
164 
168  function validate($callHooks = true) {
169  if (!parent::validate($callHooks)) return false;
170 
171  // Validate Issue if Published is selected
172  // if articleStatus == 1 => should have issueId
173  if ($this->getData('articleStatus') == 1) {
174  if ($this->getData('issueId') <= 0) {
175  $this->addError('issueId', __('plugins.importexport.quickSubmit.selectIssue'));
176  $this->errorFields['issueId'] = 1;
177 
178  return false;
179  }
180  }
181 
182  return true;
183 
184  }
185 
189  function initData() {
190  $this->_data = array();
191 
192  if (!$this->_submission) {
193  $this->_data['locale'] = $this->getDefaultFormLocale();
194 
195  // Get Sections
196  $sectionDao = DAORegistry::getDAO('SectionDAO');
197  $sectionOptions = $sectionDao->getTitlesByContextId($this->_context->getId());
198 
199  // Create and insert a new submission
200  $submissionDao = Application::getSubmissionDAO();
201  $this->_submission = $submissionDao->newDataObject();
202  $this->_submission->setContextId($this->_context->getId());
203  $this->_submission->setStatus(STATUS_QUEUED);
204  $this->_submission->setSubmissionProgress(1);
205  $this->_submission->stampStatusModified();
206  $this->_submission->setStageId(WORKFLOW_STAGE_ID_SUBMISSION);
207  $this->_submission->setData('sectionId', $sectionId = current(array_keys($sectionOptions)));
208  $this->_submission->setLocale($this->getDefaultFormLocale());
209 
210  // Insert the submission
211  $this->_submission = Services::get('submission')->add($this->_submission, $this->_request);
212  $this->setData('submissionId', $this->_submission->getId());
213 
214  $publication = new Publication();
215  $publication->setData('submissionId', $this->_submission->getId());
216  $publication->setData('locale', $this->getDefaultFormLocale());
217  $publication->setData('language', PKPString::substr($this->getDefaultFormLocale(), 0, 2));
218  $publication->setData('sectionId', $sectionId);
219  $publication->setData('status', STATUS_QUEUED);
220  $publication->setData('version', 1);
221  $publication = Services::get('publication')->add($publication, $this->_request);
222  $this->_submission = Services::get('submission')->edit($this->_submission, ['currentPublicationId' => $publication->getId()], $this->_request);
223 
224  $this->_metadataFormImplem->initData($this->_submission);
225 
226  // Add the user manager group (first that is found) to the stage_assignment for that submission
227  $user = $this->_request->getUser();
228 
229  $userGroupAssignmentDao = DAORegistry::getDAO('UserGroupAssignmentDAO');
230  $userGroupDao = DAORegistry::getDAO('UserGroupDAO');
231 
232  $userGroupId = null;
233  $managerUserGroupAssignments = $userGroupAssignmentDao->getByUserId($user->getId(), $this->_context->getId(), ROLE_ID_MANAGER);
234  if($managerUserGroupAssignments) {
235  while($managerUserGroupAssignment = $managerUserGroupAssignments->next()) {
236  $managerUserGroup = $userGroupDao->getById($managerUserGroupAssignment->getUserGroupId());
237  $userGroupId = $managerUserGroup->getId();
238  break;
239  }
240  }
241 
242  // Assign the user author to the stage
243  $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO');
244  $stageAssignmentDao->build($this->_submission->getId(), $userGroupId, $user->getId());
245  }
246  }
247 
251  function readInputData() {
252  $this->_metadataFormImplem->readInputData();
253 
254  $this->readUserVars(
255  array(
256  'issueId',
257  'pages',
258  'datePublished',
259  'licenseUrl',
260  'copyrightHolder',
261  'copyrightYear',
262  'sectionId',
263  'submissionId',
264  'articleStatus',
265  'locale'
266  )
267  );
268  }
269 
273  function cancel() {
274  $submissionDao = Application::getSubmissionDAO();
275  $submission = $submissionDao->getById($this->getData('submissionId'));
276  if ($this->_submission->getContextId() != $this->_context->getId()) throw new Exeption('Submission not in context!');
277  if ($submission) $submissionDao->deleteById($submission->getId());
278  }
279 
283  function execute(...$functionParams) {
284  // Execute submission metadata related operations.
285  $this->_metadataFormImplem->execute($this->_submission, $this->_request);
286 
287  // Copy GalleyFiles to Submission Files
288  // Get Galley Files by SubmissionId
289  $galleyDao = DAORegistry::getDAO('ArticleGalleyDAO');
290  $galleyFilesRes = $galleyDao->getByPublicationId($this->_submission->getCurrentPublication()->getId());
291 
292  if (!is_null($galleyFilesRes)) {
293  $galleyFiles = $galleyFilesRes->toAssociativeArray();
294 
295  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
296  import('lib.pkp.classes.file.SubmissionFileManager');
297  $submissionFileManager = new SubmissionFileManager($this->_context->getId(), $this->_submission->getId());
298 
299  foreach($galleyFiles as $galleyFile) {
300  $newFile = $galleyFile->getFile();
301  if ($newFile) {
302  $revisionNumber = $submissionFileDao->getLatestRevisionNumber($newFile->getFileId());
303  $submissionFileManager->copyFileToFileStage($newFile->getFileId(), $revisionNumber, SUBMISSION_FILE_SUBMISSION, null, true);
304  }
305  }
306  }
307 
308  $this->_submission->setLocale($this->getData('locale'));
309  $this->_submission->setStageId(WORKFLOW_STAGE_ID_PRODUCTION);
310  $this->_submission->setDateSubmitted(Core::getCurrentDate());
311  $this->_submission->setSubmissionProgress(0);
312 
313  parent::execute($this->_submission, ...$functionParams);
314 
315  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
316  $submissionDao->updateObject($this->_submission);
317  $this->_submission = $submissionDao->getById($this->_submission->getId());
318 
319  $publication = $this->_submission->getCurrentPublication();
320  if ($publication->getData('sectionId') !== (int) $this->getData('sectionId')) {
321  $publication = Services::get('publication')->edit($publication, ['sectionId' => (int) $this->getData('sectionId')], $this->_request);
322  }
323 
324  if ($this->getData('articleStatus') == 1) {
325  $publication->setData('copyrightYear', $this->getData('copyrightYear'));
326  $publication->setData('copyrightHolder', $this->getData('copyrightHolder'), null);
327  $publication->setData('licenseUrl', $this->getData('licenseUrl'));
328  $publication->setData('pages', $this->getData('pages'));
329  $publication->setData('datePublished', $this->getData('datePublished'));
330  $publication->setData('accessStatus', ARTICLE_ACCESS_ISSUE_DEFAULT);
331  $publication->setData('issueId', (int) $this->getData('issueId'));
332 
333  // If other articles in this issue have a custom sequence, put this at the end
334  $otherSubmissionsInSection = Services::get('submission')->getMany([
335  'contextId' => $this->_request->getContext()->getId(),
336  'issueIds' => [$publication->getData('issueId')],
337  'sectionIds' => [$publication->getData('sectionId')],
338  ]);
339  if (count($otherSubmissionsInSection)) {
340  $maxSequence = 0;
341  foreach ($otherSubmissionsInSection as $submission) {
342  if ($submission->getCurrentPublication()->getData('seq')) {
343  $maxSequence = max($maxSequence, $submission->getCurrentPublication()->getData('seq'));
344  }
345  }
346  $publication->setData('seq', $maxSequence + 1);
347  }
348 
349  $publication = Services::get('publication')->publish($publication);
350 
351  // If this submission's issue uses custom section ordering and this is the first
352  // article published in a section, make sure we enter a custom ordering
353  // for that section to place it at the end.
354  if (DAORegistry::getDAO('SectionDAO')->customSectionOrderingExists($publication->getData('issueId'))) {
355  $sectionOrder = DAORegistry::getDAO('SectionDAO')->getCustomSectionOrder($publication->getData('issueId'), $publication->getData('sectionId'));
356  if ($sectionOrder === null) {
357  DAORegistry::getDAO('SectionDAO')->insertCustomSectionOrder($publication->getData('issueId'), $publication->getData('sectionId'), REALLY_BIG_NUMBER);
358  DAORegistry::getDAO('SectionDAO')->resequenceCustomSectionOrders($publication->getData('issueId'));
359  }
360  }
361  }
362 
363  // Index article.
364  $articleSearchIndex = Application::getSubmissionSearchIndex();
365  $articleSearchIndex->submissionMetadataChanged($this->_submission);
366  $articleSearchIndex->submissionFilesChanged($this->_submission);
367  $articleSearchIndex->submissionChangesFinished();
368 
369  }
370 
376  function getIssueOptions($journal) {
377  $issuesPublicationDates = array();
378  $issueOptions = array();
379  $journalId = $journal->getId();
380 
381  $issueDao = DAORegistry::getDAO('IssueDAO');
382 
383  $issueOptions[-1] = '------ ' . __('editor.issues.futureIssues') . ' ------';
384  $issueIterator = $issueDao->getUnpublishedIssues($journalId);
385  while ($issue = $issueIterator->next()) {
386  $issueOptions[$issue->getId()] = $issue->getIssueIdentification();
387  $issuesPublicationDates[$issue->getId()] = strftime(Config::getVar('general', 'date_format_short'), strtotime(Core::getCurrentDate()));
388  }
389  $issueOptions[-2] = '------ ' . __('editor.issues.currentIssue') . ' ------';
390  $issuesIterator = $issueDao->getPublishedIssues($journalId);
391  $issues = $issuesIterator->toArray();
392  if (isset($issues[0]) && $issues[0]->getCurrent()) {
393  $issueOptions[$issues[0]->getId()] = $issues[0]->getIssueIdentification();
394  $issuesPublicationDates[$issues[0]->getId()] = strftime(Config::getVar('general', 'date_format_short'), strtotime($issues[0]->getDatePublished()));
395  array_shift($issues);
396  }
397  $issueOptions[-3] = '------ ' . __('editor.issues.backIssues') . ' ------';
398  foreach ($issues as $issue) {
399  $issueOptions[$issue->getId()] = $issue->getIssueIdentification();
400  $issuesPublicationDates[$issue->getId()] = strftime(Config::getVar('general', 'date_format_short'), strtotime($issues[0]->getDatePublished()));
401  }
402 
403  $templateMgr = TemplateManager::getManager($this->_request);
404  $templateMgr->assign('issuesPublicationDates', json_encode($issuesPublicationDates));
405 
406  return $issueOptions;
407  }
408 }
409 
SubmissionFileManager
Helper class for database-backed submission file management tasks.
Definition: SubmissionFileManager.inc.php:30
QuickSubmitForm\cancel
cancel()
Definition: QuickSubmitForm.inc.php:285
QuickSubmitForm\getLocaleFieldNames
getLocaleFieldNames()
Definition: QuickSubmitForm.inc.php:99
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
PKPString\substr
static substr($string, $start, $length=null)
Definition: PKPString.inc.php:160
Form\setData
setData($key, $value=null)
Definition: Form.inc.php:229
Form\readUserVars
readUserVars($vars)
Definition: Form.inc.php:378
Form\getData
getData($key)
Definition: Form.inc.php:220
FormValidatorPost
Form validation check to make sure the form is POSTed.
Definition: FormValidatorPost.inc.php:18
QuickSubmitForm\execute
execute(... $functionParams)
Definition: QuickSubmitForm.inc.php:295
Form\addError
addError($field, $message)
Definition: Form.inc.php:404
Form\setDefaultFormLocale
setDefaultFormLocale($defaultLocale)
Definition: Form.inc.php:356
QuickSubmitForm\__construct
__construct($plugin, $request)
Definition: QuickSubmitForm.inc.php:51
QuickSubmitForm\display
display($request=null, $template=null)
Definition: QuickSubmitForm.inc.php:106
Publication
Class for Publication.
Definition: Publication.inc.php:18
Config\getVar
static getVar($section, $key, $default=null)
Definition: Config.inc.php:35
AjaxModal
A modal that retrieves its content from via AJAX.
Definition: AjaxModal.inc.php:18
LinkAction
Base class defining an action that can be performed by the user in the user interface.
Definition: LinkAction.inc.php:22
Seboettg\Collection\count
count()
Definition: ArrayListTrait.php:253
Application\getSubmissionDAO
static getSubmissionDAO()
Definition: Application.inc.php:146
QuickSubmitForm\validate
validate($callHooks=true)
Definition: QuickSubmitForm.inc.php:180
Form\getDefaultFormLocale
getDefaultFormLocale()
Definition: Form.inc.php:346
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
PKPApplication\getMetadataFields
static getMetadataFields()
Definition: PKPApplication.inc.php:830
QuickSubmitForm\$_submission
$_submission
Definition: QuickSubmitForm.inc.php:32
QuickSubmitForm\initData
initData()
Definition: QuickSubmitForm.inc.php:201
QuickSubmitForm\$_metadataFormImplem
$_metadataFormImplem
Definition: QuickSubmitForm.inc.php:44
Core\getCurrentDate
static getCurrentDate($ts=null)
Definition: Core.inc.php:63
Form\addCheck
addCheck($formValidator)
Definition: Form.inc.php:395
QuickSubmitForm\$context
$context
Definition: QuickSubmitForm.inc.php:38
QuickSubmitForm\$_request
$_request
Definition: QuickSubmitForm.inc.php:26
FormValidatorInSet
Form validation check that checks if value is within a certain set.
Definition: FormValidatorInSet.inc.php:18
FormValidatorCSRF
Form validation check to make sure the CSRF token is correct.
Definition: FormValidatorCSRF.inc.php:18
Form
Class defining basic operations for handling HTML forms.
Definition: Form.inc.php:47
SubmissionMetadataFormImplementation
This can be used by other forms that want to implement submission metadata data and form operations.
Definition: SubmissionMetadataFormImplementation.inc.php:19
Application\getSubmissionSearchIndex
static getSubmissionSearchIndex()
Definition: Application.inc.php:169
QuickSubmitForm\getIssueOptions
getIssueOptions($journal)
Definition: QuickSubmitForm.inc.php:388
FormValidatorCustom
Form validation check with a custom user function performing the validation check.
Definition: FormValidatorCustom.inc.php:18
QuickSubmitForm
Form for QuickSubmit one-page submission plugin.
Definition: QuickSubmitForm.inc.php:21
AppLocale\getLocale
static getLocale()
Definition: env1/MockAppLocale.inc.php:40
GuzzleHttp\json_encode
json_encode($value, $options=0, $depth=512)
Definition: guzzlehttp/guzzle/src/functions.php:324
QuickSubmitForm\readInputData
readInputData()
Definition: QuickSubmitForm.inc.php:263
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49
QuickSubmitForm\getSubmission
getSubmission()
Definition: QuickSubmitForm.inc.php:91