/**
* Imports the journal with given ID
* @param int $id Journal's ID
* @return array New IDs as keys, old IDs as values
* @throws Exception
* @throws \Doctrine\DBAL\DBALException
*/
public function importJournal($id)
{
$this->consoleOutput->writeln("Importing the journal...");
$journalSql = "SELECT path, primary_locale FROM journals WHERE journal_id = :id LIMIT 1";
$journalStatement = $this->dbalConnection->prepare($journalSql);
$journalStatement->bindValue('id', $id);
$journalStatement->execute();
$settingsSql = "SELECT locale, setting_name, setting_value FROM journal_settings WHERE journal_id = :id";
$settingsStatement = $this->dbalConnection->prepare($settingsSql);
$settingsStatement->bindValue('id', $id);
$settingsStatement->execute();
$pkpJournal = $journalStatement->fetch();
$pkpSettings = $settingsStatement->fetchAll();
$primaryLocale = $pkpJournal['primary_locale'];
$languageCode = mb_substr($primaryLocale, 0, 2, 'UTF-8');
!$pkpJournal && die('Journal not found.' . PHP_EOL);
$this->consoleOutput->writeln("Reading journal settings...");
foreach ($pkpSettings as $setting) {
$locale = !empty($setting['locale']) ? mb_substr($setting['locale'], 0, 2, 'UTF-8') : $languageCode;
$name = $setting['setting_name'];
$value = $setting['setting_value'];
$this->settings[$locale][$name] = $value;
}
$this->journal = new Journal();
$this->journal->setStatus(1);
$this->journal->setSlug($pkpJournal['path']);
// Fill translatable fields in all available languages except the primary one
foreach ($this->settings as $fieldLocale => $fields) {
if ($fieldLocale === $languageCode) {
// We will fill fields of the primary language later.
continue;
}
$this->journal->setCurrentLocale(mb_substr($fieldLocale, 0, 2, 'UTF-8'));
!empty($fields['title']) ? $this->journal->setTitle($fields['title']) : $this->journal->setTitle('Unknown Journal');
!empty($fields['description']) ? $this->journal->setDescription($fields['description']) : $this->journal->setDescription('-');
}
$this->journal->setCurrentLocale($languageCode);
// Fill fields for the primary language
!empty($this->settings[$languageCode]['title']) ? $this->journal->setTitle($this->settings[$languageCode]['title']) : $this->journal->setTitle('Unknown Journal');
!empty($this->settings[$languageCode]['description']) ? $this->journal->setDescription($this->settings[$languageCode]['description']) : $this->journal->setDescription('-');
!empty($this->settings[$languageCode]['journalPageFooter']) ? $this->journal->setFooterText($this->settings[$languageCode]['journalPageFooter']) : $this->journal->setFooterText(null);
!empty($this->settings[$languageCode]['printIssn']) && count($this->settings[$languageCode]['printIssn']) == 9 ? $this->journal->setIssn($this->settings[$languageCode]['printIssn']) : $this->journal->setIssn('');
!empty($this->settings[$languageCode]['onlineIssn']) && count($this->settings[$languageCode]['onlineIssn']) == 9 ? $this->journal->setEissn($this->settings[$languageCode]['onlineIssn']) : $this->journal->setEissn('');
$date = sprintf('%d-01-01 00:00:00', !empty($this->settings[$languageCode]['initialYear']) ? $this->settings[$languageCode]['initialYear'] : '2015');
$this->journal->setFounded(DateTime::createFromFormat('Y-m-d H:i:s', $date));
// Set view and download counts
!empty($this->settings[$languageCode]['total_views']) ? $this->journal->setViewCount($this->settings[$languageCode]['total_views']) : $this->journal->setViewCount(0);
!empty($this->settings[$languageCode]['total_downloads']) ? $this->journal->setDownloadCount($this->settings[$languageCode]['total_downloads']) : $this->journal->setDownloadCount(0);
!empty($this->settings[$languageCode]['homeHeaderTitleImage']) ? $header = unserialize($this->settings[$languageCode]['homeHeaderTitleImage']) : ($header = null);
if ($header) {
$baseDir = '/../web/uploads/journal/imported/';
$croppedBaseDir = '/../web/uploads/journal/croped/imported/';
$headerPath = $id . '/' . $header['uploadName'];
$pendingDownload = new PendingDownload();
$pendingDownload->setSource('public/journals/' . $headerPath)->setTarget($baseDir . $headerPath)->setTag('journal-header');
$croppedPendingDownload = new PendingDownload();
$croppedPendingDownload->setSource('public/journals/' . $headerPath)->setTarget($croppedBaseDir . $headerPath)->setTag('journal-header');
$history = $this->em->getRepository(FileHistory::class)->findOneBy(['fileName' => 'imported/' . $headerPath]);
if (!$history) {
$history = new FileHistory();
$history->setFileName('imported/' . $headerPath);
$history->setOriginalName('imported/' . $headerPath);
$history->setType('journal');
}
$this->em->persist($croppedPendingDownload);
$this->em->persist($pendingDownload);
$this->em->persist($history);
$this->journal->setHeader('imported/' . $headerPath);
}
$subjects = $this->importSubjects($languageCode);
foreach ($subjects as $subject) {
$this->journal->addSubject($subject);
}
// Set publisher
!empty($this->settings[$languageCode]['publisherInstitution']) ? $this->importAndSetPublisher($this->settings[$languageCode]['publisherInstitution'], $languageCode) : $this->journal->setPublisher($this->getUnknownPublisher($languageCode));
// Use existing languages or create if needed
$language = $this->em->getRepository('OjsJournalBundle:Lang')->findOneBy(['code' => $languageCode]);
$this->journal->setMandatoryLang($language ? $language : $this->createLanguage($languageCode));
$this->journal->addLanguage($language ? $language : $this->createLanguage($languageCode));
$this->importContacts($languageCode);
$this->importSubmissionChecklist($languageCode);
$this->consoleOutput->writeln("Read journal's settings.");
$this->em->beginTransaction();
// Outer transaction
try {
$this->em->beginTransaction();
// Inner transaction
$this->em->persist($this->journal);
$this->em->flush();
$this->em->commit();
} catch (Exception $exception) {
$this->em->rollback();
throw $exception;
}
$this->consoleOutput->writeln("Imported journal #" . $id);
// Those below also create their own inner transactions
$createdSections = $this->sectionImporter->importJournalSections($id, $this->journal->getId());
$createdIssues = $this->issueImporter->importJournalIssues($id, $this->journal->getId(), $createdSections);
$this->articleImporter->importJournalArticles($id, $this->journal->getId(), $createdIssues, $createdSections);
$this->journalPageImporter->importPages($id, $this->journal->getId());
$createdBoards = $this->boardImporter->importBoards($id, $this->journal->getId());
foreach ($createdBoards as $oldBoardId => $newBoardId) {
$this->boardMemberImporter->importBoardMembers($oldBoardId, $newBoardId);
}
$this->importAboutPage();
$map = new ImportMap($id, $this->journal->getId(), Journal::class);
$this->em->persist($map);
$this->em->flush();
$this->em->commit();
return ['new' => $this->journal->getId(), 'old' => $id];
}