Open Journal Systems  3.3.0
AdminLanguageGridHandler.inc.php
1 <?php
2 
18 import('lib.pkp.controllers.grid.languages.LanguageGridHandler');
19 import('lib.pkp.controllers.grid.languages.LanguageGridRow');
20 import('lib.pkp.controllers.grid.languages.form.InstallLanguageForm');
21 
26  function __construct() {
27  parent::__construct();
28  $this->addRoleAssignment(
29  array(ROLE_ID_SITE_ADMIN),
30  array(
31  'fetchGrid', 'fetchRow',
32  'installLocale', 'saveInstallLocale', 'uninstallLocale',
33  'disableLocale', 'enableLocale', 'setPrimaryLocale'
34  )
35  );
36  }
37 
38 
39  //
40  // Implement template methods from PKPHandler.
41  //
45  public function authorize($request, &$args, $roleAssignments) {
46  import('lib.pkp.classes.security.authorization.PolicySet');
47  $rolePolicy = new PolicySet(COMBINING_PERMIT_OVERRIDES);
48 
49  import('lib.pkp.classes.security.authorization.RoleBasedHandlerOperationPolicy');
50  foreach($roleAssignments as $role => $operations) {
51  $rolePolicy->addPolicy(new RoleBasedHandlerOperationPolicy($request, $role, $operations));
52  }
53  $this->addPolicy($rolePolicy);
54 
55  return parent::authorize($request, $args, $roleAssignments);
56  }
57 
61  public function initialize($request, $args = null) {
62  parent::initialize($request, $args);
63 
65  LOCALE_COMPONENT_PKP_ADMIN,
66  LOCALE_COMPONENT_PKP_MANAGER,
67  LOCALE_COMPONENT_APP_MANAGER,
68  LOCALE_COMPONENT_APP_ADMIN
69  );
70 
71  // Grid actions.
72  $router = $request->getRouter();
73 
74  import('lib.pkp.classes.linkAction.request.AjaxModal');
75  $this->addAction(
76  new LinkAction(
77  'installLocale',
78  new AjaxModal(
79  $router->url($request, null, null, 'installLocale', null, null),
80  __('admin.languages.installLocale'),
81  null,
82  true
83  ),
84  __('admin.languages.installLocale'),
85  'add')
86  );
87 
88  // Columns.
89  // Enable locale.
90  $this->addColumn(
91  new GridColumn(
92  'enable',
93  'common.enable',
94  null,
95  'controllers/grid/common/cell/selectStatusCell.tpl',
96  $this->getCellProvider(),
97  array('width' => 10)
98  )
99  );
100 
101  // Locale name.
102  $this->addNameColumn();
103 
104  // Primary locale.
105  if ($this->_canManage($request)) {
106  $primaryId = 'contextPrimary';
107  } else {
108  $primaryId = 'sitePrimary';
109  }
110  $this->addPrimaryColumn($primaryId);
111 
112  if ($this->_canManage($request)) {
113  $this->addManagementColumns();
114  }
115 
116  $this->setFootNote('admin.locale.maybeIncomplete');
117  }
118 
119 
120  //
121  // Implement methods from GridHandler.
122  //
126  protected function loadData($request, $filter) {
127  $site = $request->getSite();
128  $data = array();
129 
130  $allLocales = AppLocale::getAllLocales();
131  $installedLocales = $site->getInstalledLocales();
132  $supportedLocales = $site->getSupportedLocales();
133  $primaryLocale = $site->getPrimaryLocale();
134 
135  foreach($installedLocales as $localeKey) {
136  $data[$localeKey] = array();
137  $data[$localeKey]['name'] = $allLocales[$localeKey];
138  $data[$localeKey]['incomplete'] = !AppLocale::isLocaleComplete($localeKey);
139  if (in_array($localeKey, $supportedLocales)) {
140  $supported = true;
141  } else {
142  $supported = false;
143  }
144  $data[$localeKey]['supported'] = $supported;
145 
146  if ($this->_canManage($request)) {
147  $context = $request->getContext();
148  $primaryLocale = $context->getPrimaryLocale();
149  }
150 
151  if ($localeKey == $primaryLocale) {
152  $primary = true;
153  } else {
154  $primary = false;
155  }
156  $data[$localeKey]['primary'] = $primary;
157  }
158 
159  if ($this->_canManage($request)) {
160  $data = $this->addManagementData($request, $data);
161  }
162 
163  return $data;
164  }
165 
166 
167  //
168  // Public grid actions.
169  //
176  public function installLocale($args, $request) {
177  // Form handling.
178  $installLanguageForm = new InstallLanguageForm();
179  $installLanguageForm->initData();
180  return new JSONMessage(true, $installLanguageForm->fetch($request));
181 
182  }
183 
190  public function saveInstallLocale($args, $request) {
191  $installLanguageForm = new InstallLanguageForm();
192  $installLanguageForm->readInputData();
193 
194  if ($installLanguageForm->validate()) {
195  $installLanguageForm->execute();
196  $this->_updateContextLocaleSettings($request);
197 
198  $notificationManager = new NotificationManager();
199  $user = $request->getUser();
200  $notificationManager->createTrivialNotification(
201  $user->getId(), NOTIFICATION_TYPE_SUCCESS,
202  array('contents' => __('notification.localeInstalled'))
203  );
204  }
205  return DAO::getDataChangedEvent();
206  }
207 
214  public function uninstallLocale($args, $request) {
215  $site = $request->getSite();
216  $locale = $request->getUserVar('rowId');
217  $gridData = $this->getGridDataElements($request);
218 
219  if ($request->checkCSRF() && array_key_exists($locale, $gridData)) {
220  $localeData = $gridData[$locale];
221  if ($localeData['primary']) return new JSONMessage(false);
222 
223  $installedLocales = $site->getInstalledLocales();
224  if (in_array($locale, $installedLocales)) {
225  $installedLocales = array_diff($installedLocales, array($locale));
226  $site->setInstalledLocales($installedLocales);
227  $supportedLocales = $site->getSupportedLocales();
228  $supportedLocales = array_diff($supportedLocales, array($locale));
229  $site->setSupportedLocales($supportedLocales);
230  $siteDao = DAORegistry::getDAO('SiteDAO'); /* @var $siteDao SiteDAO */
231  $siteDao->updateObject($site);
232 
233  $this->_updateContextLocaleSettings($request);
235 
236  $notificationManager = new NotificationManager();
237  $user = $request->getUser();
238  $notificationManager->createTrivialNotification(
239  $user->getId(), NOTIFICATION_TYPE_SUCCESS,
240  array('contents' => __('notification.localeUninstalled', array('locale' => $localeData['name'])))
241  );
242  }
243  return DAO::getDataChangedEvent($locale);
244  }
245 
246  return new JSONMessage(false);
247  }
248 
255  public function enableLocale($args, $request) {
256  $rowId = $request->getUserVar('rowId');
257  $gridData = $this->getGridDataElements($request);
258 
259  if (array_key_exists($rowId, $gridData)) {
260  $this->_updateLocaleSupportState($request, $rowId, true);
261 
262  $notificationManager = new NotificationManager();
263  $user = $request->getUser();
264  $notificationManager->createTrivialNotification(
265  $user->getId(), NOTIFICATION_TYPE_SUCCESS,
266  array('contents' => __('notification.localeEnabled'))
267  );
268  }
269 
270  return DAO::getDataChangedEvent($rowId);
271  }
272 
279  public function disableLocale($args, $request) {
280  $locale = $request->getUserVar('rowId');
281  $gridData = $this->getGridDataElements($request);
282  $notificationManager = new NotificationManager();
283  $user = $request->getUser();
284 
285  if ($request->checkCSRF() && array_key_exists($locale, $gridData)) {
286  // Don't disable primary locales.
287  if ($gridData[$locale]['primary']) {
288  $notificationManager->createTrivialNotification(
289  $user->getId(), NOTIFICATION_TYPE_ERROR,
290  array('contents' => __('admin.languages.cantDisable'))
291  );
292  } else {
293  $this->_updateLocaleSupportState($request, $locale, false);
294  $notificationManager->createTrivialNotification(
295  $user->getId(), NOTIFICATION_TYPE_SUCCESS,
296  array('contents' => __('notification.localeDisabled'))
297  );
298  }
299  return DAO::getDataChangedEvent($locale);
300  }
301 
302  return new JSONMessage(false);
303  }
304 
305 
312  public function setPrimaryLocale($args, $request) {
313  $rowId = $request->getUserVar('rowId');
314  $gridData = $this->getGridDataElements($request);
315  $localeData = $gridData[$rowId];
316  $notificationManager = new NotificationManager();
317  $user = $request->getUser();
318  $site = $request->getSite();
319 
320  if (array_key_exists($rowId, $gridData)) {
321  if (AppLocale::isLocaleValid($rowId)) {
322  $oldSitePrimaryLocale = $site->getPrimaryLocale();
323  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
324  $userDao->changeSitePrimaryLocale($oldSitePrimaryLocale, $rowId);
325  $site->setPrimaryLocale($rowId);
326  $siteDao = DAORegistry::getDAO('SiteDAO'); /* @var $siteDao SiteDAO */
327  $siteDao->updateObject($site);
328 
329  $notificationManager->createTrivialNotification(
330  $user->getId(), NOTIFICATION_TYPE_SUCCESS,
331  array('contents' => __('notification.primaryLocaleDefined', array('locale' => $localeData['name'])))
332  );
333  }
334  }
335 
336  // Need to refresh whole grid to remove the check in others
337  // primary locale radio buttons.
338  return DAO::getDataChangedEvent();
339  }
340 
341 
342  //
343  // Helper methods.
344  //
351  protected function _updateLocaleSupportState($request, $rowId, $enable) {
352  $newSupportedLocales = array();
353  $gridData = $this->getGridDataElements($request);
354 
355  foreach ($gridData as $locale => $data) {
356  if ($data['supported']) {
357  array_push($newSupportedLocales, $locale);
358  }
359  }
360 
361  if (AppLocale::isLocaleValid($rowId)) {
362  if ($enable) {
363  array_push($newSupportedLocales, $rowId);
364  } else {
365  $key = array_search($rowId, $newSupportedLocales);
366  if ($key !== false) unset($newSupportedLocales[$key]);
367  }
368  }
369 
370  $site = $request->getSite();
371  $site->setSupportedLocales($newSupportedLocales);
372 
373  $siteDao = DAORegistry::getDAO('SiteDAO'); /* @var $siteDao SiteDAO */
374  $siteDao->updateObject($site);
375 
376  $this->_updateContextLocaleSettings($request);
377  }
378 
384  protected function _updateContextLocaleSettings($request) {
385  $site = $request->getSite();
386  $siteSupportedLocales = $site->getSupportedLocales();
387  $contextService = \Services::get('context');
388 
389  $contextDao = Application::getContextDAO();
390  $contexts = $contextDao->getAll();
391  while ($context = $contexts->next()) {
392  $params = [];
393  $primaryLocale = $context->getPrimaryLocale();
394  foreach (array('supportedLocales', 'supportedFormLocales', 'supportedSubmissionLocales') as $settingName) {
395  $localeList = $context->getData($settingName);
396 
397  if (is_array($localeList)) {
398  $params[$settingName] = array_intersect($localeList, $siteSupportedLocales);
399  }
400  }
401  if (!in_array($primaryLocale, $siteSupportedLocales)) {
402  $params['primaryLocale'] = $site->getPrimaryLocale();
403  $primaryLocale = $params['primaryLocale'];
404  }
405  $errors = $contextService->validate(VALIDATE_ACTION_EDIT, $params, $params['supportedLocales'], $primaryLocale);
406  // If there are errors, it's too late to do anything about it
407  assert(empty($errors));
408  $contextService->edit($context, $params, $request);
409  }
410  }
411 
418  protected function _canManage($request) {
419  $contextDao = Application::getContextDAO();
420  $contexts = $contextDao->getAll();
421  $userRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES);
422  $context = $request->getContext();
423  return ($contexts->getCount() == 1 && $context && in_array(ROLE_ID_MANAGER, $userRoles));
424  }
425 }
AdminLanguageGridHandler
Handle administrative language grid requests. If in single context (e.g. press) installation,...
Definition: AdminLanguageGridHandler.inc.php:22
PKPHandler\addRoleAssignment
addRoleAssignment($roleIds, $operations)
Definition: PKPHandler.inc.php:213
Application\getContextDAO
static getContextDAO()
Definition: Application.inc.php:137
PKPLocale\getAllLocales
static & getAllLocales()
Definition: PKPLocale.inc.php:537
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
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
GridHandler\setFootNote
setFootNote($footNote)
Definition: GridHandler.inc.php:247
LanguageGridHandler\getCellProvider
getCellProvider()
Definition: LanguageGridHandler.inc.php:171
PKPLocale\uninstallLocale
static uninstallLocale($locale)
Definition: PKPLocale.inc.php:577
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
AdminLanguageGridHandler\enableLocale
enableLocale($args, $request)
Definition: AdminLanguageGridHandler.inc.php:255
AdminLanguageGridHandler\installLocale
installLocale($args, $request)
Definition: AdminLanguageGridHandler.inc.php:176
AdminLanguageGridHandler\saveInstallLocale
saveInstallLocale($args, $request)
Definition: AdminLanguageGridHandler.inc.php:190
AdminLanguageGridHandler\_canManage
_canManage($request)
Definition: AdminLanguageGridHandler.inc.php:418
PKPLocale\isLocaleComplete
static isLocaleComplete($locale)
Definition: PKPLocale.inc.php:478
GridHandler\getGridDataElements
& getGridDataElements($request)
Definition: GridHandler.inc.php:345
GridHandler\addAction
addAction($action, $position=GRID_ACTION_POSITION_ABOVE)
Definition: GridHandler.inc.php:266
GridHandler\addColumn
addColumn($column)
Definition: GridHandler.inc.php:335
LanguageGridHandler\addPrimaryColumn
addPrimaryColumn($columnId)
Definition: LanguageGridHandler.inc.php:197
DAO\getDataChangedEvent
static getDataChangedEvent($elementId=null, $parentElementId=null, $content='')
Definition: DAO.inc.php:647
AdminLanguageGridHandler\disableLocale
disableLocale($args, $request)
Definition: AdminLanguageGridHandler.inc.php:279
LanguageGridHandler\addManagementData
addManagementData($request, $data)
Definition: LanguageGridHandler.inc.php:254
AdminLanguageGridHandler\_updateContextLocaleSettings
_updateContextLocaleSettings($request)
Definition: AdminLanguageGridHandler.inc.php:384
JSONMessage
Class to represent a JSON (Javascript Object Notation) message.
Definition: JSONMessage.inc.php:18
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
AdminLanguageGridHandler\loadData
loadData($request, $filter)
Definition: AdminLanguageGridHandler.inc.php:126
AdminLanguageGridHandler\_updateLocaleSupportState
_updateLocaleSupportState($request, $rowId, $enable)
Definition: AdminLanguageGridHandler.inc.php:351
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
InstallLanguageForm
Form for installing languages.
Definition: InstallLanguageForm.inc.php:19
NotificationManager
Definition: NotificationManager.inc.php:19
LanguageGridHandler\addNameColumn
addNameColumn()
Definition: LanguageGridHandler.inc.php:178
LanguageGridHandler\addManagementColumns
addManagementColumns()
Definition: LanguageGridHandler.inc.php:214
AdminLanguageGridHandler\__construct
__construct()
Definition: AdminLanguageGridHandler.inc.php:26
RoleBasedHandlerOperationPolicy
Class to control access to handler operations via role based access control.
Definition: RoleBasedHandlerOperationPolicy.inc.php:18
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
AdminLanguageGridHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: AdminLanguageGridHandler.inc.php:45
PKPLocale\isLocaleValid
static isLocaleValid($locale)
Definition: PKPLocale.inc.php:505
AdminLanguageGridHandler\uninstallLocale
uninstallLocale($args, $request)
Definition: AdminLanguageGridHandler.inc.php:214
PolicySet
An ordered list of policies. Policy sets can be added to decision managers like policies....
Definition: PolicySet.inc.php:26
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49
LanguageGridHandler
Handle language grid requests.
Definition: LanguageGridHandler.inc.php:20
AdminLanguageGridHandler\setPrimaryLocale
setPrimaryLocale($args, $request)
Definition: AdminLanguageGridHandler.inc.php:312
AdminLanguageGridHandler\initialize
initialize($request, $args=null)
Definition: AdminLanguageGridHandler.inc.php:61