Open Journal Systems  3.3.0
SwordImportExportPlugin.inc.php
1 <?php
2 
14 import('lib.pkp.classes.plugins.ImportExportPlugin');
15 
18  protected $_parentPlugin = null;
19 
25  public function __construct($parentPlugin) {
26  parent::__construct();
27  $this->_parentPlugin = $parentPlugin;
28  }
29 
33  public function register($category, $path, $mainContextId = null) {
34  $success = parent::register($category, $path, $mainContextId);
35  $this->addLocaleData();
36  return $success;
37  }
38 
43  public function getSwordPlugin() {
44  return $this->_parentPlugin;
45  }
46 
52  public function getName() {
53  return 'SwordImportExportPlugin';
54  }
55 
59  function getPluginPath() {
60  return $this->_parentPlugin->getPluginPath();
61  }
62 
67  public function getDisplayName() {
68  return __('plugins.importexport.sword.displayName');
69  }
70 
75  public function getDescription() {
76  return __('plugins.importexport.sword.description');
77  }
78 
85  public function display($args, $request) {
86  parent::display($args, $request);
87  $templateMgr = TemplateManager::getManager($request);
88  $context = $request->getContext();
89  switch (array_shift($args)) {
90  case 'index':
91  case '':
92  $this->getSwordPlugin()->import('classes.DepositPoint');
93  $depositPointDao = DAORegistry::getDAO('DepositPointDAO');
94  $depositPoints = $depositPointDao->getByContextId($context->getId(), null, SWORD_DEPOSIT_TYPE_MANAGER);
95  $depositPointsData = array('' => __('common.select'));
96  while ($depositPoint = $depositPoints->next()) {
97  $depositPointsData[$depositPoint->getId()] = $depositPoint->getLocalizedName();
98  }
99  $dispatcher = $request->getDispatcher();
100  $settingUrl = $dispatcher->url(
101  $request, ROUTE_PAGE,
102  null, 'management', 'settings', 'website',
103  array(),
104  'swordSettings'
105  );
106 
107  $selectSubmissionsListPanel = new \PKP\components\listPanels\PKPSelectSubmissionsListPanel(
108  'selectSubmissionsListPanel',
109  'select submissions panel',
110  [
111  'apiUrl' => $request->getDispatcher()->url(
112  $request,
113  ROUTE_API,
114  $context->getPath(),
115  '_submissions'
116  ),
117  'canSelect' => true,
118  'canSelectAll' => true,
119  'count' => 100,
120  'lazyLoad' => true,
121  'selectorName' => 'selectedSubmissions[]',
122  ]
123  );
124  $templateMgr->assign(array(
125  'selectedDepositPoint' => $request->getUserVar('selectedDepositPoint'),
126  'depositEditorial' => $request->getUserVar('depositEditorial'),
127  'depositGalleys' => $request->getUserVar('depositGalleys'),
128  'swordSettingsPageUrl' => $settingUrl,
129  'depositPoints' => $depositPointsData,
130  'pluginJavaScriptURL' => $this->getSwordPlugin()->getJsUrl($request),
131  'selectSubmissionsListData' => [
132  'components' => [
133  'selectSubmissionsListPanel' => $selectSubmissionsListPanel->getConfig()
134  ]
135  ],
136  'usingApi' => true,
137  ));
138 
139  $script = '$(document).data("depositedIdMap", '. json_encode($depositedIds) .');';
140  $templateMgr->addJavaScript('depositedIds', $script, ['inline' => true, 'contexts' => 'backend']);
141  $templateMgr->addJavaScript(
142  'disableDepositedIds',
143  $this->getSwordPlugin()->getJsUrl($request) .'/SwordDisableDepositedItems.js',
144  ['contexts' => 'backend']);
145 
146  $templateMgr->display($this->getTemplateResource('submissions.tpl'));
147  break;
148 
149  case 'deposit':
150  $context = $request->getContext();
151  $submissionDao = Application::getSubmissionDAO();
152  $this->getSwordPlugin()->import('classes.PKPSwordDeposit');
153  $depositPointId = $request->getUserVar('depositPoint');
154  $password = $request->getUserVar('swordPassword');
155  if ($password == SWORD_PASSWORD_SLUG) {
156  $depositPointDao = DAORegistry::getDAO('DepositPointDAO');
157  $depositPoint = $depositPointDao->getById($depositPointId, $context->getId());
158  if ($depositPoint) {
159  $password = $depositPoint->getSwordPassword();
160  }
161  }
162 
163  $swordDepositPoint = $request->getUserVar('swordDepositPoint');
164  $depositEditorial = $request->getUserVar('depositEditorial');
165  $depositGalleys = $request->getUserVar('depositGalleys');
166  $username = $request->getUserVar('swordUsername');
167  $depositIds = array();
168 
169  $backLink = $request->url(
170  null, null, null,
171  array('plugin', $this->getName()),
172  array(
173  'selectedDepositPoint' => $depositPointId,
174  'depositEditorial' => $depositEditorial,
175  'depositGalleys' => $depositGalleys,
176  )
177  );
178 
179  $errors = array();
180 
181  $submissionIds = $request->getUserVar('selectedSubmissions');
182  // select at least one submission
183  if (empty($submissionIds)) {
184  $errors[] = array(
185  'title' => __('plugins.importexport.sword.requiredFieldErrorTitle'),
186  'message' => __('plugins.importexport.sword.requiredFieldErrorMessage'),
187  );
188  }
189  else {
190  foreach ($submissionIds as $submissionId) {
191  $submission = $submissionDao->getById($submissionId);
192  if ($submission->getContextId() != $request->getContext()->getId()) {
193  continue;
194  }
195  try {
196  $deposit = new PKPSwordDeposit($submission);
197  $deposit->setMetadata($request);
198  if ($depositGalleys) $deposit->addGalleys();
199  if ($depositEditorial) $deposit->addEditorial();
200  $deposit->createPackage();
201  $response = $deposit->deposit(
202  $swordDepositPoint,
203  $username,
204  $password,
205  $request->getUserVar('swordApiKey'));
206 
207  $stmt_link = array_shift(
208  array_filter($response->sac_links, function($link) {
209  return $link->sac_linkrel == 'http://purl.org/net/sword/terms/statement' || $link->sac_linkrel == 'http://purl.org/net/sword/terms/add';
210  }));
211  $stmt_href = $stmt_link->sac_linkhref->__toString();
212  $data = $submission->getAllData();
213  $ssi = [];
214  if (array_has($data, 'swordStatementIri')) {
215  $ssi = unserialize($data['swordStatementIri'], true);
216  }
217  $ssi[$depositPointId] = $stmt_href;
218  $submission->setData('swordStatementIri', serialize($ssi));
219  $submissionDao->updateDataObjectSettings(
220  'submission_settings', $submission, ['submission_id' => $submissionId]);
221  $deposit->cleanup();
222  $depositIds[] = $response->sac_id;
223  }
224  catch (Exception $e) {
225  $errors[] = array(
226  'title' => $submission->getLocalizedTitle(),
227  'message' => $e->getMessage(),
228  );
229  }
230  }
231  }
232 
233  if (!empty($errors)) {
234  $errorMessage = '<dl>';
235  foreach ($errors as $error) {
236  $errorMessage .= "<dt>" . htmlentities($error['title']) . "</dt>";
237  $errorMessage .= "<dd>" . htmlentities($error['message']) . "</dd>";
238  }
239  $errorMessage .= '</dl>';
240  $templateMgr->assign(array(
241  'title' => __('plugins.importexport.sword.depositFailed'),
242  'messageTranslated' => $errorMessage,
243  'backLink' => $backLink,
244  'backLinkLabel' => 'common.back'
245  ));
246  }
247  else {
248  $templateMgr->assign(array(
249  'title' => __('plugins.importexport.sword.depositSuccessful'),
250  'message' => 'plugins.importexport.sword.depositSuccessfulDescription',
251  'backLink' => $backLink,
252  'backLinkLabel' => 'common.continue'
253  ));
254  }
255  $messageTemplateFile = $this->getSwordPlugin()->getTemplateResource('message.tpl');
256  $output = $templateMgr->fetch($messageTemplateFile);
257  return new JSONMessage(true, $output);
258  break;
259  default:
260  $dispatcher = $request->getDispatcher();
261  $dispatcher->handle404();
262  }
263  }
264 
268  public function executeCLI($scriptName, &$args) {
269  throw new Exception('SWORD plugin command-line import/export not yet implemented!');
270  }
271 
275  public function usage($scriptName) {
276  }
277 }
SwordImportExportPlugin\usage
usage($scriptName)
Definition: SwordImportExportPlugin.inc.php:278
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
SwordImportExportPlugin\getDescription
getDescription()
Definition: SwordImportExportPlugin.inc.php:78
PKPSwordDeposit
Class providing a SWORD deposit wrapper for submissions.
Definition: PKPSwordDeposit.inc.php:20
Plugin\__construct
__construct()
Definition: Plugin.inc.php:73
SwordImportExportPlugin\__construct
__construct($parentPlugin)
Definition: SwordImportExportPlugin.inc.php:28
SwordImportExportPlugin\executeCLI
executeCLI($scriptName, &$args)
Definition: SwordImportExportPlugin.inc.php:271
ImportExportPlugin
Abstract class for import/export plugins.
Definition: ImportExportPlugin.inc.php:18
SwordImportExportPlugin\display
display($args, $request)
Definition: SwordImportExportPlugin.inc.php:88
JSONMessage
Class to represent a JSON (Javascript Object Notation) message.
Definition: JSONMessage.inc.php:18
Application\getSubmissionDAO
static getSubmissionDAO()
Definition: Application.inc.php:146
SwordImportExportPlugin\getSwordPlugin
getSwordPlugin()
Definition: SwordImportExportPlugin.inc.php:46
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
SwordImportExportPlugin\getName
getName()
Definition: SwordImportExportPlugin.inc.php:55
SwordImportExportPlugin\getPluginPath
getPluginPath()
Definition: SwordImportExportPlugin.inc.php:62
Plugin\getTemplateResource
getTemplateResource($template=null, $inCore=false)
Definition: Plugin.inc.php:349
SwordImportExportPlugin\$_parentPlugin
$_parentPlugin
Definition: SwordImportExportPlugin.inc.php:21
Plugin\$request
$request
Definition: Plugin.inc.php:68
Plugin\addLocaleData
addLocaleData($locale=null)
Definition: Plugin.inc.php:454
SwordImportExportPlugin\getDisplayName
getDisplayName()
Definition: SwordImportExportPlugin.inc.php:70
SwordImportExportPlugin
Sword deposit plugin.
Definition: SwordImportExportPlugin.inc.php:16