function importIssue(&$journal, &$issueNode, &$issue, &$errors, &$user, $isCommandLine, &$dependentItems, $cleanupErrors = true) { $errors = array(); $issue = null; $hasErrors = false; $issueDao =& DAORegistry::getDAO('IssueDAO'); $issue = new Issue(); $issue->setJournalId($journal->getId()); $journalSupportedLocales = array_keys($journal->getSupportedLocaleNames()); // => journal locales must be set up before $journalPrimaryLocale = $journal->getPrimaryLocale(); /* --- Set title, description, volume, number, and year --- */ $titleExists = false; for ($index = 0; $node = $issueNode->getChildByName('title', $index); $index++) { $locale = $node->getAttribute('locale'); if ($locale == '') { $locale = $journalPrimaryLocale; } elseif (!in_array($locale, $journalSupportedLocales)) { $errors[] = array('plugins.importexport.native.import.error.issueTitleLocaleUnsupported', array('issueTitle' => $node->getValue(), 'locale' => $locale)); $hasErrors = true; continue; } $issue->setTitle($node->getValue(), $locale); $titleExists = true; } for ($index = 0; $node = $issueNode->getChildByName('description', $index); $index++) { $locale = $node->getAttribute('locale'); if ($locale == '') { $locale = $journalPrimaryLocale; } elseif (!in_array($locale, $journalSupportedLocales)) { $errors[] = array('plugins.importexport.native.import.error.issueDescriptionLocaleUnsupported', array('issueTitle' => $issue->getLocalizedTitle(), 'locale' => $locale)); $hasErrors = true; continue; } $issue->setDescription($node->getValue(), $locale); } if ($node = $issueNode->getChildByName('volume')) { $issue->setVolume($node->getValue()); } if ($node = $issueNode->getChildByName('number')) { $issue->setNumber($node->getValue()); } if ($node = $issueNode->getChildByName('year')) { $issue->setYear($node->getValue()); } /* --- Set date published --- */ if ($node = $issueNode->getChildByName('date_published')) { $publishedDate = strtotime($node->getValue()); if ($publishedDate === -1) { $errors[] = array('plugins.importexport.native.import.error.invalidDate', array('value' => $node->getValue())); if ($cleanupErrors) { NativeImportDom::cleanupFailure($dependentItems); } return false; } else { $issue->setDatePublished($publishedDate); } } /* --- Set attributes: Identification type, published, current, public ID --- */ switch ($value = $issueNode->getAttribute('identification')) { case 'num_vol_year': $issue->setShowVolume(1); $issue->setShowNumber(1); $issue->setShowYear(1); $issue->setShowTitle(0); break; case 'vol_year': $issue->setShowVolume(1); $issue->setShowNumber(0); $issue->setShowYear(1); $issue->setShowTitle(0); break; case 'vol': $issue->setShowVolume(1); $issue->setShowNumber(0); $issue->setShowYear(0); $issue->setShowTitle(0); break; case 'year': $issue->setShowVolume(0); $issue->setShowNumber(0); $issue->setShowYear(1); $issue->setShowTitle(0); break; case 'title': case '': case null: $issue->setShowVolume(0); $issue->setShowNumber(0); $issue->setShowYear(0); $issue->setShowTitle(1); break; default: $errors[] = array('plugins.importexport.native.import.error.unknownIdentificationType', array('identificationType' => $value, 'issueTitle' => $issue->getLocalizedTitle())); $hasErrors = true; break; } if (($issueNode->getAttribute('identification') == 'title' || $issueNode->getAttribute('identification') == '') && !$titleExists) { $errors[] = array('plugins.importexport.native.import.error.titleMissing', array()); // Set a placeholder title so that further errors are // somewhat meaningful; this placeholder will not be // inserted into the database. $issue->setTitle(__('plugins.importexport.native.import.error.defaultTitle'), $journalPrimaryLocale); $hasErrors = true; } switch ($value = $issueNode->getAttribute('published')) { case 'true': $issue->setPublished(1); break; case 'false': case '': case null: $issue->setPublished(0); break; default: $errors[] = array('plugins.importexport.native.import.error.invalidBooleanValue', array('value' => $value)); $hasErrors = true; break; } switch ($value = $issueNode->getAttribute('current')) { case 'true': $issue->setCurrent(1); break; case 'false': case '': case null: $issue->setCurrent(0); break; default: $errors[] = array('plugins.importexport.native.import.error.invalidBooleanValue', array('value' => $value)); $hasErrors = true; break; } if (($value = $issueNode->getAttribute('public_id')) != '') { $anotherIssue = $issueDao->getIssueByPublicIssueId($value, $journal->getId()); if ($anotherIssue) { $errors[] = array('plugins.importexport.native.import.error.duplicatePublicId', array('issueTitle' => $issue->getIssueIdentification(), 'otherIssueTitle' => $anotherIssue->getIssueIdentification())); $hasErrors = true; } else { $issue->setPublicIssueId($value); } } /* --- Access Status --- */ $node = $issueNode->getChildByName('open_access'); $issue->setAccessStatus($node ? ISSUE_ACCESS_OPEN : ISSUE_ACCESS_SUBSCRIPTION); if ($node = $issueNode->getChildByName('access_date')) { $accessDate = strtotime($node->getValue()); if ($accessDate === -1) { $errors[] = array('plugins.importexport.native.import.error.invalidDate', array('value' => $node->getValue())); $hasErrors = true; } else { $issue->setOpenAccessDate($accessDate); } } /* --- All processing that does not require an inserted issue ID --- has been performed by this point. If there were no errors --- then insert the issue and carry on. If there were errors, --- then abort without performing the insertion. */ if ($hasErrors) { $issue = null; if ($cleanupErrors) { NativeImportDom::cleanupFailure($dependentItems); } return false; } else { if ($issue->getCurrent()) { $issueDao->updateCurrentIssue($journal->getId()); } $issue->setIssueId($issueDao->insertIssue($issue)); $dependentItems[] = array('issue', $issue); } /* --- Handle cover --- */ for ($index = 0; $node = $issueNode->getChildByName('cover', $index); $index++) { if (!NativeImportDom::handleCoverNode($journal, $node, $issue, $coverErrors, $isCommandLine)) { $errors = array_merge($errors, $coverErrors); $hasErrors = true; } } /* --- Handle sections --- */ for ($index = 0; $node = $issueNode->getChildByName('section', $index); $index++) { if (!NativeImportDom::handleSectionNode($journal, $node, $issue, $sectionErrors, $user, $isCommandLine, $dependentItems, $index)) { $errors = array_merge($errors, $sectionErrors); $hasErrors = true; } } /* --- See if any errors occurred since last time we checked. --- If so, delete the created issue and return failure. --- Otherwise, the whole process was successful. */ if ($hasErrors) { $issue = null; // Don't pass back a reference to a dead issue if ($cleanupErrors) { NativeImportDom::cleanupFailure($dependentItems); } return false; } $issueDao->updateIssue($issue); return true; }