Files
CHIEFSOFT\ameye df3a033196 first commit
2024-06-08 17:09:23 -04:00

258 lines
8.4 KiB
PHP

<?php
/**
* @file plugins/generic/customBlockManager/controllers/grid/CustomBlockGridHandler.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.
*
* @class CustomBlockGridHandler
*
* @ingroup controllers_grid_customBlockManager
*
* @brief Handle custom block manager grid requests.
*/
namespace APP\plugins\generic\customBlockManager\controllers\grid;
use APP\plugins\generic\customBlockManager\controllers\grid\form\CustomBlockForm;
use APP\plugins\generic\customBlockManager\CustomBlockManagerPlugin;
use APP\plugins\generic\customBlockManager\CustomBlockPlugin;
use PKP\controllers\grid\GridColumn;
use PKP\controllers\grid\GridHandler;
use PKP\core\JSONMessage;
use PKP\core\PKPRequest;
use PKP\db\DAO;
use PKP\db\DAORegistry;
use PKP\linkAction\LinkAction;
use PKP\linkAction\request\AjaxModal;
use PKP\plugins\PluginRegistry;
use PKP\plugins\PluginSettingsDAO;
use PKP\security\authorization\ContextAccessPolicy;
use PKP\security\authorization\PKPSiteAccessPolicy;
use PKP\security\Role;
class CustomBlockGridHandler extends GridHandler
{
/** @var CustomBlockManagerPlugin The custom block manager plugin */
public $plugin;
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->addRoleAssignment(
[Role::ROLE_ID_MANAGER, Role::ROLE_ID_SITE_ADMIN],
['fetchGrid', 'fetchRow', 'addCustomBlock', 'editCustomBlock', 'updateCustomBlock', 'deleteCustomBlock']
);
$this->plugin = PluginRegistry::getPlugin('generic', CUSTOMBLOCKMANAGER_PLUGIN_NAME);
}
//
// Overridden template methods
//
/**
* @copydoc PKPHandler::authorize()
*/
public function authorize($request, &$args, $roleAssignments)
{
if ($request->getContext()) {
$this->addPolicy(new ContextAccessPolicy($request, $roleAssignments));
} else {
$this->addPolicy(new PKPSiteAccessPolicy($request, null, $roleAssignments));
}
return parent::authorize($request, $args, $roleAssignments);
}
/**
* @copydoc GridHandler::initialize()
*
* @param null|mixed $args
*/
public function initialize($request, $args = null)
{
parent::initialize($request, $args);
$context = $request->getContext();
$contextId = $context ? $context->getId() : 0;
// Set the grid title.
$this->setTitle('plugins.generic.customBlockManager.customBlocks');
// Set the grid instructions.
$this->setEmptyRowText('plugins.generic.customBlockManager.noneCreated');
// Get the blocks and add the data to the grid
$customBlockManagerPlugin = $this->plugin;
$blocks = $customBlockManagerPlugin->getSetting($contextId, 'blocks');
$gridData = [];
if (is_array($blocks)) {
foreach ($blocks as $block) {
$gridData[$block] = [
'title' => $block
];
}
}
$this->setGridDataElements($gridData);
// Add grid-level actions
$router = $request->getRouter();
$this->addAction(
new LinkAction(
'addCustomBlock',
new AjaxModal(
$router->url($request, null, null, 'addCustomBlock'),
__('plugins.generic.customBlockManager.addBlock'),
'modal_add_item'
),
__('plugins.generic.customBlockManager.addBlock'),
'add_item'
)
);
// Columns
$this->addColumn(
new GridColumn(
'title',
'plugins.generic.customBlockManager.blockName',
null,
'controllers/grid/gridCell.tpl'
)
);
}
//
// Overridden methods from GridHandler
//
/**
* @copydoc GridHandler::getRowInstance()
*/
public function getRowInstance()
{
return new CustomBlockGridRow();
}
//
// Public Grid Actions
//
/**
* An action to add a new custom block
*
* @param array $args Arguments to the request
* @param PKPRequest $request Request object
*/
public function addCustomBlock($args, $request)
{
// Calling editCustomBlock with an empty ID will add
// a new custom block.
return $this->editCustomBlock($args, $request);
}
/**
* An action to edit a custom block
*
* @param array $args Arguments to the request
* @param PKPRequest $request Request object
*
* @return JSONMessage Serialized JSON object
*/
public function editCustomBlock($args, $request)
{
$blockName = $request->getUserVar('blockName');
$context = $request->getContext();
$contextId = $context ? $context->getId() : 0;
$this->setupTemplate($request);
$customBlockPlugin = null;
// If this is the edit of the existing custom block plugin,
if ($blockName) {
// Create the custom block plugin
$customBlockPlugin = new CustomBlockPlugin($blockName, CUSTOMBLOCKMANAGER_PLUGIN_NAME);
}
// Create and present the edit form
$customBlockManagerPlugin = $this->plugin;
$template = $customBlockManagerPlugin->getTemplateResource('editCustomBlockForm.tpl');
$customBlockForm = new CustomBlockForm($template, $contextId, $customBlockPlugin);
$customBlockForm->initData();
return new JSONMessage(true, $customBlockForm->fetch($request));
}
/**
* Update a custom block
*
* @param array $args
* @param PKPRequest $request
*
* @return JSONMessage Serialized JSON object
*/
public function updateCustomBlock($args, $request)
{
$pluginName = $request->getUserVar('existingBlockName');
$context = $request->getContext();
$contextId = $context ? $context->getId() : 0;
$this->setupTemplate($request);
$customBlockPlugin = null;
// If this was the edit of the existing custom block plugin
if ($pluginName) {
// Create the custom block plugin
$customBlockPlugin = new CustomBlockPlugin($pluginName, CUSTOMBLOCKMANAGER_PLUGIN_NAME);
}
// Create and populate the form
$customBlockManagerPlugin = $this->plugin;
$template = $customBlockManagerPlugin->getTemplateResource('editCustomBlockForm.tpl');
$customBlockForm = new CustomBlockForm($template, $contextId, $customBlockPlugin);
$customBlockForm->readInputData();
// Check the results
if ($customBlockForm->validate()) {
// Save the results
$customBlockForm->execute();
return DAO::getDataChangedEvent();
}
// Present any errors
return new JSONMessage(true, $customBlockForm->fetch($request));
}
/**
* Delete a custom block
*
* @param array $args
* @param PKPRequest $request
*
* @return JSONMessage Serialized JSON object
*/
public function deleteCustomBlock($args, $request)
{
if (!$request->checkCSRF()) return new JSONMessage(false);
$blockName = $request->getUserVar('blockName');
$context = $request->getContext();
$contextId = $context ? $context->getId() : 0;
// Delete all the entries for this block plugin
/** @var PluginSettingsDAO */
$pluginSettingsDao = DAORegistry::getDAO('PluginSettingsDAO');
$pluginSettingsDao->deleteSetting($contextId, $blockName, 'enabled');
$pluginSettingsDao->deleteSetting($contextId, $blockName, 'context');
$pluginSettingsDao->deleteSetting($contextId, $blockName, 'seq');
$pluginSettingsDao->deleteSetting($contextId, $blockName, 'blockContent');
// Remove this block plugin from the list of the custom block plugins
$customBlockManagerPlugin = $this->plugin;
$blocks = $customBlockManagerPlugin->getSetting($contextId, 'blocks');
$newBlocks = array_diff($blocks, [$blockName]);
ksort($newBlocks);
$customBlockManagerPlugin->updateSetting($contextId, 'blocks', $newBlocks);
return DAO::getDataChangedEvent();
}
}
if (!PKP_STRICT_MODE) {
class_alias('\APP\plugins\generic\customBlockManager\controllers\grid\CustomBlockGridHandler', '\CustomBlockGridHandler');
}