Open Journal Systems  3.3.0
ArticlePubMedXmlFilter.inc.php
1 <?php
2 
16 import('lib.pkp.classes.filter.PersistableFilter');
17 
23  function __construct($filterGroup) {
24  parent::__construct($filterGroup);
25  }
26 
27 
28  //
29  // Implement template methods from PersistableFilter
30  //
34  function getClassName() {
35  return 'plugins.importexport.pubmed.filter.ArticlePubMedXmlFilter';
36  }
37 
38 
39  //
40  // Implement abstract methods from SubmissionPubMedXmlFilter
41  //
47  return 'article-galley=>pubmed-xml';
48  }
49 
50  //
51  // Implement template methods from Filter
52  //
58  function &process(&$submissions) {
59  // Create the XML document
60  $implementation = new DOMImplementation();
61  $dtd = $implementation->createDocumentType('ArticleSet', '-//NLM//DTD PubMed 2.0//EN', 'http://www.ncbi.nlm.nih.gov/entrez/query/static/PubMed.dtd');
62  $doc = $implementation->createDocument('', '', $dtd);
63  $doc->preserveWhiteSpace = false;
64  $doc->formatOutput = true;
65 
66  $issueDao = DAORegistry::getDAO('IssueDAO'); /* @var $issueDao IssueDAO */
67  $journalDao = DAORegistry::getDAO('JournalDAO'); /* @var $journalDao JournalDAO */
68  $journal = null;
69 
70  $rootNode = $doc->createElement('ArticleSet');
71  foreach ($submissions as $submission) {
72  // Fetch associated objects
73  if (!$journal || $journal->getId() != $submission->getContextId()) {
74  $journal = $journalDao->getById($submission->getContextId());
75  }
76  $issue = $issueDao->getBySubmissionId($submission->getId(), $journal->getId());
77 
78  $articleNode = $doc->createElement('Article');
79  $articleNode->appendChild($this->createJournalNode($doc, $journal, $issue, $submission));
80 
81  $publication = $submission->getCurrentPublication();
82 
83  $locale = $publication->getData('locale');
84  if ($locale == 'en_US') {
85  $articleNode->appendChild($doc->createElement('ArticleTitle'))->appendChild($doc->createTextNode($publication->getLocalizedTitle($locale)));
86  } else {
87  $articleNode->appendChild($doc->createElement('VernacularTitle'))->appendChild($doc->createTextNode($publication->getLocalizedTitle($locale)));
88  }
89 
90  $startPage = $publication->getStartingPage();
91  $endPage = $publication->getEndingPage();
92  if (isset($startPage) && $startPage !== '') {
93  // We have a page range or e-location id
94  $articleNode->appendChild($doc->createElement('FirstPage'))->appendChild($doc->createTextNode($startPage));
95  $articleNode->appendChild($doc->createElement('LastPage'))->appendChild($doc->createTextNode($endPage));
96  }
97 
98  if ($doi = $publication->getStoredPubId('doi')) {
99  $doiNode = $doc->createElement('ELocationID');
100  $doiNode->appendChild($doc->createTextNode($doi));
101  $doiNode->setAttribute('EIdType', 'doi');
102  $articleNode->appendChild($doiNode);
103  }
104 
105  $articleNode->appendChild($doc->createElement('Language'))->appendChild($doc->createTextNode(AppLocale::get3LetterFrom2LetterIsoLanguage(substr($locale, 0, 2))));
106 
107  $authorListNode = $doc->createElement('AuthorList');
108  foreach ((array) $publication->getData('authors') as $author) {
109  $authorListNode->appendChild($this->generateAuthorNode($doc, $journal, $issue, $submission, $author));
110  }
111  $articleNode->appendChild($authorListNode);
112 
113  if ($publication->getStoredPubId('publisher-id')) {
114  $articleIdListNode = $doc->createElement('ArticleIdList');
115  $articleIdNode = $doc->createElement('ArticleId');
116  $articleIdNode->appendChild($doc->createTextNode($publication->getStoredPubId('publisher-id')));
117  $articleIdNode->setAttribute('IdType', 'pii');
118  $articleIdListNode->appendChild($articleIdNode);
119  $articleNode->appendChild($articleIdListNode);
120  }
121 
122  // History
123  $historyNode = $doc->createElement('History');
124  $historyNode->appendChild($this->generatePubDateDom($doc, $submission->getDateSubmitted(), 'received'));
125 
126  $editDecisionDao = DAORegistry::getDAO('EditDecisionDAO'); /* @var $editDecisionDao EditDecisionDAO */
127  $editDecisions = (array) $editDecisionDao->getEditorDecisions($submission->getId());
128  do {
129  $editorDecision = array_pop($editDecisions);
130  } while ($editorDecision && $editorDecision['decision'] != SUBMISSION_EDITOR_DECISION_ACCEPT);
131 
132  if ($editorDecision) {
133  $historyNode->appendChild($this->generatePubDateDom($doc, $editorDecision['dateDecided'], 'accepted'));
134  }
135  $articleNode->appendChild($historyNode);
136 
137  // FIXME: Revision dates
138 
139  if ($abstract = PKPString::html2text($publication->getLocalizedData('abstract', $locale))) {
140  $articleNode->appendChild($doc->createElement('Abstract'))->appendChild($doc->createTextNode($abstract));
141  }
142 
143  $rootNode->appendChild($articleNode);
144  }
145  $doc->appendChild($rootNode);
146  return $doc;
147  }
148 
156  function createJournalNode($doc, $journal, $issue, $submission) {
157  $journalNode = $doc->createElement('Journal');
158 
159  $publisherNameNode = $doc->createElement('PublisherName');
160  $publisherNameNode->appendChild($doc->createTextNode($journal->getData('publisherInstitution')));
161  $journalNode->appendChild($publisherNameNode);
162 
163  $journalTitleNode = $doc->createElement('JournalTitle');
164  $journalTitleNode->appendChild($doc->createTextNode($journal->getName($journal->getPrimaryLocale())));
165  $journalNode->appendChild($journalTitleNode);
166 
167  // check various ISSN fields to create the ISSN tag
168  if ($journal->getData('printIssn') != '') $issn = $journal->getData('printIssn');
169  elseif ($journal->getData('issn') != '') $issn = $journal->getData('issn');
170  elseif ($journal->getData('onlineIssn') != '') $issn = $journal->getData('onlineIssn');
171  else $issn = '';
172  if ($issn != '') $journalNode->appendChild($doc->createElement('Issn', $issn));
173 
174  if ($issue && $issue->getShowVolume()) $journalNode->appendChild($doc->createElement('Volume'))->appendChild($doc->createTextNode($issue->getVolume()));
175  if ($issue && $issue->getShowNumber()) $journalNode->appendChild($doc->createElement('Issue'))->appendChild($doc->createTextNode($issue->getNumber()));
176 
177  $datePublished = null;
178  if ($submission) $datePublished = $submission->getCurrentPublication()->getData('datePublished');
179  if (!$datePublished && $issue) $datePublished = $issue->getDatePublished();
180  if ($datePublished) {
181  $journalNode->appendChild($this->generatePubDateDom($doc, $datePublished, 'epublish'));
182  }
183 
184  return $journalNode;
185  }
186 
196  function generateAuthorNode($doc, $journal, $issue, $submission, $author) {
197  $authorElement = $doc->createElement('Author');
198 
199  if (empty($author->getLocalizedFamilyName())) {
200  $authorElement->appendChild($node = $doc->createElement('FirstName'));
201  $node->setAttribute('EmptyYN', 'Y');
202  $authorElement->appendChild($doc->createElement('LastName'))->appendChild($doc->createTextNode(ucfirst($author->getLocalizedGivenName())));
203  } else {
204  $authorElement->appendChild($doc->createElement('FirstName'))->appendChild($doc->createTextNode(ucfirst($author->getLocalizedGivenName())));
205  $authorElement->appendChild($doc->createElement('LastName'))->appendChild($doc->createTextNode(ucfirst($author->getLocalizedFamilyName())));
206  }
207  $authorElement->appendChild($doc->createElement('Affiliation'))->appendChild($doc->createTextNode($author->getLocalizedAffiliation() . '. ' . $author->getEmail()));
208 
209  return $authorElement;
210  }
211 
219  function generatePubDateDom($doc, $pubDate, $pubStatus) {
220  $pubDateNode = $doc->createElement('PubDate');
221  $pubDateNode->setAttribute('PubStatus', $pubStatus);
222 
223  $pubDateNode->appendChild($doc->createElement('Year', date('Y', strtotime($pubDate))));
224  $pubDateNode->appendChild($doc->createElement('Month', date('m', strtotime($pubDate))));
225  $pubDateNode->appendChild($doc->createElement('Day', date('d', strtotime($pubDate))));
226 
227  return $pubDateNode;
228  }
229 }
230 
231 
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
ArticlePubMedXmlFilter\createJournalNode
createJournalNode($doc, $journal, $issue, $submission)
Definition: ArticlePubMedXmlFilter.inc.php:156
ArticlePubMedXmlFilter\generateAuthorNode
generateAuthorNode($doc, $journal, $issue, $submission, $author)
Definition: ArticlePubMedXmlFilter.inc.php:196
ArticlePubMedXmlFilter\__construct
__construct($filterGroup)
Definition: ArticlePubMedXmlFilter.inc.php:23
PKPLocale\get3LetterFrom2LetterIsoLanguage
static get3LetterFrom2LetterIsoLanguage($iso2Letter)
Definition: PKPLocale.inc.php:614
PKPString\html2text
static html2text($html)
Definition: PKPString.inc.php:395
ArticlePubMedXmlFilter\getClassName
getClassName()
Definition: ArticlePubMedXmlFilter.inc.php:34
ArticlePubMedXmlFilter
Class that converts a Article to a PubMed XML document.
Definition: ArticlePubMedXmlFilter.inc.php:18
ArticlePubMedXmlFilter\getRepresentationExportFilterGroupName
getRepresentationExportFilterGroupName()
Definition: ArticlePubMedXmlFilter.inc.php:46
ArticlePubMedXmlFilter\generatePubDateDom
generatePubDateDom($doc, $pubDate, $pubStatus)
Definition: ArticlePubMedXmlFilter.inc.php:219
ArticlePubMedXmlFilter\process
& process(&$submissions)
Definition: ArticlePubMedXmlFilter.inc.php:58
PersistableFilter
A filter that can be persisted to the database.
Definition: PersistableFilter.inc.php:44