/**
* @param int $id Issue's ID
* @param int $newJournalId new Journal's ID
* @param array $sectionIds Journal's section IDs
* @return Issue Created issue
* @throws \Doctrine\DBAL\DBALException
* @throws \Doctrine\ORM\ORMException
*/
public function importIssue($id, $newJournalId, $sectionIds)
{
/** @var Journal $journal */
$journal = $this->em->getReference('OjsJournalBundle:Journal', $newJournalId);
$this->consoleOutput->writeln("Reading issue #" . $id . "... ", true);
$issueSql = "SELECT * FROM issues WHERE issue_id = :id LIMIT 1";
$issueStatement = $this->dbalConnection->prepare($issueSql);
$issueStatement->bindValue('id', $id);
$issueStatement->execute();
$settingsSql = "SELECT locale, setting_name, setting_value FROM issue_settings WHERE issue_id = :id";
$settingsStatement = $this->dbalConnection->prepare($settingsSql);
$settingsStatement->bindValue('id', $id);
$settingsStatement->execute();
$pkpIssue = $issueStatement->fetch();
$pkpSettings = $settingsStatement->fetchAll();
$settings = [];
foreach ($pkpSettings as $setting) {
$locale = !empty($setting['locale']) ? $setting['locale'] : 'en_US';
$name = $setting['setting_name'];
$value = $setting['setting_value'];
$settings[$locale][$name] = $value;
}
$issue = new Issue();
$issue->setJournal($journal);
$issue->setVolume(is_numeric($pkpIssue['volume']) ? $pkpIssue['volume'] : '');
$issue->setNumber($pkpIssue['number']);
$issue->setYear(DateTime::createFromFormat('Y-m-d H:i:s', $pkpIssue['year'] . '-01-01 00:00:00'));
$issue->setPublished($pkpIssue['published']);
$issue->setSpecial(false);
foreach (array_values($sectionIds) as $sectionId) {
if ($sectionId !== null) {
/** @var Section $section */
$section = $this->em->getReference('OjsJournalBundle:Section', $sectionId);
$issue->addSection($section);
}
}
// In some instances, imported data is not in a proper date format so DateTime::createFromFormat returns false
// This part handles cases where data_published column is empty or when the data is in a bad format
$date = false;
if (!empty($pkpIssue['date_published'])) {
// This might assign 'false' to the variable
$date = DateTime::createFromFormat('Y-m-d H:i:s', $pkpIssue['date_published']);
}
// Current date & time is used when date is false
$issue->setDatePublished($date ? $date : new DateTime());
$cover = null;
foreach ($settings as $fieldLocale => $fields) {
if (!$cover && !empty($fields['fileName'])) {
$cover = $fields['fileName'];
}
$issue->setCurrentLocale(mb_substr($fieldLocale, 0, 2, 'UTF-8'));
$issue->setTitle(!empty($fields['title']) ? $fields['title'] : '-');
$issue->setDescription(!empty($fields['description']) ? $fields['description'] : '-');
}
if ($cover) {
$baseDir = '/../web/uploads/journal/imported/';
$croppedBaseDir = '/../web/uploads/journal/croped/imported/';
$coverPath = $pkpIssue['journal_id'] . '/' . $cover;
$pendingDownload = new PendingDownload();
$pendingDownload->setSource('public/journals/' . $coverPath)->setTarget($baseDir . $coverPath)->setTag('issue-cover');
$croppedPendingDownload = new PendingDownload();
$croppedPendingDownload->setSource('public/journals/' . $coverPath)->setTarget($croppedBaseDir . $coverPath)->setTag('issue-cover');
$history = $this->em->getRepository(FileHistory::class)->findOneBy(['fileName' => 'imported/' . $coverPath]);
if (!$history) {
$history = new FileHistory();
$history->setFileName('imported/' . $coverPath);
$history->setOriginalName('imported/' . $coverPath);
$history->setType('journal');
$this->em->persist($history);
}
$this->em->persist($croppedPendingDownload);
$this->em->persist($pendingDownload);
$issue->setCover('imported/' . $coverPath);
}
$importer = new IssueFileImporter($this->dbalConnection, $this->em, $this->logger, $this->consoleOutput);
$importer->importIssueFiles($issue, $id, $journal->getSlug());
$this->em->persist($issue);
return $issue;
}