Open Journal Systems  3.3.0
pages/submission/PKPSubmissionHandler.inc.php
1 <?php
2 
16 import('classes.handler.Handler');
17 import('lib.pkp.classes.core.JSONMessage');
18 
19 abstract class PKPSubmissionHandler extends Handler {
20 
22  var $_isBackendPage = true;
23 
27  function authorize($request, &$args, $roleAssignments) {
28  // The policy for the submission handler depends on the
29  // step currently requested.
30  $step = isset($args[0]) ? (int) $args[0] : 1;
31  if ($step<1 || $step>$this->getStepCount()) return false;
32 
33  // Do we have a submission present in the request?
34  $submissionId = (int)$request->getUserVar('submissionId');
35 
36  // Are we in step one without a submission present?
37  if ($step === 1 && $submissionId === 0) {
38  // Authorize submission creation. Author role not required.
39  import('lib.pkp.classes.security.authorization.UserRequiredPolicy');
40  $this->addPolicy(new UserRequiredPolicy($request));
42  } else {
43  // Authorize editing of incomplete submissions.
44  import('lib.pkp.classes.security.authorization.SubmissionAccessPolicy');
45  $this->addPolicy(new SubmissionAccessPolicy($request, $args, $roleAssignments, 'submissionId'));
46  }
47 
48  // Do policy checking.
49  if (!parent::authorize($request, $args, $roleAssignments)) return false;
50 
51  // Execute additional checking of the step.
52  // NB: Move this to its own policy for reuse when required in other places.
53  $submission = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION);
54 
55  // Permit if there is no submission set, but request is for initial step.
56  if (!is_a($submission, 'Submission') && $step == 1) return true;
57 
58  // In all other cases we expect an authorized submission due to
59  // the submission access policy above.
60  assert(is_a($submission, 'Submission'));
61 
62  // Deny if submission is complete (==0 means complete) and at
63  // any step other than the "complete" step (the last one)
64  if ($submission->getSubmissionProgress() == 0 && $step != $this->getStepCount() ) return false;
65 
66  // Deny if trying to access a step greater than the current progress
67  if ($submission->getSubmissionProgress() != 0 && $step > $submission->getSubmissionProgress()) return false;
68 
69  return true;
70  }
71 
72 
73  //
74  // Public Handler Methods
75  //
81  function index($args, $request) {
82  $request->redirect(null, null, 'wizard');
83  }
84 
90  function wizard($args, $request) {
91  $this->setupTemplate($request);
92  $templateMgr = TemplateManager::getManager($request);
93  $step = isset($args[0]) ? (int) $args[0] : 1;
94  $templateMgr->assign('step', $step);
95 
96  $templateMgr->assign('sectionId', (int) $request->getUserVar('sectionId')); // to add a sectionId parameter to tab links in template
97 
98  $submission = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION);
99  if ($submission) {
100  $templateMgr->assign('submissionId', $submission->getId());
101  $templateMgr->assign('submissionProgress', (int) $submission->getSubmissionProgress());
102  } else {
103  $templateMgr->assign('submissionProgress', 1);
104  }
105  $templateMgr->assign([
106  'pageTitle' => __('submission.submit.title'),
107  ]);
108  $templateMgr->display('submission/form/index.tpl');
109  }
110 
118  function step($args, $request) {
119  $step = isset($args[0]) ? (int) $args[0] : 1;
120 
121  $context = $request->getContext();
122  $submission = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION);
123 
124  $this->setupTemplate($request);
125 
126  if ( $step < $this->getStepCount() ) {
127  $formClass = "SubmissionSubmitStep{$step}Form";
128  import("classes.submission.form.$formClass");
129 
130  $submitForm = new $formClass($context, $submission);
131  $submitForm->initData();
132  return new JSONMessage(true, $submitForm->fetch($request));
133  } elseif($step == $this->getStepCount()) {
134  $templateMgr = TemplateManager::getManager($request);
135  $templateMgr->assign('context', $context);
136 
137  // Retrieve the correct url for author review his submission.
138  import('classes.core.Services');
139  $reviewSubmissionUrl = Services::get('submission')->getWorkflowUrlByUserRoles($submission);
140  $router = $request->getRouter();
141  $dispatcher = $router->getDispatcher();
142 
143  $templateMgr->assign(array(
144  'reviewSubmissionUrl' => $reviewSubmissionUrl,
145  'submissionId' => $submission->getId(),
146  'submitStep' => $step,
147  'submissionProgress' => $submission->getSubmissionProgress(),
148  ));
149 
150  return new JSONMessage(true, $templateMgr->fetch('submission/form/complete.tpl'));
151  }
152  }
153 
160  function saveStep($args, $request) {
161  $step = isset($args[0]) ? (int) $args[0] : 1;
162 
163  $router = $request->getRouter();
164  $context = $router->getContext($request);
165  $submission = $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION);
166 
167  $this->setupTemplate($request);
168 
169  $formClass = "SubmissionSubmitStep{$step}Form";
170  import("classes.submission.form.$formClass");
171 
172  $submitForm = new $formClass($context, $submission);
173  $submitForm->readInputData();
174 
175  if (!HookRegistry::call('SubmissionHandler::saveSubmit', array($step, &$submission, &$submitForm))) {
176  if ($submitForm->validate()) {
177  $submissionId = $submitForm->execute();
178  if (!$submission) {
179  return $request->redirectUrlJson($router->url($request, null, null, 'wizard', $step+1, array('submissionId' => $submissionId), 'step-2'));
180  }
181  $json = new JSONMessage(true);
182  $json->setEvent('setStep', max($step+1, $submission->getSubmissionProgress()));
183  return $json;
184  } else {
185  // Provide entered tagit fields values
186  $tagitKeywords = $submitForm->getData('keywords');
187  if (is_array($tagitKeywords)) {
188  $tagitFieldNames = $submitForm->_metadataFormImplem->getTagitFieldNames();
189  $locales = array_keys($submitForm->supportedLocales);
190  $formTagitData = array();
191  foreach ($tagitFieldNames as $tagitFieldName) {
192  foreach ($locales as $locale) {
193  $formTagitData[$locale] = array_key_exists($locale . "-$tagitFieldName", $tagitKeywords) ? $tagitKeywords[$locale . "-$tagitFieldName"] : array();
194  }
195  $submitForm->setData($tagitFieldName, $formTagitData);
196  }
197  }
198  return new JSONMessage(true, $submitForm->fetch($request));
199  }
200  }
201  }
202 
203  //
204  // Protected helper methods
205  //
210  function setupTemplate($request) {
211  parent::setupTemplate($request);
212  AppLocale::requireComponents(LOCALE_COMPONENT_APP_SUBMISSION, LOCALE_COMPONENT_PKP_SUBMISSION, LOCALE_COMPONENT_APP_MANAGER);
213  // Get steps information.
214  $templateMgr = TemplateManager::getManager($request);
215  $templateMgr->assign('steps', $this->getStepsNumberAndLocaleKeys());
216  }
217 
222  abstract function getStepsNumberAndLocaleKeys();
223 
228  abstract function getStepCount();
229 }
230 
231 
UserRequiredPolicy
Policy to deny access if a context cannot be found in the request.
Definition: UserRequiredPolicy.inc.php:17
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
PKPSubmissionHandler\index
index($args, $request)
Definition: pages/submission/PKPSubmissionHandler.inc.php:81
PKPSubmissionHandler\wizard
wizard($args, $request)
Definition: pages/submission/PKPSubmissionHandler.inc.php:90
PKPSubmissionHandler\$_isBackendPage
$_isBackendPage
Definition: pages/submission/PKPSubmissionHandler.inc.php:22
PKPSubmissionHandler\step
step($args, $request)
Definition: pages/submission/PKPSubmissionHandler.inc.php:118
PKPSubmissionHandler\saveStep
saveStep($args, $request)
Definition: pages/submission/PKPSubmissionHandler.inc.php:160
PKPSubmissionHandler\setupTemplate
setupTemplate($request)
Definition: pages/submission/PKPSubmissionHandler.inc.php:210
PKPSubmissionHandler\getStepsNumberAndLocaleKeys
getStepsNumberAndLocaleKeys()
PKPSubmissionHandler
Base handler for submission requests.
Definition: api/v1/submissions/PKPSubmissionHandler.inc.php:20
PKPHandler\markRoleAssignmentsChecked
markRoleAssignmentsChecked()
Definition: PKPHandler.inc.php:268
JSONMessage
Class to represent a JSON (Javascript Object Notation) message.
Definition: JSONMessage.inc.php:18
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
PKPSubmissionHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: pages/submission/PKPSubmissionHandler.inc.php:27
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
SubmissionAccessPolicy
Base class to control (write) access to submissions and (read) access to submission details in OMP.
Definition: SubmissionAccessPolicy.inc.php:19
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
HookRegistry\call
static call($hookName, $args=null)
Definition: HookRegistry.inc.php:86
Handler
Base request handler application class.
Definition: Handler.inc.php:18
PKPSubmissionHandler\getStepCount
getStepCount()
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49