/** * creates and returns an issue object from a row * @param $row array * @return Issue object */ function &_returnIssueFromRow($row) { $issue = new Issue(); $issue->setId($row['issue_id']); $issue->setJournalId($row['journal_id']); $issue->setVolume($row['volume']); $issue->setNumber($row['number']); $issue->setYear($row['year']); $issue->setPublished($row['published']); $issue->setCurrent($row['current']); $issue->setDatePublished($this->datetimeFromDB($row['date_published'])); $issue->setDateNotified($this->datetimeFromDB($row['date_notified'])); $issue->setAccessStatus($row['access_status']); $issue->setOpenAccessDate($this->datetimeFromDB($row['open_access_date'])); $issue->setPublicIssueId($row['public_issue_id']); $issue->setShowVolume($row['show_volume']); $issue->setShowNumber($row['show_number']); $issue->setShowYear($row['show_year']); $issue->setShowTitle($row['show_title']); $issue->setStyleFileName($row['style_file_name']); $issue->setOriginalStyleFileName($row['original_style_file_name']); $this->getDataObjectSettings('issue_settings', 'issue_id', $row['issue_id'], $issue); HookRegistry::call('IssueDAO::_returnIssueFromRow', array(&$issue, &$row)); return $issue; }
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; }
function importIssues() { assert($this->xml->name == 'issues'); $issueDAO =& DAORegistry::getDAO('IssueDAO'); $issueFileDAO =& DAORegistry::getDAO('IssueFileDAO'); $issueGalleyDAO =& DAORegistry::getDAO('IssueGalleyDAO'); $sectionDAO =& DAORegistry::getDAO('SectionDAO'); $issues = $issueDAO->getIssues($this->journal->getId()); $publicFileManager =& new PublicFileManager(); $this->nextElement(); while ($this->xml->name == 'issue') { $issueXML = $this->getCurrentElementAsDom(); $issue = new Issue(); $issue->setJournalId($this->journal->getId()); $issue->setVolume((int) $issueXML->volume); $issue->setNumber((string) $issueXML->number); $issue->setYear((int) $issueXML->year); $issue->setPublished((int) $issueXML->published); $issue->setCurrent((int) $issueXML->current); $issue->setDatePublished((string) $issueXML->datePublished); $issue->setDateNotified((string) $issueXML->dateNotified); $issue->setLastModified((string) $issueXML->lastModified); $issue->setAccessStatus((int) $issueXML->accessStatus); $issue->setOpenAccessDate((string) $issueXML->openAccessDate); $issue->setShowVolume((int) $issueXML->showVolume); $issue->setShowNumber((int) $issueXML->showNumber); $issue->setShowYear((int) $issueXML->showYear); $issue->setShowTitle((int) $issueXML->showTitle); $issue->setStyleFileName((string) $issueXML->styleFileName); $issue->setOriginalStyleFileName((string) $issueXML->originalStyleFileName); $oldIssueId = (int) $issueXML->oldId; $issueDAO->insertIssue($issue); //$issueDAO->insertCustomIssueOrder($this->journal->getId(), $issue->getId(), (int)$issueXML->customOrder); $this->idTranslationTable->register(INTERNAL_TRANSFER_OBJECT_ISSUE, $oldIssueId, $issue->getId()); $this->restoreDataObjectSettings($issueDAO, $issueXML->settings, 'issue_settings', 'issue_id', $issue->getId()); $issue =& $issueDAO->getIssueById($issue->getId()); // Reload issue to get restored settings $covers = $issue->getFileName(null); if ($covers) { foreach ($covers as $locale => $oldCoverFileName) { $sourceFile = $this->publicFolderPath . '/' . $oldCoverFileName; $extension = $publicFileManager->getExtension($oldCoverFileName); $destFile = 'cover_issue_' . $issue->getId() . "_{$locale}.{$extension}"; $publicFileManager->copyJournalFile($this->journal->getId(), $sourceFile, $destFile); unlink($sourceFile); $issue->setFileName($destFile, $locale); $issueDAO->updateIssue($issue); } } if ($issue->getStyleFileName()) { $oldStyleFileName = $issue->getStyleFileName(); $sourceFile = $this->publicFolderPath . '/' . $oldStyleFileName; $destFile = 'style_' . $issue->getId() . '.css'; $publicFileManager->copyJournalFile($this->journal->getId(), $sourceFile, $destFile); unlink($sourceFile); $issue->setStyleFileName($destFile); $issueDAO->updateIssue($issue); } $issueFileManager = new IssueFileManager($issue->getId()); foreach ($issueXML->issueFile as $issueFileXML) { $issueFile = new IssueFile(); $issueFile->setIssueId($issue->getId()); $issueFile->setFileName((string) $issueFileXML->fileName); $issueFile->setFileType((string) $issueFileXML->fileType); $issueFile->setFileSize((int) $issueFileXML->fileSize); $issueFile->setContentType((string) $issueFileXML->contentType); $issueFile->setOriginalFileName((string) $issueFileXML->originalFileName); $issueFile->setDateUploaded((string) $issueFileXML->dateUploaded); $issueFile->setDateModified((string) $issueFileXML->dateModified); $issueFileDAO->insertIssueFile($issueFile); $oldFileName = $issueFile->getFileName(); $extension = $issueFileManager->parseFileExtension($oldFileName); $contentPath = $issueFileManager->contentTypeToPath($issueFile->getContentType()); $contentAbbrev = $issueFileManager->contentTypeToAbbrev($issueFile->getContentType()); $fileInTransferPackage = $this->journalFolderPath . "/issues/{$oldIssueId}/{$contentPath}/{$oldFileName}"; $newFileName = $issue->getId() . '-' . $issueFile->getId() . '-' . $contentAbbrev . '.' . $extension; $newFilePath = "{$contentPath}/{$newFileName}"; $issueFileManager->copyFile($fileInTransferPackage, $issueFileManager->getFilesDir() . $newFilePath); unlink($fileInTransferPackage); $issueFile->setFileName($newFileName); $issueFileDAO->updateIssueFile($issueFile); $this->idTranslationTable->register(INTERNAL_TRANSFER_OBJECT_ISSUE_FILE, (int) $issueFileXML->oldId, $issueFile->getId()); } foreach ($issueXML->issueGalley as $issueGalleyXML) { $issueGalley = new issueGalley(); $issueGalley->setIssueId($issue->getId()); $issueGalley->setLocale((string) $issueGalleyXML->locale); $issueGalley->setFileId($this->idTranslationTable->resolve(INTERNAL_TRANSFER_OBJECT_ISSUE_FILE, (int) $issueGalleyXML->fileId)); $issueGalley->setLabel((string) $issueGalleyXML->label); $issueGalley->setSequence((int) $issueGalleyXML->sequence); $issueGalleyDAO->insertGalley($issueGalley); $this->idTranslationTable->register(INTERNAL_TRANSFER_OBJECT_ISSUE_GALLEY, (int) $issueGalleyXML->oldId, $issueGalley->getId()); $this->restoreDataObjectSettings($issueGalleyDAO, $issueGalleyXML->settings, 'issue_galley_settings', 'galley_id', $issueGalley->getId()); } if (isset($issueXML->customSectionOrder)) { foreach ($issueXML->customSectionOrder->sectionOrder as $sectionOrderXML) { try { $sectionId = $this->idTranslationTable->resolve(INTERNAL_TRANSFER_OBJECT_SECTION, (int) $sectionOrderXML['sectionId']); $seq = (int) $sectionOrderXML['seq']; $sectionDAO->insertCustomSectionOrder($issue->getId(), $sectionId, $seq); } catch (Exception $e) { } } } $this->nextElement(); } }