Open Journal Systems  3.3.0
pages/issue/IssueHandler.inc.php
1 <?php
2 
16 import ('classes.issue.IssueAction');
17 import('classes.handler.Handler');
18 
19 class IssueHandler extends Handler {
21  var $_galley = null;
22 
23 
27  function authorize($request, &$args, $roleAssignments) {
28  import('lib.pkp.classes.security.authorization.ContextRequiredPolicy');
29  $this->addPolicy(new ContextRequiredPolicy($request));
30 
31  import('classes.security.authorization.OjsJournalMustPublishPolicy');
32  $this->addPolicy(new OjsJournalMustPublishPolicy($request));
33 
34  import('classes.security.authorization.OjsIssueRequiredPolicy');
35  // the 'archives' op does not need this policy so it is left out of the operations array.
36  $this->addPolicy(new OjsIssueRequiredPolicy($request, $args, array('view', 'download')));
37 
38  return parent::authorize($request, $args, $roleAssignments);
39  }
40 
45  function initialize($request, $args = array()) {
46  // Get the issue galley
47  $galleyId = isset($args[1]) ? $args[1] : 0;
48  if ($galleyId) {
49  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
50  $galleyDao = DAORegistry::getDAO('IssueGalleyDAO'); /* @var $galleyDao IssueGalleyDAO */
51  $journal = $request->getJournal();
52  $galley = $galleyDao->getByBestId($galleyId, $issue->getId());
53 
54  // Invalid galley id, redirect to issue page
55  if (!$galley) $request->redirect(null, null, 'view', $issue->getId());
56 
57  $this->setGalley($galley);
58  }
59  }
60 
64  function index($args, $request) {
65  $this->current($args, $request);
66  }
67 
71  function current($args, $request) {
72  $journal = $request->getJournal();
73  $issueDao = DAORegistry::getDAO('IssueDAO'); /* @var $issueDao IssueDAO */
74  $issue = $issueDao->getCurrent($journal->getId(), true);
75 
76  if ($issue != null) {
77  $request->redirect(null, 'issue', 'view', $issue->getBestIssueId());
78  }
79 
80  $this->setupTemplate($request);
81  $templateMgr = TemplateManager::getManager($request);
82  // consider public identifiers
83  $pubIdPlugins = PluginRegistry::loadCategory('pubIds', true);
84  $templateMgr->assign('pubIdPlugins', $pubIdPlugins);
85  $templateMgr->display('frontend/pages/issue.tpl');
86  }
87 
93  function view($args, $request) {
94  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
95  $this->setupTemplate($request);
96  $templateMgr = TemplateManager::getManager($request);
97  $journal = $request->getJournal();
98 
99  if (($galley = $this->getGalley()) && $this->userCanViewGalley($request)) {
100  if (!HookRegistry::call('IssueHandler::view::galley', array(&$request, &$issue, &$galley))) {
101  $request->redirect(null, null, 'download', array($issue->getBestIssueId($journal), $galley->getBestGalleyId($journal)));
102  }
103  } else {
104  self::_setupIssueTemplate($request, $issue, $request->getUserVar('showToc') ? true : false);
105  $templateMgr->assign('issueId', $issue->getBestIssueId());
106 
107  // consider public identifiers
108  $pubIdPlugins = PluginRegistry::loadCategory('pubIds', true);
109  $templateMgr->assign('pubIdPlugins', $pubIdPlugins);
110  $templateMgr->display('frontend/pages/issue.tpl');
111  }
112  }
113 
119  function archive($args, $request) {
120  $this->setupTemplate($request);
121  $page = isset($args[0]) ? (int) $args[0] : 1;
122  $templateMgr = TemplateManager::getManager($request);
123  $context = $request->getContext();
124 
125  $count = $context->getData('itemsPerPage') ? $context->getData('itemsPerPage') : Config::getVar('interface', 'items_per_page');
126  $offset = $page > 1 ? ($page - 1) * $count : 0;
127 
128  $params = array(
129  'contextId' => $context->getId(),
130  'orderBy' => 'seq',
131  'orderDirection' => 'ASC',
132  'count' => $count,
133  'offset' => $offset,
134  'isPublished' => true,
135  );
136  $issues = iterator_to_array(Services::get('issue')->getMany($params));
137  $total = Services::get('issue')->getMax($params);
138 
139  $showingStart = $offset + 1;
140  $showingEnd = min($offset + $count, $offset + count($issues));
141  $nextPage = $total > $showingEnd ? $page + 1 : null;
142  $prevPage = $showingStart > 1 ? $page - 1 : null;
143 
144  $templateMgr->assign(array(
145  'issues' => $issues,
146  'showingStart' => $showingStart,
147  'showingEnd' => $showingEnd,
148  'total' => $total,
149  'nextPage' => $nextPage,
150  'prevPage' => $prevPage,
151  ));
152 
153  $templateMgr->display('frontend/pages/issueArchive.tpl');
154  }
155 
161  function download($args, $request) {
162  if ($this->userCanViewGalley($request)) {
163  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
164  $galley = $this->getGalley();
165 
166  if (!HookRegistry::call('IssueHandler::download', array(&$issue, &$galley))) {
167  import('classes.file.IssueFileManager');
168  $issueFileManager = new IssueFileManager($issue->getId());
169  return $issueFileManager->downloadById($galley->getFileId(), $request->getUserVar('inline')?true:false);
170  }
171  }
172  }
173 
178  function getGalley() {
179  return $this->_galley;
180  }
181 
186  function setGalley($galley) {
187  $this->_galley = $galley;
188  }
189 
194  function userCanViewGalley($request) {
195 
196  import('classes.issue.IssueAction');
197  $issueAction = new IssueAction();
198 
199  $journal = $request->getJournal();
200  $user = $request->getUser();
201  $userId = $user ? $user->getId() : 0;
202  $issue = $this->getAuthorizedContextObject(ASSOC_TYPE_ISSUE);
203  $galley = $this->getGalley();
204 
205  // If this is an editorial user who can view unpublished issue galleys,
206  // bypass further validation
207  if ($issueAction->allowedIssuePrePublicationAccess($journal, $user)) return true;
208 
209  // Ensure reader has rights to view the issue galley
210  if ($issue->getPublished()) {
211  $subscriptionRequired = $issueAction->subscriptionRequired($issue, $journal);
212  $isSubscribedDomain = $issueAction->subscribedDomain($request, $journal, $issue->getId());
213 
214  // Check if login is required for viewing.
215  if (!$isSubscribedDomain && !Validation::isLoggedIn() && $journal->getData('restrictArticleAccess')) {
217  }
218 
219  // If no domain/ip subscription, check if user has a valid subscription
220  // or if the user has previously purchased the issue
221  if (!$isSubscribedDomain && $subscriptionRequired) {
222  // Check if user has a valid subscription
223  $subscribedUser = $issueAction->subscribedUser($user, $journal, $issue->getId());
224  if (!$subscribedUser) {
225  // Check if payments are enabled,
226  $paymentManager = Application::getPaymentManager($journal);
227 
228  if ($paymentManager->purchaseIssueEnabled() || $paymentManager->membershipEnabled() ) {
229  // If only pdf files are being restricted, then approve all non-pdf galleys
230  // and continue checking if it is a pdf galley
231  if ($paymentManager->onlyPdfEnabled() && !$galley->isPdfGalley()) return true;
232 
233  if (!Validation::isLoggedIn()) {
234  Validation::redirectLogin("payment.loginRequired.forIssue");
235  }
236 
237  // If the issue galley has been purchased, then allow reader access
238  $completedPaymentDao = DAORegistry::getDAO('OJSCompletedPaymentDAO'); /* @var $completedPaymentDao OJSCompletedPaymentDAO */
239  $dateEndMembership = $user->getSetting('dateEndMembership', 0);
240  if ($completedPaymentDao->hasPaidPurchaseIssue($userId, $issue->getId()) || (!is_null($dateEndMembership) && $dateEndMembership > time())) {
241  return true;
242  } else {
243  // Otherwise queue an issue purchase payment and display payment form
244  $queuedPayment = $paymentManager->createQueuedPayment($request, PAYMENT_TYPE_PURCHASE_ISSUE, $userId, $issue->getId(), $journal->getData('purchaseIssueFee'));
245  $paymentManager->queuePayment($queuedPayment);
246 
247  $paymentForm = $paymentManager->getPaymentForm($queuedPayment);
248  $paymentForm->display($request);
249  exit;
250  }
251  }
252 
253  if (!Validation::isLoggedIn()) {
254  Validation::redirectLogin("reader.subscriptionRequiredLoginText");
255  }
256  $request->redirect(null, 'about', 'subscriptions');
257  }
258  }
259  } else {
260  $request->redirect(null, 'index');
261  }
262  return true;
263  }
264 
265  function setupTemplate($request) {
266  parent::setupTemplate($request);
267  AppLocale::requireComponents(LOCALE_COMPONENT_PKP_READER, LOCALE_COMPONENT_APP_EDITOR);
268  }
269 
279  static function _setupIssueTemplate($request, $issue, $showToc = false) {
280  $journal = $request->getJournal();
281  $user = $request->getUser();
282  $templateMgr = TemplateManager::getManager($request);
283 
284  // Determine pre-publication access
285  // FIXME: Do that. (Bug #8278)
286 
287  $templateMgr->assign(array(
288  'issueIdentification' => $issue->getIssueIdentification(),
289  'issueTitle' => $issue->getLocalizedTitle(),
290  'issueSeries' => $issue->getIssueIdentification(array('showTitle' => false)),
291  ));
292 
293  $locale = AppLocale::getLocale();
294 
295  $templateMgr->assign(array(
296  'locale' => $locale,
297  ));
298 
299  $issueGalleyDao = DAORegistry::getDAO('IssueGalleyDAO'); /* @var $issueGalleyDao IssueGalleyDAO */
300 
301  $genreDao = DAORegistry::getDAO('GenreDAO'); /* @var $genreDao GenreDAO */
302  $primaryGenres = $genreDao->getPrimaryByContextId($journal->getId())->toArray();
303  $primaryGenreIds = array_map(function($genre) {
304  return $genre->getId();
305  }, $primaryGenres);
306 
307  // Show scheduled submissions if this is a preview
308  import('classes.submission.Submission'); // import STATUS_ constants
309  $allowedStatuses = [STATUS_PUBLISHED];
310  if (!$issue->getPublished()) {
311  $allowedStatuses[] = STATUS_SCHEDULED;
312  }
313 
314  $issueSubmissions = iterator_to_array(Services::get('submission')->getMany([
315  'contextId' => $journal->getId(),
316  'issueIds' => [$issue->getId()],
317  'status' => $allowedStatuses,
318  'orderBy' => 'seq',
319  'orderDirection' => 'ASC',
320  ]));
321 
322  $sections = Application::get()->getSectionDao()->getByIssueId($issue->getId());
323  $issueSubmissionsInSection = [];
324  foreach ($sections as $section) {
325  $issueSubmissionsInSection[$section->getId()] = [
326  'title' => $section->getHideTitle()?null:$section->getLocalizedTitle(),
327  'articles' => [],
328  ];
329  }
330  foreach ($issueSubmissions as $submission) {
331  if (!$sectionId = $submission->getCurrentPublication()->getData('sectionId')) {
332  continue;
333  }
334  $issueSubmissionsInSection[$sectionId]['articles'][] = $submission;
335  }
336 
337  $templateMgr->assign(array(
338  'issue' => $issue,
339  'issueGalleys' => $issueGalleyDao->getByIssueId($issue->getId()),
340  'publishedSubmissions' => $issueSubmissionsInSection,
341  'primaryGenreIds' => $primaryGenreIds,
342  ));
343 
344  // Subscription Access
345  import('classes.issue.IssueAction');
346  $issueAction = new IssueAction();
347  $subscriptionRequired = $issueAction->subscriptionRequired($issue, $journal);
348  $subscribedUser = $issueAction->subscribedUser($user, $journal);
349  $subscribedDomain = $issueAction->subscribedDomain($request, $journal);
350 
351  if ($subscriptionRequired && !$subscribedUser && !$subscribedDomain) {
352  $templateMgr->assign('subscriptionExpiryPartial', true);
353 
354  // Partial subscription expiry for issue
355  $partial = $issueAction->subscribedUser($user, $journal, $issue->getId());
356  if (!$partial) $issueAction->subscribedDomain($request, $journal, $issue->getId());
357  $templateMgr->assign('issueExpiryPartial', $partial);
358 
359  // Partial subscription expiry for articles
360  $articleExpiryPartial = array();
361  foreach ($issueSubmissions as $issueSubmission) {
362  $partial = $issueAction->subscribedUser($user, $journal, $issue->getId(), $issueSubmission->getId());
363  if (!$partial) $issueAction->subscribedDomain($request, $journal, $issue->getId(), $issueSubmission->getId());
364  $articleExpiryPartial[$issueSubmission->getId()] = $partial;
365  }
366  $templateMgr->assign('articleExpiryPartial', $articleExpiryPartial);
367  }
368 
369  $completedPaymentDao = DAORegistry::getDAO('OJSCompletedPaymentDAO'); /* @var $completedPaymentDao OJSCompletedPaymentDAO */
370  $templateMgr->assign(array(
371  'hasAccess' => !$subscriptionRequired ||
372  $issue->getAccessStatus() == ISSUE_ACCESS_OPEN ||
373  $subscribedUser || $subscribedDomain ||
374  ($user && $completedPaymentDao->hasPaidPurchaseIssue($user->getId(), $issue->getId()))
375  ));
376 
377  import('classes.payment.ojs.OJSPaymentManager');
378  $paymentManager = Application::getPaymentManager($journal);
379  if ( $paymentManager->onlyPdfEnabled() ) {
380  $templateMgr->assign('restrictOnlyPdf', true);
381  }
382  if ( $paymentManager->purchaseArticleEnabled() ) {
383  $templateMgr->assign('purchaseArticleEnabled', true);
384  }
385  }
386 }
IssueHandler\$_galley
$_galley
Definition: pages/issue/IssueHandler.inc.php:24
IssueHandler\initialize
initialize($request, $args=array())
Definition: pages/issue/IssueHandler.inc.php:48
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
IssueHandler\setupTemplate
setupTemplate($request)
Definition: pages/issue/IssueHandler.inc.php:268
Validation\redirectLogin
static redirectLogin($message=null)
Definition: Validation.inc.php:168
Validation\isLoggedIn
static isLoggedIn()
Definition: Validation.inc.php:376
IssueFileManager
Class defining operations for issue file management.
Definition: IssueFileManager.inc.php:22
IssueHandler\getGalley
getGalley()
Definition: pages/issue/IssueHandler.inc.php:181
IssueHandler\_setupIssueTemplate
static _setupIssueTemplate($request, $issue, $showToc=false)
Definition: pages/issue/IssueHandler.inc.php:282
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
IssueHandler\index
index($args, $request)
Definition: pages/issue/IssueHandler.inc.php:67
OjsIssueRequiredPolicy
Policy that ensures that the request contains a valid issue.
Definition: OjsIssueRequiredPolicy.inc.php:17
IssueHandler\setGalley
setGalley($galley)
Definition: pages/issue/IssueHandler.inc.php:189
Application\getPaymentManager
static getPaymentManager($context)
Definition: Application.inc.php:226
PluginRegistry\loadCategory
static loadCategory($category, $enabledOnly=false, $mainContextId=null)
Definition: PluginRegistry.inc.php:103
IssueAction
IssueAction class.
Definition: IssueAction.inc.php:17
IssueHandler\download
download($args, $request)
Definition: pages/issue/IssueHandler.inc.php:164
Config\getVar
static getVar($section, $key, $default=null)
Definition: Config.inc.php:35
IssueHandler\view
view($args, $request)
Definition: pages/issue/IssueHandler.inc.php:96
IssueHandler
Handle API requests for issues operations.
Definition: api/v1/issues/IssueHandler.inc.php:20
IssueHandler\archive
archive($args, $request)
Definition: pages/issue/IssueHandler.inc.php:122
IssueHandler\current
current($args, $request)
Definition: pages/issue/IssueHandler.inc.php:74
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
IssueHandler\getMany
getMany($slimRequest, $response, $args)
Definition: api/v1/issues/IssueHandler.inc.php:88
OjsJournalMustPublishPolicy
Access policy to limit access to journals that do not publish online.
Definition: OjsJournalMustPublishPolicy.inc.php:18
IssueHandler\userCanViewGalley
userCanViewGalley($request)
Definition: pages/issue/IssueHandler.inc.php:197
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
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
AppLocale\getLocale
static getLocale()
Definition: env1/MockAppLocale.inc.php:40
IssueHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: pages/issue/IssueHandler.inc.php:30
ContextRequiredPolicy
Policy to deny access if a context cannot be found in the request.
Definition: ContextRequiredPolicy.inc.php:17
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49