Open Journal Systems  3.3.0
PluginGridHandler.inc.php
1 <?php
2 
16 import('lib.pkp.classes.controllers.grid.CategoryGridHandler');
17 import('lib.pkp.controllers.grid.plugins.form.UploadPluginForm');
18 import('lib.pkp.controllers.grid.plugins.PluginGalleryGridHandler');
19 
20 abstract class PluginGridHandler extends CategoryGridHandler {
25  function __construct($roles) {
26  $this->addRoleAssignment($roles,
27  array('enable', 'disable', 'manage', 'fetchGrid', 'fetchCategory', 'fetchRow'));
28 
29  $this->addRoleAssignment(ROLE_ID_SITE_ADMIN,
30  array('uploadPlugin', 'upgradePlugin', 'deletePlugin', 'saveUploadPlugin', 'uploadPluginFile'));
31 
32  parent::__construct();
33  }
34 
35 
36  //
37  // Overridden template methods
38  //
42  function initialize($request, $args = null) {
43  parent::initialize($request, $args);
44 
45  // Load language components
46  AppLocale::requireComponents(LOCALE_COMPONENT_PKP_MANAGER, LOCALE_COMPONENT_PKP_COMMON, LOCALE_COMPONENT_APP_MANAGER);
47 
48  // Basic grid configuration
49  $this->setTitle('common.plugins');
50 
51  // Set the no items row text
52  $this->setEmptyRowText('grid.noItems');
53 
54  // Columns
55  import('lib.pkp.controllers.grid.plugins.PluginGridCellProvider');
56  $pluginCellProvider = new PluginGridCellProvider();
57  $this->addColumn(
58  new GridColumn('name',
59  'common.name',
60  null,
61  null,
62  $pluginCellProvider,
63  array(
64  'showTotalItemsNumber' => true,
65  'collapseAllColumnsInCategories' => true
66  )
67  )
68  );
69 
70  $descriptionColumn = new GridColumn(
71  'description',
72  'common.description',
73  null,
74  null,
75  $pluginCellProvider
76  );
77  $descriptionColumn->addFlag('html', true);
78  $this->addColumn($descriptionColumn);
79 
80  $this->addColumn(
81  new GridColumn('enabled',
82  'common.enabled',
83  null,
84  'controllers/grid/common/cell/selectStatusCell.tpl',
85  $pluginCellProvider
86  )
87  );
88 
89  $router = $request->getRouter();
90 
91  // Grid level actions.
92  $userRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES);
93  if (in_array(ROLE_ID_SITE_ADMIN, $userRoles)) {
94  import('lib.pkp.classes.linkAction.request.AjaxModal');
95 
96  // Install plugin.
97  $this->addAction(
98  new LinkAction(
99  'upload',
100  new AjaxModal(
101  $router->url($request, null, null, 'uploadPlugin'),
102  __('manager.plugins.upload'), 'modal_add_file'),
103  __('manager.plugins.upload'),
104  'add'));
105  }
106  }
107 
111  protected function getFilterForm() {
112  return 'controllers/grid/plugins/pluginGridFilter.tpl';
113  }
114 
118  function getFilterSelectionData($request) {
119  $category = $request->getUserVar('category');
120  $pluginName = $request->getUserVar('pluginName');
121 
122  if (is_null($category)) {
123  $category = PLUGIN_GALLERY_ALL_CATEGORY_SEARCH_VALUE;
124  }
125 
126  return array('category' => $category, 'pluginName' => $pluginName);
127  }
128 
132  function renderFilter($request, $filterData = array()) {
133  $categoriesSymbolic = $this->loadData($request, null);
134  $categories = array(PLUGIN_GALLERY_ALL_CATEGORY_SEARCH_VALUE => __('grid.plugin.allCategories'));
135  foreach ($categoriesSymbolic as $category) {
136  $categories[$category] = __("plugins.categories.$category");
137  }
138  $filterData['categories'] = $categories;
139 
140  return parent::renderFilter($request, $filterData);
141  }
142 
146  protected function getCategoryRowInstance() {
147  import('lib.pkp.controllers.grid.plugins.PluginCategoryGridRow');
148  return new PluginCategoryGridRow();
149  }
150 
154  function loadCategoryData($request, &$categoryDataElement, $filter = null) {
155  $plugins = PluginRegistry::loadCategory($categoryDataElement);
156 
157  $versionDao = DAORegistry::getDAO('VersionDAO'); /* @var $versionDao VersionDAO */
158  import('lib.pkp.classes.site.VersionCheck');
159  $fileManager = new FileManager();
160 
161  $notHiddenPlugins = array();
162  foreach ((array) $plugins as $plugin) {
163  if (!$plugin->getHideManagement()) {
164  $notHiddenPlugins[$plugin->getName()] = $plugin;
165  }
166  $version = $plugin->getCurrentVersion();
167  if ($version == null) { // this plugin is on the file system, but not installed.
168  $versionFile = $plugin->getPluginPath() . '/version.xml';
169  if ($fileManager->fileExists($versionFile)) {
170  $versionInfo = VersionCheck::parseVersionXML($versionFile);
171  $pluginVersion = $versionInfo['version'];
172  } else {
173  $pluginVersion = new Version(
174  1, 0, 0, 0, // Major, minor, revision, build
175  Core::getCurrentDate(), // Date installed
176  1, // Current
177  'plugins.'.$plugin->getCategory(), // Type
178  basename($plugin->getPluginPath()), // Product
179  '', // Class name
180  0, // Lazy load
181  $plugin->isSitePlugin() // Site wide
182  );
183  }
184  $versionDao->insertVersion($pluginVersion, true);
185  }
186  }
187 
188  if (!is_null($filter) && isset($filter['pluginName']) && $filter['pluginName'] != "") {
189  // Find all plugins that have the filter name string in their display names.
190  $filteredPlugins = array();
191  foreach ($notHiddenPlugins as $plugin) { /* @var $plugin Plugin */
192  $pluginName = $plugin->getDisplayName();
193  if (stristr($pluginName, $filter['pluginName']) !== false) {
194  $filteredPlugins[$plugin->getName()] = $plugin;
195  }
196  }
197  return $filteredPlugins;
198  }
199 
200  return $notHiddenPlugins;
201  }
202 
207  return 'category';
208  }
209 
213  protected function loadData($request, $filter) {
214  $categories = PluginRegistry::getCategories();
215  if (is_array($filter) && isset($filter['category']) && array_search($filter['category'], $categories) !== false) {
216  return array($filter['category'] => $filter['category']);
217  } else {
218  return array_combine($categories, $categories);
219  }
220  }
221 
222 
223  //
224  // Public handler methods.
225  //
232  function manage($args, $request) {
233  $plugin = $this->getAuthorizedContextObject(ASSOC_TYPE_PLUGIN); /* @var $plugin Plugin */
234  return $plugin->manage($args, $request);
235  }
236 
243  function enable($args, $request) {
244  $plugin = $this->getAuthorizedContextObject(ASSOC_TYPE_PLUGIN); /* @var $plugin Plugin */
245  if ($request->checkCSRF() && $plugin->getCanEnable()) {
246  $plugin->setEnabled(true);
247  if (empty($args['disableNotification'])) {
248  $user = $request->getUser();
249  $notificationManager = new NotificationManager();
250  $notificationManager->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_PLUGIN_ENABLED, array('pluginName' => $plugin->getDisplayName()));
251  }
252  return DAO::getDataChangedEvent($request->getUserVar('plugin'), $request->getUserVar($this->getCategoryRowIdParameterName()));
253  }
254  return new JSONMessage(false);
255  }
256 
263  function disable($args, $request) {
264  $plugin = $this->getAuthorizedContextObject(ASSOC_TYPE_PLUGIN); /* @var $plugin Plugin */
265  if ($request->checkCSRF() && $plugin->getCanDisable()) {
266  $plugin->setEnabled(false);
267  if (empty($args['disableNotification'])) {
268  $user = $request->getUser();
269  $notificationManager = new NotificationManager();
270  $notificationManager->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_PLUGIN_DISABLED, array('pluginName' => $plugin->getDisplayName()));
271  }
272  return DAO::getDataChangedEvent($request->getUserVar('plugin'), $request->getUserVar($this->getCategoryRowIdParameterName()));
273  }
274  return new JSONMessage(false);
275  }
276 
283  function uploadPlugin($args, $request) {
284  return $this->_showUploadPluginForm(PLUGIN_ACTION_UPLOAD, $request);
285  }
286 
293  function upgradePlugin($args, $request) {
294  return $this->_showUploadPluginForm(PLUGIN_ACTION_UPGRADE, $request);
295  }
296 
303  function uploadPluginFile($args, $request) {
304  import('lib.pkp.classes.file.TemporaryFileManager');
305  $temporaryFileManager = new TemporaryFileManager();
306  $user = $request->getUser();
307 
308  // Return the temporary file id.
309  if ($temporaryFile = $temporaryFileManager->handleUpload('uploadedFile', $user->getId())) {
310  $json = new JSONMessage(true);
311  $json->setAdditionalAttributes(array(
312  'temporaryFileId' => $temporaryFile->getId()
313  ));
314  return $json;
315  } else {
316  return new JSONMessage(false, __('manager.plugins.uploadError'));
317  }
318  }
319 
326  function saveUploadPlugin($args, $request) {
327  $function = $request->getUserVar('function');
328  $uploadPluginForm = new UploadPluginForm($function);
329  $uploadPluginForm->readInputData();
330 
331  if($uploadPluginForm->validate()) {
332  if($uploadPluginForm->execute()) {
333  return DAO::getDataChangedEvent();
334  }
335  }
336 
337  return new JSONMessage(false);
338  }
339 
346  function deletePlugin($args, $request) {
347  if (!$request->checkCSRF()) return new JSONMessage(false);
348 
349  $plugin = $this->getAuthorizedContextObject(ASSOC_TYPE_PLUGIN);
350  $category = $plugin->getCategory();
351  $productName = basename($plugin->getPluginPath());
352 
353  $versionDao = DAORegistry::getDAO('VersionDAO'); /* @var $versionDao VersionDAO */
354  $installedPlugin = $versionDao->getCurrentVersion('plugins.'.$category, $productName, true);
355 
356  $notificationMgr = new NotificationManager();
357  $user = $request->getUser();
358 
359  if ($installedPlugin) {
360  $pluginName = array('pluginName' => $plugin->getDisplayName());
361  $pluginDest = Core::getBaseDir() . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . $category . DIRECTORY_SEPARATOR . $productName;
362  $pluginLibDest = Core::getBaseDir() . DIRECTORY_SEPARATOR . PKP_LIB_PATH . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . $category . DIRECTORY_SEPARATOR . $productName;
363 
364  // make sure plugin type is valid and then delete the files
365  if (in_array($category, PluginRegistry::getCategories())) {
366  // Delete the plugin from the file system.
367  $fileManager = new FileManager();
368  $fileManager->rmtree($pluginDest);
369  $fileManager->rmtree($pluginLibDest);
370  }
371 
372  if(is_dir($pluginDest) || is_dir($pluginLibDest)) {
373  $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_ERROR, array('contents' => __('manager.plugins.deleteError', $pluginName)));
374  } else {
375  $versionDao->disableVersion('plugins.'.$category, $productName);
376  $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_SUCCESS, array('contents' => __('manager.plugins.deleteSuccess', $pluginName)));
377  }
378  } else {
379  $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_ERROR, array('contents' => __('manager.plugins.doesNotExist', $pluginName)));
380  }
381 
382  return DAO::getDataChangedEvent($plugin->getName());
383  }
384 
391  function _showUploadPluginForm($function, $request) {
392  import('lib.pkp.controllers.grid.plugins.form.UploadPluginForm');
393  $uploadPluginForm = new UploadPluginForm($function);
394  $uploadPluginForm->initData();
395 
396  return new JSONMessage(true, $uploadPluginForm->fetch($request));
397  }
398 }
PKPHandler\addRoleAssignment
addRoleAssignment($roleIds, $operations)
Definition: PKPHandler.inc.php:213
GridHandler\setEmptyRowText
setEmptyRowText($emptyRowText)
Definition: GridHandler.inc.php:231
TemporaryFileManager
Definition: TemporaryFileManager.inc.php:19
GridColumn
The GridColumn class represents a column within a grid. It is used to format the data presented in a ...
Definition: GridColumn.inc.php:27
PluginGridHandler\saveUploadPlugin
saveUploadPlugin($args, $request)
Definition: PluginGridHandler.inc.php:326
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
PluginGridHandler\enable
enable($args, $request)
Definition: PluginGridHandler.inc.php:243
PluginGridCellProvider
Cell provider for columns in a plugin grid.
Definition: PluginGridCellProvider.inc.php:18
PluginGridHandler
Handle plugins grid requests.
Definition: PluginGridHandler.inc.php:20
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
PluginGridHandler\uploadPluginFile
uploadPluginFile($args, $request)
Definition: PluginGridHandler.inc.php:303
Version
Describes system version history.
Definition: Version.inc.php:18
PluginGridHandler\disable
disable($args, $request)
Definition: PluginGridHandler.inc.php:263
PluginGridHandler\getCategoryRowInstance
getCategoryRowInstance()
Definition: PluginGridHandler.inc.php:146
PluginGridHandler\manage
manage($args, $request)
Definition: PluginGridHandler.inc.php:232
PluginGridHandler\initialize
initialize($request, $args=null)
Definition: PluginGridHandler.inc.php:42
PluginGridHandler\uploadPlugin
uploadPlugin($args, $request)
Definition: PluginGridHandler.inc.php:283
GridHandler\addAction
addAction($action, $position=GRID_ACTION_POSITION_ABOVE)
Definition: GridHandler.inc.php:266
GridHandler\addColumn
addColumn($column)
Definition: GridHandler.inc.php:335
PluginGridHandler\getFilterSelectionData
getFilterSelectionData($request)
Definition: PluginGridHandler.inc.php:118
PluginRegistry\loadCategory
static loadCategory($category, $enabledOnly=false, $mainContextId=null)
Definition: PluginRegistry.inc.php:103
DAO\getDataChangedEvent
static getDataChangedEvent($elementId=null, $parentElementId=null, $content='')
Definition: DAO.inc.php:647
PluginGridHandler\getFilterForm
getFilterForm()
Definition: PluginGridHandler.inc.php:111
PluginGridHandler\loadData
loadData($request, $filter)
Definition: PluginGridHandler.inc.php:213
PluginGridHandler\getCategoryRowIdParameterName
getCategoryRowIdParameterName()
Definition: PluginGridHandler.inc.php:206
PluginGridHandler\deletePlugin
deletePlugin($args, $request)
Definition: PluginGridHandler.inc.php:346
PluginGridHandler\loadCategoryData
loadCategoryData($request, &$categoryDataElement, $filter=null)
Definition: PluginGridHandler.inc.php:154
JSONMessage
Class to represent a JSON (Javascript Object Notation) message.
Definition: JSONMessage.inc.php:18
PluginGridHandler\upgradePlugin
upgradePlugin($args, $request)
Definition: PluginGridHandler.inc.php:293
AjaxModal
A modal that retrieves its content from via AJAX.
Definition: AjaxModal.inc.php:18
LinkAction
Base class defining an action that can be performed by the user in the user interface.
Definition: LinkAction.inc.php:22
CategoryGridHandler
Class defining basic operations for handling HTML grids with categories.
Definition: CategoryGridHandler.inc.php:23
GridHandler\setTitle
setTitle($title)
Definition: GridHandler.inc.php:215
PluginRegistry\getCategories
static getCategories()
Definition: PluginRegistry.inc.php:196
PluginGridHandler\_showUploadPluginForm
_showUploadPluginForm($function, $request)
Definition: PluginGridHandler.inc.php:391
UploadPluginForm
Form to upload a plugin file.
Definition: UploadPluginForm.inc.php:22
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
PluginGridHandler\renderFilter
renderFilter($request, $filterData=array())
Definition: PluginGridHandler.inc.php:132
Core\getCurrentDate
static getCurrentDate($ts=null)
Definition: Core.inc.php:63
NotificationManager
Definition: NotificationManager.inc.php:19
Core\getBaseDir
static getBaseDir()
Definition: Core.inc.php:37
FileManager
Class defining basic operations for file management.
Definition: FileManager.inc.php:35
PluginCategoryGridRow
Plugin category grid row definition.
Definition: PluginCategoryGridRow.inc.php:18
PluginGridHandler\__construct
__construct($roles)
Definition: PluginGridHandler.inc.php:25
VersionCheck\parseVersionXML
static parseVersionXML($url)
Definition: VersionCheck.inc.php:74