Open Journal Systems  3.3.0
MarkupPlugin.inc.php
1 <?php
2 
30 import('lib.pkp.classes.plugins.GenericPlugin');
31 
32 class MarkupPlugin extends GenericPlugin {
33 
35  protected $_formatList = array('epub','xml','pdf');
36 
38  protected $_xmlConversionStages = array(WORKFLOW_STAGE_ID_SUBMISSION,WORKFLOW_STAGE_ID_INTERNAL_REVIEW,WORKFLOW_STAGE_ID_EXTERNAL_REVIEW,WORKFLOW_STAGE_ID_EDITING,WORKFLOW_STAGE_ID_PRODUCTION);
39 
45  public function getFormatList() {
46  return $this->_formatList;
47  }
48 
54  public function getXmlConversionStages() {
56  }
57 
64  function getName() {
65  return 'markupplugin';
66  }
67 
73  function getDisplayName() {
74  return __('plugins.generic.markup.displayName');
75  }
76 
82  function getDescription() {
83  return __('plugins.generic.markup.description');
84  }
85 
86 
90  function register($category, $path, $mainContextId = null) {
91 
92  if (parent::register($category, $path, $mainContextId)) {
93  if ($this->getEnabled()) {
94  $this->import('classes.MarkupJobInfoDAO');
95 
96  $markupJobInfoDao = new MarkupJobInfoDAO($this);
97  DAORegistry::registerDAO('MarkupJobInfoDAO', $markupJobInfoDao);
98 
99  $request = $this->getRequest();
100  $templateMgr = TemplateManager::getManager($request);
101  $templateMgr->addStyleSheet(
102  'markupBatchConvertStyle',
103  $this->getCssUrl($request).'/batch.css',
104  array('contexts' => 'backend')
105  );
106  $templateMgr->addJavaScript(
107  'markupBatchConvertScript',
108  $this->getJsUrl($request).'/MarkupSubmissionsBatchConversionFormHandler.js',
109  array('contexts' => 'backend')
110  );
111 
112  // Register callbacks.
113  HookRegistry::register('LoadHandler', array($this, 'callbackLoadMarkupHandler'));
114  HookRegistry::register('LoadHandler', array($this, 'callbackLoadBatchHandler'));
115  HookRegistry::register('TemplateManager::fetch', array($this, 'templateFetchCallback'));
116  HookRegistry::register('PluginRegistry::loadCategory', array($this, 'callbackLoadCategory'));
117  HookRegistry::register('Templates::Management::Settings::website', array($this, 'callbackShowWebsiteSettingsTabs'));
118  HookRegistry::register('Templates::Management::Settings::website', array($this, 'callbackShowArticlesBatchConversionTabs'));
119  HookRegistry::register('Templates::User::profile', array($this, 'callbackUserProfile'));
120  HookRegistry::register('submissionfiledaodelegate::_deleteobject', array($this, 'callbackSubmissionFileDeleted'));
121  }
122  return true;
123  }
124  return false;
125  }
126 
130  function callbackLoadCategory($hookName, $args) {
131  $category = $args[0];
132  $plugins =& $args[1];
133  if ($category == 'gateways') {
134  $this->import('MarkupGatewayPlugin');
135  $gatewayPlugin = new MarkupGatewayPlugin($this->getName());
136  $plugins[$gatewayPlugin->getSeq()][$gatewayPlugin->getPluginPath()] = $gatewayPlugin;
137 
138  // batch conversion
139  $this->import('MarkupBatchGatewayPlugin');
140  $batchGatewayPlugin = new MarkupBatchGatewayPlugin($this->getName());
141  $plugins[$batchGatewayPlugin->getSeq()][$batchGatewayPlugin->getPluginPath()] = $batchGatewayPlugin;
142  }
143  }
144 
150  return $this->getPluginPath() . '/settings.xml';
151  }
152 
158  function getJsPath() {
159  $baseDir = Core::getBaseDir();
160  return $baseDir . '/' . parent::getPluginPath() . '/js/';
161  }
162 
168  function getCssUrl($request) {
169  return $request->getBaseUrl() . '/' . $this->getPluginPath() . '/css';
170  }
171 
177  function getJsUrl($request) {
178  return $request->getBaseUrl() . '/' . $this->getPluginPath() . '/js';
179  }
180 
185  function getInstallSchemaFile() {
186  return $this->getPluginPath() . '/schema.xml';
187  }
188 
192  function getActions($request, $verb) {
193  $dispatcher = $request->getDispatcher();
194  import('lib.pkp.classes.linkAction.request.RedirectAction');
195  return array_merge(
196  $this->getEnabled()?array(
197  new LinkAction(
198  'settings',
199  new RedirectAction($dispatcher->url(
200  $request, ROUTE_PAGE,
201  null, 'management', 'settings', 'website',
202  array('uid' => uniqid()), // Force reload
203  'markup' // Anchor for tab
204  )),
205  __('plugins.generic.markup.settings'),
206  null
207  ),
208  ):array(),
209  $this->getEnabled()?array(
210  new LinkAction(
211  'batch',
212  new RedirectAction($dispatcher->url(
213  $request, ROUTE_PAGE,
214  null, 'management', 'settings', 'website',
215  array('uid' => uniqid()), // Force reload
216  'markupBatchConversion' // Anchor for tab
217  )),
218  __('plugins.generic.markup.batch'),
219  null
220  ),
221  ):array(),
222  parent::getActions($request, $verb)
223  );
224  }
225 
229  function manage($args, $request) {
230 
231  $this->import('MarkupSettingsForm');
232  $journal = $request->getJournal();
233 
234  switch ($request->getUserVar('verb')) {
235  case 'settings':
236  $context = $request->getContext();
237  PKPLocale::requireComponents(LOCALE_COMPONENT_APP_COMMON, LOCALE_COMPONENT_PKP_MANAGER);
238  $templateMgr = TemplateManager::getManager($request);
239  $form = new MarkupSettingsForm($this, $context->getId());
240  if ($request->getUserVar('save')) {
241  $form->readInputData();
242  if ($form->validate()) {
243  $form->execute();
244  $notificationManager = new NotificationManager();
245  $notificationManager->createTrivialNotification(
246  $request->getUser()->getId(),
247  NOTIFICATION_TYPE_SUCCESS,
248  array('contents' => __('plugins.generic.markup.settings.saved'))
249  );
250  return new JSONMessage(true);
251  }
252  } else {
253  $form->initData();
254  }
255  return new JSONMessage(true, $form->fetch($request));
256  }
257  return parent::manage($args, $request);
258  }
259 
266  public function callbackShowWebsiteSettingsTabs($hookName, $args) {
267  $output =& $args[2];
268  $request =& Registry::get('request');
269  $dispatcher = $request->getDispatcher();
270  $output .= '<li><a name="markup" href="' . $dispatcher->url($request, ROUTE_PAGE, null, 'markup', 'settings') . '">' . __('plugins.generic.markup.settings') . '</a></li>';
271  return false;
272  }
273 
280  public function callbackShowArticlesBatchConversionTabs($hookName, $args) {
281  $output =& $args[2];
282  $request =& Registry::get('request');
283  $dispatcher = $request->getDispatcher();
284  $output .= '<li><a name="markupBatchConversion" href="' . $dispatcher->url($request, ROUTE_PAGE, null, 'markup', 'batch') . '">' . __('plugins.generic.markup.batch') . '</a></li>';
285  return false;
286  }
287 
291  public function callbackLoadMarkupHandler($hookName, $args) {
292  // Check the page.
293  $page = $args[0];
294  if ($page !== 'markup') return;
295 
296  // Check the operation.
297  $op = $args[1];
298 
299  if ($op == 'settings') { // settings tab
300  define('HANDLER_CLASS', 'MarkupSettingsTabHandler');
301  $args[2] = $this->getPluginPath() . '/' . 'MarkupSettingsTabHandler.inc.php';
302  }
303  else {
304  $publicOps = array(
305  'convertToXml',
306  'generateGalleyFiles',
307  'profile',
308  'triggerConversion',
309  'fetchConversionJobStatus',
310  'batch',
311  );
312 
313  if (!in_array($op, $publicOps)) return;
314 
315  // Get the journal object from the context (optimized).
316  $request = $this->getRequest();
317  $router = $request->getRouter();
318  $journal = $router->getContext($request); /* @var $journal Journal */
319 
320  // Looks as if our handler had been requested.
321  define('HANDLER_CLASS', 'MarkupHandler');
322 
323  // set handler file path
324  $args[2] = $this->getPluginPath() . '/' . 'MarkupHandler.inc.php';
325  }
326  }
327 
331  public function callbackLoadBatchHandler($hookName, $args) {
332  // Check the page.
333  $page = $args[0];
334  if ($page !== 'batch') return;
335 
336  $op = $args[1];
337  $publicOps = array('filesToConvert', 'startConversion', 'fetchConversionStatus', 'cancelConversion');
338  if (!in_array($op, $publicOps)) return;
339 
340  define('HANDLER_CLASS', 'MarkupBatchConversionHandler');
341  $args[2] = $this->getPluginPath() . '/' . 'MarkupBatchConversionHandler.inc.php';
342  }
343 
349  public function templateFetchCallback($hookName, $params) {
350  $request = $this->getRequest();
351  $router = $request->getRouter();
352  $dispatcher = $router->getDispatcher();
353  $journal = $request->getJournal();
354  $journalId = $journal->getId();
355 
356  $templateMgr = $params[0];
357  $resourceName = $params[1];
358  if ($resourceName == 'controllers/grid/gridRow.tpl') {
359  $row = $templateMgr->get_template_vars('row');
360  $data = $row->getData();
361  if (is_array($data) && (isset($data['submissionFile']))) {
362  $submissionFile = $data['submissionFile'];
363  $fileExtension = strtolower($submissionFile->getExtension());
364 
365  // get stage ID
366  $stage = $submissionFile->getFileStage();
367  $stageId = (int) $request->getUserVar('stageId');
368 
369  if (in_array($fileExtension, array('doc','docx','odt','pdf', 'xml'))) {
370 
371  import('lib.pkp.classes.linkAction.request.AjaxModal');
372 
373  // get list of stages for "Convert to xml" feature.
374  $xmlConversionStages = $this->getSetting($journalId, 'xmlConversionStages');
375  if (in_array($stageId, $xmlConversionStages) && ($fileExtension != 'xml')) {
376  $row->addAction(new LinkAction(
377  'convert',
378  new AjaxModal(
379  $dispatcher->url($request, ROUTE_PAGE, null, 'markup', 'convertToXml', null,
380  array(
381  'submissionId' => $submissionFile->getSubmissionId(),
382  'fileId' => $submissionFile->getFileId(),
383  'stageId' => $stageId)
384  ),
385  __('plugins.generic.markup.modal.xmlConversion')
386  ),
387  __('plugins.generic.markup.links.convertToXml'),
388  null
389  ));
390  }
391 
392  if ($stageId == WORKFLOW_STAGE_ID_PRODUCTION) {
393  $row->addAction(new LinkAction(
394  'generateGalleyFiles',
395  new AjaxModal(
396  $dispatcher->url($request, ROUTE_PAGE, null, 'markup', 'generateGalleyFiles', null,
397  array(
398  'submissionId' => $submissionFile->getSubmissionId(),
399  'fileId' => $submissionFile->getFileId(),
400  'stageId' => WORKFLOW_STAGE_ID_PRODUCTION)
401  ),
402  __('plugins.generic.markup.modal.galleyProduction')
403  ),
404  __('plugins.generic.markup.links.generateGalley'),
405  null
406  ));
407  }
408  }
409  }
410  }
411  }
412 
422  public function fetchGateway($fileId, $stageId, $target) {
423  $request = $this->getRequest();
424  $user = $request->getUser();
425 
426  $router = $request->getRouter();
427  $dispatcher = $router->getDispatcher();
428  $journal = $request->getJournal();
429 
430  // Create an access key
431  $this->import('classes.MarkupConversionHelper');
432  $accessKey = MarkupConversionHelper::makeAccessToken($user);
433  $jobId = MarkupConversionHelper::createConversionJobInfo($journal, $user, $fileId);
434 
435  $url = $request->url(null, 'gateway', 'plugin',
436  array('MarkupGatewayPlugin','fileId', $fileId, 'userId', $user->getId(),
437  'stageId', $stageId, 'jobId', $jobId, 'target', $target, 'accessKey', $accessKey)
438  );
439 
440  $ch = curl_init();
441  curl_setopt($ch, CURLOPT_URL, $url);
442  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
443  curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1000);
444  curl_exec($ch);
445  curl_close($ch);
446 
447  return $jobId;
448  }
449 
457  public function getOTSLoginParametersForJournal($journalId, $user = null) {
458  // first we try to read from config file
459  $this->import('classes.MarkupConversionHelper');
462  return $configCreds;
463  }
464 
465  $authType = $this->getSetting($journalId, 'authType');
466  switch ($authType) {
467  case 'user':
468  return array(
469  'host' => $this->getSetting($journalId, 'markupHostURL'),
470  'user' => isset($user) ? $user->getSetting('markupHostUser') : null,
471  'password' => isset($user) ? $user->getSetting('markupHostPass') : null,
472  );
473 
474  case 'site':
475  return array(
476  'host' => $this->getSetting($journalId, 'markupHostURL'),
477  'user' => $this->getSetting($journalId, 'markupHostUser'),
478  'password' => $this->getSetting($journalId, 'markupHostPass'),
479  );
480 
481  default:
482  return array(
483  'host' => null,
484  'user' => null,
485  'password' => null,
486  );
487  }
488  }
489 
496  public function callbackUserProfile($hookName, $params)
497  {
498  $request = $this->getRequest();
499  $context = $request->getContext();
500  $authType = $this->getSetting($context->getId(), 'authType');
501 
502  if ($authType == 'user') {
503  $output =& $params[2];
504  $dispatcher = $request->getDispatcher();
505  $url = $dispatcher->url($request, ROUTE_PAGE, null, 'markup', 'profile');
506 
507  $output .= '<li><a name="otsServerCredentials" ' .
508  'href="'.$url.'">' . __('plugins.generic.markup.tab.profile') . '</a></li>';
509  }
510 
511  return false;
512  }
513 
519  public function callbackSubmissionFileDeleted($hookName, $params)
520  {
521  if ((count($params) == 3) && isset($params[1])
522  && is_array($params[1]) && count($params[1] == 2)) {
523  $submissionFileId = $params[1][0];
524  $markupJobInfoDao = DAORegistry::getDAO('MarkupJobInfoDAO');
525  $markupJobInfoDao->deleteByFileId($submissionFileId);
526  }
527  }
528 }
$op
$op
Definition: lib/pkp/pages/help/index.php:18
MarkupPlugin\$_xmlConversionStages
$_xmlConversionStages
Definition: MarkupPlugin.inc.php:44
MarkupPlugin\getActions
getActions($request, $verb)
Definition: MarkupPlugin.inc.php:198
MarkupConversionHelper\createConversionJobInfo
static createConversionJobInfo($journal, $user, $fileId)
Definition: MarkupConversionHelper.inc.php:563
Plugin\getRequest
& getRequest()
Definition: Plugin.inc.php:828
MarkupPlugin\callbackShowArticlesBatchConversionTabs
callbackShowArticlesBatchConversionTabs($hookName, $args)
Definition: MarkupPlugin.inc.php:286
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
MarkupSettingsForm
Form for Document Markup gateway plugin settings.
Definition: MarkupSettingsForm.inc.php:21
MarkupPlugin\callbackUserProfile
callbackUserProfile($hookName, $params)
Definition: MarkupPlugin.inc.php:502
MarkupPlugin\callbackShowWebsiteSettingsTabs
callbackShowWebsiteSettingsTabs($hookName, $args)
Definition: MarkupPlugin.inc.php:272
MarkupPlugin\getName
getName()
Definition: MarkupPlugin.inc.php:70
MarkupPlugin\templateFetchCallback
templateFetchCallback($hookName, $params)
Definition: MarkupPlugin.inc.php:355
MarkupPlugin\getJsPath
getJsPath()
Definition: MarkupPlugin.inc.php:164
MarkupPlugin\getOTSLoginParametersForJournal
getOTSLoginParametersForJournal($journalId, $user=null)
Definition: MarkupPlugin.inc.php:463
MarkupPlugin\callbackLoadCategory
callbackLoadCategory($hookName, $args)
Definition: MarkupPlugin.inc.php:136
MarkupPlugin\getDescription
getDescription()
Definition: MarkupPlugin.inc.php:88
MarkupConversionHelper\readCredentialsFromConfig
static readCredentialsFromConfig()
Definition: MarkupConversionHelper.inc.php:611
Plugin\getEnabled
getEnabled()
Definition: Plugin.inc.php:868
Registry\get
static & get($key, $createIfEmpty=false, $createWithDefault=null)
Definition: Registry.inc.php:35
JSONMessage
Class to represent a JSON (Javascript Object Notation) message.
Definition: JSONMessage.inc.php:18
Plugin\getSetting
getSetting($contextId, $name)
Definition: Plugin.inc.php:473
DAORegistry\registerDAO
static registerDAO($name, $dao)
Definition: DAORegistry.inc.php:40
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
Seboettg\Collection\count
count()
Definition: ArrayListTrait.php:253
MarkupPlugin\$_formatList
$_formatList
Definition: MarkupPlugin.inc.php:38
MarkupPlugin\getJsUrl
getJsUrl($request)
Definition: MarkupPlugin.inc.php:183
MarkupPlugin\getDisplayName
getDisplayName()
Definition: MarkupPlugin.inc.php:79
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
RedirectAction
This action request redirects to another page.
Definition: RedirectAction.inc.php:18
MarkupPlugin\callbackLoadMarkupHandler
callbackLoadMarkupHandler($hookName, $args)
Definition: MarkupPlugin.inc.php:297
MarkupConversionHelper\canUseCredentialsFromConfig
static canUseCredentialsFromConfig($creds)
Definition: MarkupConversionHelper.inc.php:624
MarkupBatchGatewayPlugin
Batch conversion Helper class.
Definition: MarkupBatchGatewayPlugin.inc.php:19
MarkupJobInfoDAO
operations for managing MarkupJobInfo objects
Definition: MarkupJobInfoDAO.inc.php:19
Plugin\getPluginPath
getPluginPath()
Definition: Plugin.inc.php:330
MarkupPlugin
NLM XML and HTML transform plugin class.
Definition: MarkupPlugin.inc.php:32
MarkupPlugin\getInstallSchemaFile
getInstallSchemaFile()
Definition: MarkupPlugin.inc.php:191
Plugin\$request
$request
Definition: Plugin.inc.php:68
HookRegistry\register
static register($hookName, $callback, $hookSequence=HOOK_SEQUENCE_NORMAL)
Definition: HookRegistry.inc.php:70
MarkupPlugin\fetchGateway
fetchGateway($fileId, $stageId, $target)
Definition: MarkupPlugin.inc.php:428
NotificationManager
Definition: NotificationManager.inc.php:19
Core\getBaseDir
static getBaseDir()
Definition: Core.inc.php:37
MarkupPlugin\callbackLoadBatchHandler
callbackLoadBatchHandler($hookName, $args)
Definition: MarkupPlugin.inc.php:337
MarkupPlugin\callbackSubmissionFileDeleted
callbackSubmissionFileDeleted($hookName, $params)
Definition: MarkupPlugin.inc.php:525
MarkupConversionHelper\makeAccessToken
static makeAccessToken($user)
Definition: MarkupConversionHelper.inc.php:642
PKPLocale\requireComponents
static requireComponents()
Definition: PKPLocale.inc.php:374
GenericPlugin
Abstract class for generic plugins.
Definition: GenericPlugin.inc.php:18
MarkupPlugin\getCssUrl
getCssUrl($request)
Definition: MarkupPlugin.inc.php:174
MarkupGatewayPlugin
Responds to requests for markup files for particular journal article; sends request to markup an arti...
Definition: MarkupGatewayPlugin.inc.php:19
MarkupPlugin\getContextSpecificPluginSettingsFile
getContextSpecificPluginSettingsFile()
Definition: MarkupPlugin.inc.php:155
MarkupPlugin\getFormatList
getFormatList()
Definition: MarkupPlugin.inc.php:51
MarkupPlugin\manage
manage($args, $request)
Definition: MarkupPlugin.inc.php:235
MarkupPlugin\getXmlConversionStages
getXmlConversionStages()
Definition: MarkupPlugin.inc.php:60