235 lines
7.2 KiB
PHP
235 lines
7.2 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file StaticPagesPlugin.php
|
|
*
|
|
* Copyright (c) 2014-2020 Simon Fraser University
|
|
* Copyright (c) 2003-2020 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @package plugins.generic.staticPages
|
|
*
|
|
* @class StaticPagesPlugin
|
|
*
|
|
* @brief Static pages plugin main class
|
|
*/
|
|
|
|
namespace APP\plugins\generic\staticPages;
|
|
|
|
use APP\core\Application;
|
|
use APP\plugins\generic\staticPages\classes\StaticPagesDAO;
|
|
use APP\plugins\generic\staticPages\controllers\grid\StaticPageGridHandler;
|
|
use APP\template\TemplateManager;
|
|
use PKP\core\Registry;
|
|
use PKP\db\DAORegistry;
|
|
use PKP\linkAction\LinkAction;
|
|
use PKP\linkAction\request\RedirectAction;
|
|
use PKP\plugins\GenericPlugin;
|
|
use PKP\plugins\Hook;
|
|
|
|
class StaticPagesPlugin extends GenericPlugin
|
|
{
|
|
/**
|
|
* @copydoc Plugin::getDisplayName()
|
|
*/
|
|
public function getDisplayName()
|
|
{
|
|
return __('plugins.generic.staticPages.displayName');
|
|
}
|
|
|
|
/**
|
|
* @copydoc Plugin::getDescription()
|
|
*/
|
|
public function getDescription()
|
|
{
|
|
$description = __('plugins.generic.staticPages.description');
|
|
if (!$this->isTinyMCEInstalled()) {
|
|
$description .= __('plugins.generic.staticPages.requirement.tinymce');
|
|
}
|
|
return $description;
|
|
}
|
|
|
|
/**
|
|
* Check whether or not the TinyMCE plugin is installed.
|
|
*
|
|
* @return bool True iff TinyMCE is installed.
|
|
*/
|
|
public function isTinyMCEInstalled()
|
|
{
|
|
$application = Application::get();
|
|
$products = $application->getEnabledProducts('plugins.generic');
|
|
return (isset($products['tinymce']));
|
|
}
|
|
|
|
/**
|
|
* @copydoc Plugin::register()
|
|
*
|
|
* @param null|mixed $mainContextId
|
|
*/
|
|
public function register($category, $path, $mainContextId = null)
|
|
{
|
|
if (parent::register($category, $path, $mainContextId)) {
|
|
if ($this->getEnabled($mainContextId)) {
|
|
// Register the static pages DAO.
|
|
$staticPagesDao = new StaticPagesDAO();
|
|
DAORegistry::registerDAO('StaticPagesDAO', $staticPagesDao);
|
|
|
|
Hook::add('Template::Settings::website', [$this, 'callbackShowWebsiteSettingsTabs']);
|
|
|
|
// Intercept the LoadHandler hook to present
|
|
// static pages when requested.
|
|
Hook::add('LoadHandler', [$this, 'callbackHandleContent']);
|
|
|
|
// Register the components this plugin implements to
|
|
// permit administration of static pages.
|
|
Hook::add('LoadComponentHandler', [$this, 'setupGridHandler']);
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Extend the website settings tabs to include static pages
|
|
*
|
|
* @param string $hookName The name of the invoked hook
|
|
* @param array $args Hook parameters
|
|
*
|
|
* @return bool Hook handling status
|
|
*/
|
|
public function callbackShowWebsiteSettingsTabs($hookName, $args)
|
|
{
|
|
$templateMgr = $args[1];
|
|
$output = & $args[2];
|
|
$request = & Registry::get('request');
|
|
$dispatcher = $request->getDispatcher();
|
|
|
|
$output .= $templateMgr->fetch($this->getTemplateResource('staticPagesTab.tpl'));
|
|
|
|
// Permit other plugins to continue interacting with this hook
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Declare the handler function to process the actual page PATH
|
|
*
|
|
* @param string $hookName The name of the invoked hook
|
|
* @param array $args Hook parameters
|
|
*
|
|
* @return bool Hook handling status
|
|
*/
|
|
public function callbackHandleContent($hookName, $args)
|
|
{
|
|
$request = Application::get()->getRequest();
|
|
$templateMgr = TemplateManager::getManager($request);
|
|
|
|
$page = & $args[0];
|
|
$op = & $args[1];
|
|
$handler = & $args[3];
|
|
|
|
/** @var StaticPagesDAO */
|
|
$staticPagesDao = DAORegistry::getDAO('StaticPagesDAO');
|
|
if ($page == 'pages' && $op == 'preview') {
|
|
// This is a preview request; mock up a static page to display.
|
|
// The handler class ensures that only managers and administrators
|
|
// can do this.
|
|
$staticPage = $staticPagesDao->newDataObject();
|
|
$staticPage->setContent((array) $request->getUserVar('content'), null);
|
|
$staticPage->setTitle((array) $request->getUserVar('title'), null);
|
|
} else {
|
|
// Construct a path to look for
|
|
$path = $page;
|
|
if ($op !== 'index') {
|
|
$path .= "/{$op}";
|
|
}
|
|
if ($ops = $request->getRequestedArgs()) {
|
|
$path .= '/' . implode('/', $ops);
|
|
}
|
|
|
|
// Look for a static page with the given path
|
|
$context = $request->getContext();
|
|
$staticPage = $staticPagesDao->getByPath(
|
|
$context?->getId() ?? Application::CONTEXT_ID_NONE,
|
|
$path
|
|
);
|
|
}
|
|
|
|
// Check if this is a request for a static page or preview.
|
|
if ($staticPage) {
|
|
// Trick the handler into dealing with it normally
|
|
$page = 'pages';
|
|
$op = 'view';
|
|
|
|
// It is -- attach the static pages handler.
|
|
$handler = new StaticPagesHandler($this, $staticPage);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Permit requests to the static pages grid handler
|
|
*
|
|
* @param string $hookName The name of the hook being invoked
|
|
*/
|
|
public function setupGridHandler($hookName, $params)
|
|
{
|
|
$component = & $params[0];
|
|
$componentInstance = & $params[2];
|
|
if ($component == 'plugins.generic.staticPages.controllers.grid.StaticPageGridHandler') {
|
|
// Allow the static page grid handler to get the plugin object
|
|
$componentInstance = new StaticPageGridHandler($this);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @copydoc Plugin::getActions()
|
|
*/
|
|
public function getActions($request, $actionArgs)
|
|
{
|
|
$dispatcher = $request->getDispatcher();
|
|
return array_merge(
|
|
$this->getEnabled() ? [
|
|
new LinkAction(
|
|
'settings',
|
|
new RedirectAction($dispatcher->url(
|
|
$request,
|
|
Application::ROUTE_PAGE,
|
|
null,
|
|
'management',
|
|
'settings',
|
|
'website',
|
|
['uid' => uniqid()], // Force reload
|
|
'staticPages' // Anchor for tab
|
|
)),
|
|
__('plugins.generic.staticPages.editAddContent'),
|
|
null
|
|
),
|
|
] : [],
|
|
parent::getActions($request, $actionArgs)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @copydoc Plugin::getInstallMigration()
|
|
*/
|
|
public function getInstallMigration()
|
|
{
|
|
return new StaticPagesSchemaMigration();
|
|
}
|
|
|
|
/**
|
|
* Get the JavaScript URL for this plugin.
|
|
*/
|
|
public function getJavaScriptURL($request)
|
|
{
|
|
return $request->getBaseUrl() . '/' . $this->getPluginPath() . '/js';
|
|
}
|
|
}
|
|
|
|
if (!PKP_STRICT_MODE) {
|
|
class_alias('\APP\plugins\generic\staticPages\StaticPagesPlugin', '\StaticPagesPlugin');
|
|
}
|