16 import(
'classes.plugins.DOIPubIdExportPlugin');
20 define(
'CROSSREF_STATUS_FAILED',
'failed');
22 define(
'CROSSREF_API_DEPOSIT_OK', 200);
24 define(
'CROSSREF_API_URL',
'https://api.crossref.org/v2/deposits');
26 define(
'CROSSREF_API_URL_DEV',
'https://test.crossref.org/v2/deposits');
28 define(
'CROSSREF_API_STAUTS_URL',
'https://api.crossref.org/servlet/submissionDownload');
30 define(
'CROSSREF_API_STAUTS_URL_DEV',
'https://test.crossref.org/servlet/submissionDownload');
33 define(
'CROSSREF_DEPOSIT_STATUS',
'depositStatus');
42 return 'CrossRefExportPlugin';
49 return __(
'plugins.importexport.crossref.displayName');
56 return __(
'plugins.importexport.crossref.description');
63 return 'article=>crossref-xml';
70 return array_merge(parent::getStatusNames(), array(
71 EXPORT_STATUS_REGISTERED => __(
'plugins.importexport.crossref.status.registered'),
72 CROSSREF_STATUS_FAILED => __(
'plugins.importexport.crossref.status.failed'),
73 EXPORT_STATUS_MARKEDREGISTERED => __(
'plugins.importexport.crossref.status.markedRegistered'),
82 $dispatcher =
$request->getDispatcher();
84 CROSSREF_STATUS_FAILED =>
90 'grid.settings.plugins.settingsPluginGridHandler',
91 'manage',
null, array(
'plugin' =>
'CrossRefExportPlugin',
'category' =>
'importexport',
'verb' =>
'statusMessage',
92 'batchId' => $pubObject->getData($this->getDepositBatchIdSettingName()),
'articleId' => $pubObject->getId())
94 __(
'plugins.importexport.crossref.status.failed'),
97 __(
'plugins.importexport.crossref.status.failed')
108 $articleId =
$request->getUserVar(
'articleId');
110 $article = $submissionDao->getByid($articleId);
112 if (!empty($failedMsg)) {
118 import(
'lib.pkp.classes.helpers.PKPCurlHelper');
121 curl_setopt($curlCh, CURLOPT_RETURNTRANSFER,
true);
122 curl_setopt($curlCh, CURLOPT_POST,
true);
123 curl_setopt($curlCh, CURLOPT_HEADER, 0);
126 $endpoint = ($this->
isTestMode($context) ? CROSSREF_API_STAUTS_URL_DEV : CROSSREF_API_STAUTS_URL);
127 curl_setopt($curlCh, CURLOPT_URL, $endpoint);
129 $username = $this->
getSetting($context->getId(),
'username');
130 $password = $this->
getSetting($context->getId(),
'password');
131 $batchId =
$request->getUserVar(
'batchId');
132 $data = array(
'doi_batch_id' => $batchId,
'type' =>
'result',
'usr' => $username,
'pwd' => $password);
133 curl_setopt($curlCh, CURLOPT_POSTFIELDS, $data);
135 $response = curl_exec($curlCh);
137 if ($response ===
false) {
138 $result = __(
'plugins.importexport.common.register.error.mdsError', array(
'param' =>
'No response from server.'));
151 EXPORT_ACTION_DEPOSIT => __(
'plugins.importexport.crossref.action.register'),
152 EXPORT_ACTION_EXPORT => __(
'plugins.importexport.crossref.action.export'),
153 EXPORT_ACTION_MARKREGISTERED => __(
'plugins.importexport.crossref.action.markRegistered'),
162 return array_merge(parent::_getObjectAdditionalSettings(), array(
179 return 'CrossRefSettingsForm';
186 return 'CrossrefExportDeployment';
194 $path = array(
'plugin', $this->
getName());
196 import(
'lib.pkp.classes.file.FileManager');
198 $resultErrors = array();
200 if (
$request->getUserVar(EXPORT_ACTION_DEPOSIT)) {
201 assert($filter !=
null);
207 $errorsOccured =
false;
213 foreach ($objects as $object) {
215 $exportXml = $this->
exportXML(array($object), $filter, $context, $noValidation);
218 $objectsFileNamePart = $objectsFileNamePart .
'-' . $object->getId();
220 $fileManager->writeFile($exportFileName, $exportXml);
222 $result = $this->
depositXML($object, $context, $exportFileName);
224 $errorsOccured =
true;
226 if (is_array($result)) {
227 $resultErrors[] = $result;
230 $fileManager->deleteByPath($exportFileName);
233 if (empty($resultErrors)) {
234 if ($errorsOccured) {
237 'plugins.importexport.crossref.register.error.mdsError',
238 NOTIFICATION_TYPE_ERROR
243 $this->getDepositSuccessNotificationMessageKey(),
244 NOTIFICATION_TYPE_SUCCESS
248 foreach($resultErrors as $errors) {
249 foreach ($errors as $error) {
250 assert(is_array($error) && count($error) >= 1);
254 NOTIFICATION_TYPE_ERROR,
255 (isset($error[1]) ? $error[1] :
null)
261 $request->redirect(
null,
null,
null, $path,
null, $tab);
263 parent::executeExportAction(
$request, $objects, $filter, $tab, $objectsFileNamePart, $noValidation);
277 import(
'lib.pkp.classes.helpers.PKPCurlHelper');
280 curl_setopt($curlCh, CURLOPT_RETURNTRANSFER,
true);
281 curl_setopt($curlCh, CURLOPT_POST,
true);
282 curl_setopt($curlCh, CURLOPT_HEADER, 0);
285 $endpoint = ($this->
isTestMode($context) ? CROSSREF_API_URL_DEV : CROSSREF_API_URL);
286 curl_setopt($curlCh, CURLOPT_URL, $endpoint);
288 $username = $this->
getSetting($context->getId(),
'username');
289 $password = $this->
getSetting($context->getId(),
'password');
290 assert(is_readable($filename));
291 if (function_exists(
'curl_file_create')) {
292 curl_setopt($curlCh, CURLOPT_SAFE_UPLOAD,
true);
293 $cfile =
new CURLFile($filename);
295 $cfile =
"@$filename";
297 $data = array(
'operation' =>
'doMDUpload',
'usr' => $username,
'pwd' => $password,
'mdFile' => $cfile);
298 curl_setopt($curlCh, CURLOPT_POSTFIELDS, $data);
299 $response = curl_exec($curlCh);
302 if ($response ===
false) {
303 $result = array(array(
'plugins.importexport.common.register.error.mdsError',
'No response from server.'));
304 } elseif (curl_getinfo($curlCh, CURLINFO_HTTP_CODE) != CROSSREF_API_DEPOSIT_OK) {
307 $xmlDoc =
new DOMDocument();
308 $xmlDoc->loadXML($response);
310 $batchIdNode = $xmlDoc->getElementsByTagName(
'batch_id')->item(0);
313 $status = CROSSREF_STATUS_FAILED;
317 $xmlDoc =
new DOMDocument();
318 $xmlDoc->loadXML($response);
319 $batchIdNode = $xmlDoc->getElementsByTagName(
'batch_id')->item(0);
323 $failureCountNode = $xmlDoc->getElementsByTagName(
'failure_count')->item(0);
324 $failureCount = (int) $failureCountNode->nodeValue;
325 if ($failureCount > 0) {
326 $status = CROSSREF_STATUS_FAILED;
330 $status = EXPORT_STATUS_REGISTERED;
334 $warningCountNode = $xmlDoc->getElementsByTagName(
'warning_count')->item(0);
335 $warningCount = (int) $warningCountNode->nodeValue;
336 if ($warningCount > 0) {
337 $result = array(array(
'plugins.importexport.crossref.register.success.warning', htmlspecialchars($response)));
340 HookRegistry::call(
'crossrefexportplugin::deposited', array($this, $response, $objects));
362 assert(is_a($object,
'Submission') or is_a($object,
'Issue'));
370 if ($status == EXPORT_STATUS_REGISTERED) {
380 foreach ($objects as $object) {
408 return 'plugins.importexport.common.register.success';
414 function executeCLICommand($scriptName, $command, $context, $outputFile, $objects, $filter, $objectsFileNamePart) {
418 $exportXml = $this->
exportXML($objects, $filter, $context);
419 if ($outputFile) file_put_contents($outputFile, $exportXml);
423 import(
'lib.pkp.classes.file.FileManager');
425 $resultErrors = array();
431 $errorsOccured =
false;
437 foreach ($objects as $object) {
439 $exportXml = $this->
exportXML(array($object), $filter, $context);
442 $objectsFileNamePartId = $objectsFileNamePart .
'-' . $object->getId();
444 $fileManager->writeFile($exportFileName, $exportXml);
446 $result = $this->
depositXML($object, $context, $exportFileName);
448 $errorsOccured =
true;
450 if (is_array($result)) {
451 $resultErrors[] = $result;
454 $fileManager->deleteByPath($exportFileName);
457 if (empty($resultErrors)) {
458 if ($errorsOccured) {
459 echo __(
'plugins.importexport.crossref.register.error.mdsError') .
"\n";
461 echo __(
'plugins.importexport.common.register.success') .
"\n";
464 echo __(
'plugins.importexport.common.cliError') .
"\n";
465 foreach($resultErrors as $errors) {
466 foreach ($errors as $error) {
467 assert(is_array($error) && count($error) >= 1);
468 $errorMessage = __($error[0], array(
'param' => (isset($error[1]) ? $error[1] :
null)));
469 echo
"*** $errorMessage\n";
473 $this->
usage($scriptName);