176 lines
5.9 KiB
PHP
176 lines
5.9 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file lib/pkp/controllers/page/PageHandler.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 PageHandler
|
|
*
|
|
* @ingroup controllers_page
|
|
*
|
|
* @brief Handler for requests for page components such as the header, tasks,
|
|
* usernav, and CSS.
|
|
*/
|
|
|
|
namespace PKP\controllers\page;
|
|
|
|
use APP\handler\Handler;
|
|
use APP\template\TemplateManager;
|
|
use PKP\core\JSONMessage;
|
|
use PKP\core\PKPRequest;
|
|
use PKP\plugins\Hook;
|
|
use PKP\plugins\PluginRegistry;
|
|
use PKP\security\authorization\PKPSiteAccessPolicy;
|
|
|
|
class PageHandler extends Handler
|
|
{
|
|
//
|
|
// Implement template methods from PKPHandler
|
|
//
|
|
/**
|
|
* @copydoc PKPHandler::authorize()
|
|
*/
|
|
public function authorize($request, &$args, $roleAssignments)
|
|
{
|
|
$this->addPolicy(new PKPSiteAccessPolicy(
|
|
$request,
|
|
['tasks', 'css'],
|
|
PKPSiteAccessPolicy::SITE_ACCESS_ALL_ROLES
|
|
));
|
|
|
|
$this->setEnforceRestrictedSite(false);
|
|
return parent::authorize($request, $args, $roleAssignments);
|
|
}
|
|
|
|
|
|
//
|
|
// Public operations
|
|
//
|
|
/**
|
|
* Display the tasks component
|
|
*
|
|
* @param array $args
|
|
* @param PKPRequest $request
|
|
*
|
|
* @return JSONMessage JSON object
|
|
*/
|
|
public function tasks($args, $request)
|
|
{
|
|
$this->setupTemplate($request);
|
|
$templateMgr = TemplateManager::getManager($request);
|
|
return $templateMgr->fetchJson('controllers/page/tasks.tpl');
|
|
}
|
|
|
|
/**
|
|
* Get the compiled CSS
|
|
*
|
|
* @param array $args
|
|
* @param PKPRequest $request
|
|
*/
|
|
public function css($args, $request)
|
|
{
|
|
header('Content-Type: text/css');
|
|
|
|
$templateManager = TemplateManager::getManager($request);
|
|
|
|
$name = $request->getUserVar('name');
|
|
if (empty($name)) {
|
|
$name = 'pkp-lib';
|
|
}
|
|
switch ($name) {
|
|
// The core app stylesheet
|
|
case 'pkp-lib':
|
|
$cachedFile = $templateManager->getCachedLessFilePath($name);
|
|
if (!file_exists($cachedFile)) {
|
|
$styles = $templateManager->compileLess($name, 'styles/index.less');
|
|
if (!$templateManager->cacheLess($cachedFile, $styles)) {
|
|
echo $styles;
|
|
exit;
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
|
|
// Backwards compatibility. This hook is deprecated.
|
|
if (Hook::getHooks('PageHandler::displayCss')) {
|
|
$result = '';
|
|
$lastModified = null;
|
|
Hook::call('PageHandler::displayCss', [$request, &$name, &$result, &$lastModified]);
|
|
if ($lastModified) {
|
|
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
|
|
}
|
|
header('Content-Length: ' . strlen($result));
|
|
echo $result;
|
|
exit;
|
|
} else {
|
|
$cachedFile = $templateManager->getCachedLessFilePath($name);
|
|
if (!file_exists($cachedFile)) {
|
|
// Process styles registered with the current theme
|
|
$styles = '';
|
|
$themes = PluginRegistry::loadCategory('themes', true);
|
|
foreach ($themes as $theme) {
|
|
if ($theme->isActive()) {
|
|
$style = $theme->getStyle($name);
|
|
if (!empty($style)) {
|
|
// Compile and cache the stylesheet
|
|
$styles = $templateManager->compileLess(
|
|
$name,
|
|
$style['style'],
|
|
[
|
|
'baseUrl' => $style['baseUrl'] ?? null,
|
|
'addLess' => $style['addLess'] ?? null,
|
|
'addLessVariables' => $style['addLessVariables'] ?? null,
|
|
]
|
|
);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
// If we still haven't found styles, fire off a hook
|
|
// which allows other types of plugins to handle
|
|
// requests
|
|
if (!$styles) {
|
|
Hook::call(
|
|
'PageHandler::getCompiledLess',
|
|
[
|
|
'request' => $request,
|
|
'name' => &$name,
|
|
'styles' => &$styles,
|
|
]
|
|
);
|
|
}
|
|
|
|
// Give up if there are still no styles
|
|
if (!$styles) {
|
|
exit;
|
|
}
|
|
|
|
// Try to save the styles to a cached file. If we can't,
|
|
// just print them out
|
|
if (!$templateManager->cacheLess($cachedFile, $styles)) {
|
|
echo $styles;
|
|
exit;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
// Deliver the cached file
|
|
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($cachedFile)) . ' GMT');
|
|
header('Content-Length: ' . filesize($cachedFile));
|
|
readfile($cachedFile);
|
|
exit;
|
|
}
|
|
}
|
|
|
|
|
|
if (!PKP_STRICT_MODE) {
|
|
class_alias('\PKP\controllers\page\PageHandler', '\PageHandler');
|
|
}
|