Open Journal Systems  3.3.0
PKPSubmissionSubmitStep1Form.inc.php
1 <?php
2 
16 import('lib.pkp.classes.submission.form.SubmissionSubmitForm');
17 import('classes.publication.Publication');
18 
21  public $hasPrivacyStatement = true;
22 
28  function __construct($context, $submission = null) {
29  parent::__construct($context, $submission, 1);
30 
31  $enableSiteWidePrivacyStatement = Config::getVar('general', 'sitewide_privacy_statement');
32  if (!$enableSiteWidePrivacyStatement && $context) {
33  $this->hasPrivacyStatement = (boolean) $context->getData('privacyStatement');
34  } else {
35  $this->hasPrivacyStatement = (boolean) Application::get()->getRequest()->getSite()->getData('privacyStatement');
36  }
37 
38  // Validation checks for this form
39  $supportedSubmissionLocales = $context->getSupportedSubmissionLocales();
40  if (!is_array($supportedSubmissionLocales) || count($supportedSubmissionLocales) < 1) $supportedSubmissionLocales = array($context->getPrimaryLocale());
41  $this->addCheck(new FormValidatorInSet($this, 'locale', 'required', 'submission.submit.form.localeRequired', $supportedSubmissionLocales));
42  if ((boolean) $context->getData('copyrightNotice')) {
43  $this->addCheck(new FormValidator($this, 'copyrightNoticeAgree', 'required', 'submission.submit.copyrightNoticeAgreeRequired'));
44  }
45  $this->addCheck(new FormValidator($this, 'userGroupId', 'required', 'submission.submit.availableUserGroupsDescription'));
46  if ($this->hasPrivacyStatement) {
47  $this->addCheck(new FormValidator($this, 'privacyConsent', 'required', 'user.profile.form.privacyConsentRequired'));
48  }
49 
50  foreach ((array) $context->getLocalizedData('submissionChecklist') as $key => $checklistItem) {
51  $this->addCheck(new FormValidator($this, "checklist-$key", 'required', 'submission.submit.checklistErrors'));
52  }
53  }
54 
59  function validate($callHooks = true) {
60  if (!parent::validate($callHooks)) return false;
61 
62  // Ensure that the user is in the specified userGroupId or trying to enroll an allowed role
63  $userGroupId = (int) $this->getData('userGroupId');
64  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
65  $request = Application::get()->getRequest();
66  $context = $request->getContext();
67  $user = $request->getUser();
68  if (!$user) return false;
69 
70  if ($userGroupDao->userInGroup($user->getId(), $userGroupId)) {
71  return true;
72  }
73  $userGroup = $userGroupDao->getById($userGroupId, $context->getId());
74  if ($userGroup->getPermitSelfRegistration()){
75  return true;
76  }
77 
78  return false;
79  }
80 
84  function fetch($request, $template = null, $display = false) {
85  $user = $request->getUser();
86  $templateMgr = TemplateManager::getManager($request);
87 
88  $templateMgr->assign(
89  'supportedSubmissionLocaleNames',
90  $this->context->getSupportedSubmissionLocaleNames()
91  );
92 
93  // if this context has a copyright notice that the author must agree to, present the form items.
94  if ((boolean) $this->context->getData('copyrightNotice')) {
95  $templateMgr->assign('copyrightNotice', $this->context->getLocalizedData('copyrightNotice'));
96  $templateMgr->assign('copyrightNoticeAgree', true);
97  }
98 
99  $userGroupAssignmentDao = DAORegistry::getDAO('UserGroupAssignmentDAO'); /* @var $userGroupAssignmentDao UserGroupAssignmentDAO */
100  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
101  $userGroupNames = array();
102 
103  // List existing user roles
104  $managerUserGroupAssignments = $userGroupAssignmentDao->getByUserId($user->getId(), $this->context->getId(), ROLE_ID_MANAGER);
105  $authorUserGroupAssignments = $userGroupAssignmentDao->getByUserId($user->getId(), $this->context->getId(), ROLE_ID_AUTHOR);
106 
107  // List available author roles
108  $availableAuthorUserGroups = $userGroupDao->getUserGroupsByStage($this->context->getId(), WORKFLOW_STAGE_ID_SUBMISSION, ROLE_ID_AUTHOR);
109  $availableUserGroupNames = array();
110  while($authorUserGroup = $availableAuthorUserGroups->next()) {
111  if ($authorUserGroup->getPermitSelfRegistration()){
112  $availableUserGroupNames[$authorUserGroup->getId()] = $authorUserGroup->getLocalizedName();
113  }
114  }
115 
116  // Set default group to default author group
117  $defaultGroup = $userGroupDao->getDefaultByRoleId($this->context->getId(), ROLE_ID_AUTHOR);
118  $noExistingRoles = false;
119  $managerGroups = false;
120 
121  // If the user has manager roles, add manager roles and available author roles to selection
122  if (!$managerUserGroupAssignments->wasEmpty()) {
123  while($managerUserGroupAssignment = $managerUserGroupAssignments->next()) {
124  $managerUserGroup = $userGroupDao->getById($managerUserGroupAssignment->getUserGroupId());
125  $userGroupNames[$managerUserGroup->getId()] = $managerUserGroup->getLocalizedName();
126  }
127  $managerGroups = join(__('common.commaListSeparator'), $userGroupNames);
128  $userGroupNames = array_replace($userGroupNames, $availableUserGroupNames);
129 
130  // Set default group to default manager group
131  $defaultGroup = $userGroupDao->getDefaultByRoleId($this->context->getId(), ROLE_ID_MANAGER);
132 
133  // else if the user only has existing author roles, add to selection
134  } else if (!$authorUserGroupAssignments->wasEmpty()) {
135  while($authorUserGroupAssignment = $authorUserGroupAssignments->next()) {
136  $authorUserGroup = $userGroupDao->getById($authorUserGroupAssignment->getUserGroupId());
137  $userGroupNames[$authorUserGroup->getId()] = $authorUserGroup->getLocalizedName();
138  }
139 
140  // else the user has no roles, only add available author roles to selection
141  } else {
142  $userGroupNames = $availableUserGroupNames;
143  $noExistingRoles = true;
144  }
145 
146  $templateMgr->assign([
147  'managerGroups' => $managerGroups,
148  'userGroupOptions' => $userGroupNames,
149  'defaultGroup' => $defaultGroup,
150  'noExistingRoles' => $noExistingRoles,
151  'hasPrivacyStatement' => $this->hasPrivacyStatement,
152  ]);
153 
154  // Categories list
155  $assignedCategories = [];
156  $categoryDao = DAORegistry::getDAO('CategoryDAO'); /* @var $categoryDao CategoryDAO */
157 
158  if (isset($this->submission)) {
159  $categories = $categoryDao->getByPublicationId($this->submission->getCurrentPublication()->getId());
160  while ($category = $categories->next()) {
161  $assignedCategories[] = $category->getId();
162  }
163  }
164 
165  $items = [];
166  $categoryDao = DAORegistry::getDAO('CategoryDAO'); /* @var $categoryDao CategoryDAO */
167  $categories = $categoryDao->getByContextId($this->context->getId())->toAssociativeArray();
168  foreach ($categories as $category) {
169  $title = $category->getLocalizedTitle();
170  if ($category->getParentId()) {
171  $title = $categories[$category->getParentId()]->getLocalizedTitle() . ' > ' . $title;
172  }
173  $items[(int) $category->getId()] = $title;
174  }
175  $templateMgr->assign(array(
176  'assignedCategories' => $assignedCategories,
177  'categories' => $items,
178  ));
179 
180  return parent::fetch($request, $template, $display);
181  }
182 
188  function initData($data = array()) {
189  if (isset($this->submission)) {
190  $query = $this->getCommentsToEditor($this->submissionId);
191  $this->_data = array_merge($data, array(
192  'locale' => $this->submission->getLocale(),
193  'commentsToEditor' => $query ? $query->getHeadNote()->getContents() : '',
194  ));
195  } else {
196  $supportedSubmissionLocales = $this->context->getSupportedSubmissionLocales();
197  // Try these locales in order until we find one that's
198  // supported to use as a default.
199  $keys = array_keys($supportedSubmissionLocales);
200  $tryLocales = array(
201  AppLocale::getLocale(), // Current UI locale
202  $this->context->getPrimaryLocale(), // Context locale
203  $supportedSubmissionLocales[array_shift($keys)] // Fallback: first one on the list
204  );
205  $this->_data = $data;
206  foreach ($tryLocales as $locale) {
207  if (in_array($locale, $supportedSubmissionLocales)) {
208  // Found a default to use
209  $this->_data['locale'] = $locale;
210  break;
211  }
212  }
213  }
214  }
215 
219  function readInputData() {
220  $vars = array(
221  'userGroupId', 'locale', 'copyrightNoticeAgree', 'commentsToEditor','privacyConsent', 'categories'
222  );
223  foreach ((array) $this->context->getLocalizedData('submissionChecklist') as $key => $checklistItem) {
224  $vars[] = "checklist-$key";
225  }
226 
227  $this->readUserVars($vars);
228  }
229 
234  function setSubmissionData($submission) { }
235 
241  function setPublicationData($publication, $submission) {
242  $publication->setData('submissionId', $submission->getId());
243  $oldLocale = $publication->getData('locale');
244  $publication->setData('locale', $this->getData('locale'));
245  $publication->setData('language', PKPString::substr($this->getData('locale'), 0, 2));
246  if ($oldLocale && $oldLocale != $this->getData('locale')) {
247  $authorDao = DAORegistry::getDAO('AuthorDAO'); /* @var $authorDao AuthorDAO */
248  $authorDao->changePublicationLocale($publication->getId(), $oldLocale, $this->getData('locale'));
249  }
250  }
251 
259  function setCommentsToEditor($submissionId, $commentsToEditor, $userId, $query = null) {
260  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
261  $noteDao = DAORegistry::getDAO('NoteDAO'); /* @var $noteDao NoteDAO */
262 
263  if (!isset($query)){
264  if ($commentsToEditor) {
265  $subEditorsDAO = DAORegistry::getDAO('SubEditorsDAO');
266 
267  $query = $queryDao->newDataObject();
268  $query->setAssocType(ASSOC_TYPE_SUBMISSION);
269  $query->setAssocId($submissionId);
270  $query->setStageId(WORKFLOW_STAGE_ID_SUBMISSION);
271  $query->setSequence(REALLY_BIG_NUMBER);
272  $queryDao->insertObject($query);
273  $queryDao->resequence(ASSOC_TYPE_SUBMISSION, $submissionId);
274  $queryId = $query->getId();
275 
276  $userIds = array_keys([$userId => null] + $subEditorsDAO->getBySubmissionGroupId($this->submission->getSectionId(), ASSOC_TYPE_SECTION, $this->submission->getContextId()));
277  foreach (array_unique($userIds) as $id) {
278  $queryDao->insertParticipant($queryId, $id);
279  }
280 
281  $note = $noteDao->newDataObject();
282  $note->setUserId($userId);
283  $note->setAssocType(ASSOC_TYPE_QUERY);
284  $note->setTitle(__('submission.submit.coverNote'));
285  $note->setContents($commentsToEditor);
286  $note->setDateCreated(Core::getCurrentDate());
287  $note->setDateModified(Core::getCurrentDate());
288  $note->setAssocId($queryId);
289  $noteDao->insertObject($note);
290  }
291  } else{
292  $queryId = $query->getId();
293  $notes = $noteDao->getByAssoc(ASSOC_TYPE_QUERY, $queryId);
294  if (!$notes->wasEmpty()) {
295  $note = $notes->next();
296  if ($commentsToEditor) {
297  $note->setContents($commentsToEditor);
298  $note->setDateModified(Core::getCurrentDate());
299  $noteDao->updateObject($note);
300  } else {
301  $noteDao->deleteObject($note);
302  $queryDao->deleteObject($query);
303  }
304  }
305  }
306  }
307 
314  $query = null;
315  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
316  $queries = $queryDao->getByAssoc(ASSOC_TYPE_SUBMISSION, $submissionId);
317  if ($queries) $query = $queries->next();
318  return $query;
319  }
320 
325  function execute(...$functionArgs) {
326  parent::execute(...$functionArgs);
327 
328  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
329  $request = Application::get()->getRequest();
330  $user = $request->getUser();
331  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
332 
333  // Enroll user if needed
334  $userGroupId = (int) $this->getData('userGroupId');
335  if (!$userGroupDao->userInGroup($user->getId(), $userGroupId)) {
336  $userGroupDao->assignUserToGroup($user->getId(), $userGroupId);
337  }
338 
339  if (isset($this->submission)) {
340  // Update existing submission
341  $this->setSubmissionData($this->submission);
342  if ($this->submission->getSubmissionProgress() <= $this->step) {
343  $this->submission->stampLastActivity();
344  $this->submission->stampModified();
345  $this->submission->setSubmissionProgress($this->step + 1);
346  }
347  // Add, remove or update comments to editor
348  $query = $this->getCommentsToEditor($this->submissionId);
349  $this->setCommentsToEditor($this->submissionId, $this->getData('commentsToEditor'), $user->getId(), $query);
350 
351  $submissionDao->updateObject($this->submission);
352 
353  $publication = $this->submission->getCurrentPublication();
354  $this->setPublicationData($publication, $this->submission);
355  $publication = Services::get('publication')->edit($publication, $publication->_data, $request);
356 
357  } else {
358  // Create new submission
359  $this->submission = $submissionDao->newDataObject();
360  $this->submission->setContextId($this->context->getId());
361 
362  $this->setSubmissionData($this->submission);
363 
364  $this->submission->stampLastActivity();
365  $this->submission->stampModified();
366  $this->submission->setSubmissionProgress($this->step + 1);
367  $this->submission->setStageId(WORKFLOW_STAGE_ID_SUBMISSION);
368  // Insert the submission
369  $this->submission = Services::get('submission')->add($this->submission, $request);
370  $this->submissionId = $this->submission->getId();
371 
372  // Create a publication
373  $publication = new Publication();
374  $this->setPublicationData($publication, $this->submission);
375  $publication->setData('status', STATUS_QUEUED);
376  $publication->setData('version', 1);
377  $publication = Services::get('publication')->add($publication, $request);
378  $this->submission = Services::get('submission')->edit($this->submission, ['currentPublicationId' => $publication->getId()], $request);
379 
380  // Set user to initial author
381  $authorDao = DAORegistry::getDAO('AuthorDAO'); /* @var $authorDao AuthorDAO */
382  $author = $authorDao->newDataObject();
383  // if no user names exist for this submission locale,
384  // copy the names in default site primary locale for this locale as well
385  $userGivenNames = $user->getGivenName(null);
386  $userFamilyNames = $user->getFamilyName(null);
387  if (is_null($userFamilyNames)) $userFamilyNames = array();
388  if (empty($userGivenNames[$this->submission->getLocale()])) {
389  $site = Application::get()->getRequest()->getSite();
390  $userGivenNames[$this->submission->getLocale()] = $userGivenNames[$site->getPrimaryLocale()];
391  // then there should also be no family name for the submission locale
392  $userFamilyNames[$this->submission->getLocale()] = !empty($userFamilyNames[$site->getPrimaryLocale()]) ? $userFamilyNames[$site->getPrimaryLocale()] : '';
393  }
394  $author->setGivenName($userGivenNames, null);
395  $author->setFamilyName($userFamilyNames, null);
396  $author->setAffiliation($user->getAffiliation(null), null);
397  $author->setCountry($user->getCountry());
398  $author->setEmail($user->getEmail());
399  $author->setUrl($user->getUrl());
400  $author->setBiography($user->getBiography(null), null);
401  $author->setIncludeInBrowse(1);
402  $author->setOrcid($user->getOrcid());
403  $author->setData('publicationId', $publication->getId());
404 
405  // Get the user group to display the submitter as
406  $author->setUserGroupId($userGroupId);
407 
408  $authorId = $authorDao->insertObject($author);
409  $publication = Services::get('publication')->edit($publication, ['primaryContactId' => $authorId], $request);
410 
411  // Assign the user author to the stage
412  $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); /* @var $stageAssignmentDao StageAssignmentDAO */
413  $stageAssignmentDao->build($this->submissionId, $userGroupId, $user->getId());
414 
415  // Add comments to editor
416  if ($this->getData('commentsToEditor')){
417  $this->setCommentsToEditor($this->submissionId, $this->getData('commentsToEditor'), $user->getId());
418  }
419  }
420 
421  // Save the submission categories
422  $categoryDao = DAORegistry::getDAO('CategoryDAO'); /* @var $categoryDao CategoryDAO */
423  $categoryDao->deletePublicationAssignments($publication->getId());
424  if ($categories = $this->getData('categories')) {
425  foreach ((array) $categories as $categoryId) {
426  $categoryDao->insertPublicationAssignment($categoryId, $publication->getId());
427  }
428  }
429 
430  return $this->submissionId;
431  }
432 }
PKPSubmissionSubmitStep1Form\setCommentsToEditor
setCommentsToEditor($submissionId, $commentsToEditor, $userId, $query=null)
Definition: PKPSubmissionSubmitStep1Form.inc.php:262
PKPSubmissionSubmitStep1Form\readInputData
readInputData()
Definition: PKPSubmissionSubmitStep1Form.inc.php:222
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\readUserVars
readUserVars($vars)
Definition: Form.inc.php:378
PKPSubmissionSubmitStep1Form
Form for Step 1 of author submission: terms, conditions, etc.
Definition: PKPSubmissionSubmitStep1Form.inc.php:19
Form\getData
getData($key)
Definition: Form.inc.php:220
SubmissionSubmitForm\$context
$context
Definition: SubmissionSubmitForm.inc.php:26
PKPSubmissionSubmitStep1Form\execute
execute(... $functionArgs)
Definition: PKPSubmissionSubmitStep1Form.inc.php:328
Publication
Class for Publication.
Definition: Publication.inc.php:18
Config\getVar
static getVar($section, $key, $default=null)
Definition: Config.inc.php:35
SubmissionSubmitForm\$submissionId
$submissionId
Definition: SubmissionSubmitForm.inc.php:32
PKPSubmissionSubmitStep1Form\setPublicationData
setPublicationData($publication, $submission)
Definition: PKPSubmissionSubmitStep1Form.inc.php:244
PKPSubmissionSubmitStep1Form\__construct
__construct($context, $submission=null)
Definition: PKPSubmissionSubmitStep1Form.inc.php:31
Seboettg\Collection\count
count()
Definition: ArrayListTrait.php:253
Form\initData
initData()
Definition: Form.inc.php:240
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
PKPSubmissionSubmitStep1Form\$hasPrivacyStatement
$hasPrivacyStatement
Definition: PKPSubmissionSubmitStep1Form.inc.php:24
PKPSubmissionSubmitStep1Form\fetch
fetch($request, $template=null, $display=false)
Definition: PKPSubmissionSubmitStep1Form.inc.php:87
FormValidator
Class to represent a form validation check.
Definition: FormValidator.inc.php:23
PKPSubmissionSubmitStep1Form\initData
initData($data=array())
Definition: PKPSubmissionSubmitStep1Form.inc.php:191
Core\getCurrentDate
static getCurrentDate($ts=null)
Definition: Core.inc.php:63
Form\addCheck
addCheck($formValidator)
Definition: Form.inc.php:395
PKPSubmissionSubmitStep1Form\setSubmissionData
setSubmissionData($submission)
Definition: PKPSubmissionSubmitStep1Form.inc.php:237
FormValidatorInSet
Form validation check that checks if value is within a certain set.
Definition: FormValidatorInSet.inc.php:18
PKPSubmissionSubmitStep1Form\getCommentsToEditor
getCommentsToEditor($submissionId)
Definition: PKPSubmissionSubmitStep1Form.inc.php:316
SubmissionSubmitForm
Base class for author submit forms.
Definition: SubmissionSubmitForm.inc.php:21
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
PKPSubmissionSubmitStep1Form\validate
validate($callHooks=true)
Definition: PKPSubmissionSubmitStep1Form.inc.php:62
AppLocale\getLocale
static getLocale()
Definition: env1/MockAppLocale.inc.php:40
SubmissionSubmitForm\$submission
$submission
Definition: SubmissionSubmitForm.inc.php:38
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49