247 lines
7.7 KiB
PHP
247 lines
7.7 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file pages/gateway/GatewayHandler.php
|
|
*
|
|
* Copyright (c) 2014-2021 Simon Fraser University
|
|
* Copyright (c) 2003-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class GatewayHandler
|
|
*
|
|
* @ingroup pages_gateway
|
|
*
|
|
* @brief Handle external gateway requests.
|
|
*/
|
|
|
|
namespace APP\pages\gateway;
|
|
|
|
use APP\core\PageRouter;
|
|
use APP\facades\Repo;
|
|
use APP\handler\Handler;
|
|
use APP\journal\JournalDAO;
|
|
use APP\template\TemplateManager;
|
|
use Illuminate\Support\LazyCollection;
|
|
use PKP\db\DAORegistry;
|
|
use PKP\facades\Locale;
|
|
use PKP\plugins\PluginRegistry;
|
|
|
|
class GatewayHandler extends Handler
|
|
{
|
|
public $plugin;
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @param \APP\core\Request $request
|
|
*/
|
|
public function __construct($request)
|
|
{
|
|
parent::__construct();
|
|
/** @var PageRouter */
|
|
$router = $request->getRouter();
|
|
$op = $router->getRequestedOp($request);
|
|
if ($op == 'plugin') {
|
|
$args = $router->getRequestedArgs($request);
|
|
$pluginName = array_shift($args);
|
|
$plugins = PluginRegistry::loadCategory('gateways');
|
|
if (!isset($plugins[$pluginName])) {
|
|
$request->getDispatcher()->handle404();
|
|
}
|
|
$this->plugin = $plugins[$pluginName];
|
|
foreach ($this->plugin->getPolicies($request) as $policy) {
|
|
$this->addPolicy($policy);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Index handler.
|
|
*
|
|
* @param array $args
|
|
* @param \APP\core\Request $request
|
|
*/
|
|
public function index($args, $request)
|
|
{
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
/**
|
|
* Display the LOCKSS manifest.
|
|
*
|
|
* @param array $args
|
|
* @param \APP\core\Request $request
|
|
*/
|
|
public function lockss($args, $request)
|
|
{
|
|
$this->validate();
|
|
$this->setupTemplate($request);
|
|
|
|
$journal = $request->getContext();
|
|
$templateMgr = TemplateManager::getManager($request);
|
|
|
|
if ($journal != null) {
|
|
if (!$journal->getData('enableLockss')) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
$yearsIssuesPublished = Repo::issue()->getYearsIssuesPublished($journal->getId())->values();
|
|
|
|
// FIXME Should probably go in IssueDAO or a subclass
|
|
$year = $yearsIssuesPublished->contains((int) $request->getUserVar('year'))
|
|
? (int) $request->getUserVar('year')
|
|
: null;
|
|
|
|
if (!isset($year)) {
|
|
$year = $yearsIssuesPublished->max();
|
|
$templateMgr->assign('showInfo', true);
|
|
}
|
|
|
|
$prevYear = $nextYear = null;
|
|
if (isset($year)) {
|
|
$key = $yearsIssuesPublished->search(function ($i) use ($year) {
|
|
return $i === $year;
|
|
});
|
|
if (isset($key)) {
|
|
$prevYear = $yearsIssuesPublished->get($key - 1);
|
|
$nextYear = $yearsIssuesPublished->get($key + 1);
|
|
}
|
|
}
|
|
|
|
$issues = $this->getPublishedIssuesByNumber($journal->getId(), null, null, $year);
|
|
$templateMgr->assign([
|
|
'journal' => $journal,
|
|
'year' => $year,
|
|
'prevYear' => $prevYear,
|
|
'nextYear' => $nextYear,
|
|
'issues' => $issues->toArray(),
|
|
]);
|
|
|
|
$locales = $journal->getSupportedLocaleNames();
|
|
if (!isset($locales) || empty($locales)) {
|
|
$primaryLocale = Locale::getPrimaryLocale();
|
|
$locales = [$primaryLocale => Locale::getMetadata($primaryLocale)->getDisplayName()];
|
|
}
|
|
$templateMgr->assign('locales', $locales);
|
|
} else {
|
|
$journalDao = DAORegistry::getDAO('JournalDAO'); /** @var JournalDAO $journalDao */
|
|
$journals = $journalDao->getAll(true);
|
|
$templateMgr->assign('journals', $journals);
|
|
}
|
|
|
|
$templateMgr->display('gateway/lockss.tpl');
|
|
}
|
|
|
|
/**
|
|
* Display the CLOCKSS manifest.
|
|
*
|
|
* @param array $args
|
|
* @param \APP\core\Request $request
|
|
*/
|
|
public function clockss($args, $request)
|
|
{
|
|
$this->validate();
|
|
$this->setupTemplate($request);
|
|
|
|
$journal = $request->getContext();
|
|
$templateMgr = TemplateManager::getManager($request);
|
|
|
|
if ($journal != null) {
|
|
if (!$journal->getData('enableClockss')) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
|
|
$yearsIssuesPublished = Repo::issue()->getYearsIssuesPublished($journal->getId())->values();
|
|
|
|
// FIXME Should probably go in Issue DAO or a subclass
|
|
$year = $yearsIssuesPublished->contains((int) $request->getUserVar('year'))
|
|
? (int) $request->getUserVar('year')
|
|
: null;
|
|
|
|
|
|
if (!isset($year)) {
|
|
$year = $yearsIssuesPublished->max();
|
|
$issues = $this->getPublishedIssuesByNumber($journal->getId(), null, null, $year);
|
|
$templateMgr->assign([
|
|
'issues' => $issues->toArray(),
|
|
'showInfo' => true,
|
|
]);
|
|
}
|
|
|
|
$prevYear = $nextYear = null;
|
|
if (isset($year)) {
|
|
$key = $yearsIssuesPublished->search(function ($i) use ($year) {
|
|
return $i === $year;
|
|
});
|
|
if (isset($key)) {
|
|
$prevYear = $yearsIssuesPublished->get($key - 1);
|
|
$nextYear = $yearsIssuesPublished->get($key + 1);
|
|
}
|
|
}
|
|
|
|
$issues = $this->getPublishedIssuesByNumber($journal->getId(), null, null, $year);
|
|
$templateMgr->assign([
|
|
'journal' => $journal,
|
|
'year' => $year,
|
|
'prevYear' => $prevYear,
|
|
'nextYear' => $nextYear,
|
|
'issues' => $issues->toArray(),
|
|
]);
|
|
|
|
$locales = $journal->getSupportedLocaleNames();
|
|
if (!isset($locales) || empty($locales)) {
|
|
$primaryLocale = Locale::getPrimaryLocale();
|
|
$locales = [$primaryLocale => Locale::getMetadata($primaryLocale)->getDisplayName()];
|
|
}
|
|
$templateMgr->assign('locales', $locales);
|
|
} else {
|
|
$journalDao = DAORegistry::getDAO('JournalDAO'); /** @var JournalDAO $journalDao */
|
|
$journals = $journalDao->getAll(true);
|
|
$templateMgr->assign('journals', $journals);
|
|
}
|
|
|
|
$templateMgr->display('gateway/clockss.tpl');
|
|
}
|
|
|
|
/**
|
|
* Handle requests for gateway plugins.
|
|
*
|
|
* @param array $args
|
|
* @param \APP\core\Request $request
|
|
*/
|
|
public function plugin($args, $request)
|
|
{
|
|
$this->validate();
|
|
if (isset($this->plugin)) {
|
|
if (!$this->plugin->fetch(array_slice($args, 1), $request)) {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
} else {
|
|
$request->redirect(null, 'index');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Retrieve Issue by some combination of volume, number, and year
|
|
*
|
|
*/
|
|
protected function getPublishedIssuesByNumber(int $contextId, ?int $volume = null, ?int $number = null, ?int $year = null): LazyCollection
|
|
{
|
|
$collector = Repo::issue()->getCollector()
|
|
->filterByContextIds([$contextId]);
|
|
|
|
if ($volume !== null) {
|
|
$collector->filterByVolumes([$volume]);
|
|
}
|
|
|
|
if ($number !== null) {
|
|
$collector->filterByNumbers([$number]);
|
|
}
|
|
|
|
if ($year !== null) {
|
|
$collector->filterByYears([$year]);
|
|
}
|
|
|
|
return $collector->getMany();
|
|
}
|
|
}
|