17 import(
'classes.issue.Issue');
18 import(
'lib.pkp.classes.submission.PKPSubmission');
19 import(
'lib.pkp.classes.plugins.PKPPubIdPluginDAO');
31 if ($cache->getCacheId() ===
'current') {
36 $cache->setCache($id, $issue);
46 if (!isset($this->caches)) $this->caches = array();
47 if (!isset($this->caches[$cacheId])) {
49 $this->caches[$cacheId] = $cacheManager->getObjectCache(
'issues', $cacheId, array($this,
'_cacheMiss'));
51 return $this->caches[$cacheId];
61 function getById($issueId, $journalId =
null, $useCache =
false) {
64 $returner = $cache->get($issueId);
65 if ($returner && $journalId !=
null && $journalId != $returner->getJournalId()) $returner =
null;
69 $params = array((
int) $issueId);
70 if ($journalId) $params[] = (int) $journalId;
72 'SELECT i.* FROM issues i WHERE issue_id = ?'
73 . ($journalId?
' AND journal_id = ?':
''),
78 if ($result->RecordCount() != 0) {
95 function getByPubId($pubIdType, $pubId, $journalId =
null, $useCache =
false) {
96 if ($useCache && $pubIdType ==
'publisher-id') {
98 $returner = $cache->get($pubId);
99 if ($returner && $journalId !=
null && $journalId != $returner->getJournalId()) $returner =
null;
103 $issues = $this->
getBySetting(
'pub-id::'.$pubIdType, $pubId, $journalId);
104 if (empty($issues)) {
107 assert(count($issues) == 1);
119 function getBySetting($settingName, $settingValue, $journalId =
null) {
120 $params = array($settingName);
123 if (is_null($settingValue)) {
124 $sql .=
'LEFT JOIN issue_settings ist ON i.issue_id = ist.issue_id AND ist.setting_name = ?
125 WHERE (ist.setting_value IS NULL OR ist.setting_value = \'\')';
127 $params[] = (string) $settingValue;
128 $sql .=
'INNER JOIN issue_settings ist ON i.issue_id = ist.issue_id
129 WHERE ist.setting_name = ? AND ist.setting_value = ?';
132 $params[] = (int) $journalId;
133 $sql .=
' AND i.journal_id = ?';
135 $sql .=
' ORDER BY i.issue_id';
136 $result = $this->
retrieve($sql, $params);
139 while (!$result->EOF) {
156 $sql =
'SELECT i.* FROM issues i WHERE i.published = 1 AND i.journal_id = ?';
157 $params = array((
int) $journalId);
159 if ($volume !==
null) {
160 $sql .=
' AND i.volume = ?';
161 $params[] = (int) $volume;
163 if ($number !==
null) {
164 $sql .=
' AND i.number = ?';
167 if ($year !==
null) {
168 $sql .=
' AND i.year = ?';
172 $result = $this->
retrieve($sql, $params);
190 foreach ($titles as $title) {
191 $sqlTitleJoin .=
' JOIN issue_settings iss' .$i .
' ON (i.issue_id = iss' .$i .
'.issue_id AND iss' .$i .
'.setting_name = \'title\' AND iss' .$i .
'.setting_value = ?)';
195 $params[] = (int) $journalId;
196 if ($volume !==
null) {
197 $params[] = (int) $volume;
199 if ($number !==
null) {
202 if ($year !==
null) {
203 $params[] = (int) $year;
210 .
' WHERE i.journal_id = ?'
211 .(($volume !==
null)?
' AND i.volume = ?':
'')
212 .(($number !==
null)?
' AND i.number = ?':
'')
213 .(($year !==
null)?
' AND i.year = ?':
''),
227 function getByBestId($issueId, $contextId =
null, $useCache =
false) {
231 if ($contextId) $params[] = (int) $contextId;
234 'SELECT i.* FROM issues i WHERE url_path = ?'
235 . ($contextId?
' AND journal_id = ?':
''),
239 if ($result->RecordCount() != 0) {
241 } elseif (is_int($issueId) || ctype_digit($issueId)) {
242 $issue = $this->
getById($issueId);
246 return $issue ??
null;
258 return $cache->get($journalId);
262 'SELECT i.* FROM issues i WHERE journal_id = ? AND current = 1', (
int) $journalId
266 if ($result->RecordCount() != 0) {
279 'UPDATE issues SET current = 0 WHERE journal_id = ? AND current = 1', (
int) $journalId
302 $issue->setId($row[
'issue_id']);
303 $issue->setJournalId($row[
'journal_id']);
304 $issue->setVolume($row[
'volume']);
305 $issue->setNumber($row[
'number']);
306 $issue->setYear($row[
'year']);
307 $issue->setPublished($row[
'published']);
308 $issue->setCurrent($row[
'current']);
309 $issue->setDatePublished($this->
datetimeFromDB($row[
'date_published']));
310 $issue->setDateNotified($this->
datetimeFromDB($row[
'date_notified']));
311 $issue->setLastModified($this->
datetimeFromDB($row[
'last_modified']));
312 $issue->setAccessStatus($row[
'access_status']);
313 $issue->setOpenAccessDate($this->
datetimeFromDB($row[
'open_access_date']));
314 $issue->setShowVolume($row[
'show_volume']);
315 $issue->setShowNumber($row[
'show_number']);
316 $issue->setShowYear($row[
'show_year']);
317 $issue->setShowTitle($row[
'show_title']);
318 $issue->setData(
'urlPath', $row[
'url_path']);
342 return array(
'title',
'description',
'coverImageAltText',
'coverImage');
351 $additionalFields = parent::getAdditionalFieldNames();
353 $additionalFields[] =
'pub-id::publisher-id';
354 return $additionalFields;
363 'issue_id' => $issue->getId()
374 sprintf(
'INSERT INTO issues
375 (journal_id, volume, number, year, published, current, date_published, date_notified, last_modified, access_status, open_access_date, show_volume, show_number, show_year, show_title, url_path)
377 (?, ?, ?, ?, ?, ?, %s, %s, %s, ?, %s, ?, ?, ?, ?, ?)',
378 $this->
datetimeToDB($issue->getDatePublished()), $this->datetimeToDB($issue->getDateNotified()), $this->datetimeToDB($issue->getLastModified()), $this->datetimeToDB($issue->getOpenAccessDate())),
380 (
int) $issue->getJournalId(),
381 $this->nullOrInt($issue->getVolume()),
383 $this->nullOrInt($issue->getYear()),
384 (
int) $issue->getPublished(),
385 (
int) $issue->getCurrent(),
386 (
int) $issue->getAccessStatus(),
387 (
int) $issue->getShowVolume(),
388 (
int) $issue->getShowNumber(),
389 (
int) $issue->getShowYear(),
390 (
int) $issue->getShowTitle(),
391 $issue->getData(
'urlPath'),
401 return $issue->getId();
421 function issueExists($journalId, $volume, $number, $year, $issueId) {
423 'SELECT i.* FROM issues i WHERE journal_id = ? AND volume = ? AND number = ? AND year = ? AND issue_id <> ?',
424 array((
int) $journalId, $this->
nullOrInt($volume), $number, $year, (
int) $issueId)
426 $returner = $result->RecordCount() != 0 ? true :
false;
436 $issue->stampModified();
438 sprintf(
'UPDATE issues
449 open_access_date = %s,
457 $this->
datetimeToDB($issue->getDatePublished()), $this->datetimeToDB($issue->getDateNotified()), $this->datetimeToDB($issue->getLastModified()), $this->datetimeToDB($issue->getOpenAccessDate())),
459 (
int) $issue->getJournalId(),
460 $this->nullOrInt($issue->getVolume()),
462 $this->nullOrInt($issue->getYear()),
463 (
int) $issue->getPublished(),
464 (
int) $issue->getCurrent(),
465 (
int) $issue->getAccessStatus(),
466 (
int) $issue->getShowVolume(),
467 (
int) $issue->getShowNumber(),
468 (
int) $issue->getShowYear(),
469 (
int) $issue->getShowTitle(),
470 $issue->getData(
'urlPath'),
471 (
int) $issue->getId(),
487 import(
'classes.file.PublicFileManager');
490 if (is_array($issue->getCoverImage(
null))) {
491 foreach ($issue->getCoverImage(
null) as $coverImage) {
492 if ($coverImage !=
'') {
493 $publicFileManager->removeContextFile($issue->getJournalId(), $coverImage);
498 $issueId = $issue->getId();
502 $sectionDao->deleteCustomSectionOrdering($issueId);
506 $issueGalleyDao->deleteByIssueId($issueId);
509 $issueFileDao->deleteByIssueId($issueId);
511 import(
'classes.file.IssueFileManager');
513 $issueFileManager->deleteIssueTree();
516 $this->
update(
'DELETE FROM issue_settings WHERE issue_id = ?', (
int) $issueId);
517 $this->
update(
'DELETE FROM issues WHERE issue_id = ?', (
int) $issueId);
518 $this->
update(
'DELETE FROM custom_issue_orders WHERE issue_id = ?', (
int) $issueId);
530 while ($issue = $issues->next()) {
543 'SELECT COUNT(*) FROM issues WHERE issue_id = ? AND journal_id = ?',
544 array((
int) $issueId, (
int) $journalId)
546 return $result->fields[0] ? true :
false;
556 $params = [
'issueId', (int) $articleId];
557 if ($journalId) $params[] = (int) $journalId;
563 LEFT JOIN publications p ON (p.publication_id = a.current_publication_id)
564 LEFT JOIN publication_settings ps ON (ps.publication_id = p.publication_id)
565 WHERE ps.setting_name = ? AND ps.setting_value = CAST(i.issue_id as CHAR) AND
566 a.submission_id = ? AND
567 a.context_id = i.journal_id' .
568 ($journalId?
' AND i.journal_id = ?':
''),
573 if ($result->RecordCount() != 0) {
589 'SELECT i.* FROM issues i WHERE journal_id = ? ORDER BY current DESC, date_published DESC',
590 (
int) $journalId, $rangeInfo
604 'SELECT i.* FROM issues i LEFT JOIN custom_issue_orders o ON (o.issue_id = i.issue_id) WHERE i.journal_id = ? AND i.published = 1 ORDER BY o.seq ASC, i.current DESC, i.date_published DESC',
605 (
int) $journalId, $rangeInfo
619 'SELECT i.* FROM issues i WHERE journal_id = ? AND published = 0 ORDER BY year ASC, volume ASC, number ASC',
620 (
int) $journalId, $rangeInfo
636 function getExportable($contextId, $pubIdType =
null, $pubIdSettingName =
null, $pubIdSettingValue =
null, $rangeInfo =
null) {
638 if ($pubIdSettingName) {
639 $params[] = $pubIdSettingName;
641 $params[] = (int) $contextId;
643 $params[] =
'pub-id::'.$pubIdType;
645 import(
'classes.plugins.PubObjectsExportPlugin');
646 if ($pubIdSettingName && $pubIdSettingValue && $pubIdSettingValue != EXPORT_STATUS_NOT_DEPOSITED) {
647 $params[] = $pubIdSettingValue;
653 LEFT JOIN custom_issue_orders o ON (o.issue_id = i.issue_id)
654 ' . ($pubIdType !=
null?
' LEFT JOIN issue_settings ist ON (i.issue_id = ist.issue_id)':
'')
655 . ($pubIdSettingName !=
null?
' LEFT JOIN issue_settings iss ON (i.issue_id = iss.issue_id AND iss.setting_name = ?)':
'') .
'
657 i.published = 1 AND i.journal_id = ?
658 ' . ($pubIdType !=
null?
' AND ist.setting_name = ? AND ist.setting_value IS NOT NULL':
'')
659 . (($pubIdSettingName !=
null && $pubIdSettingValue !=
null && $pubIdSettingValue == EXPORT_STATUS_NOT_DEPOSITED)?
' AND iss.setting_value IS NULL':
'')
660 . (($pubIdSettingName !=
null && $pubIdSettingValue !=
null && $pubIdSettingValue != EXPORT_STATUS_NOT_DEPOSITED)?
' AND iss.setting_value = ?':
'')
661 . (($pubIdSettingName !=
null && is_null($pubIdSettingValue))?
' AND (iss.setting_value IS NULL OR iss.setting_value = \'\')':
'')
662 .
' ORDER BY i.date_published DESC',
679 LEFT JOIN publications p ON (p.publication_id = s.current_publication_id)
680 LEFT JOIN publication_settings ps ON (ps.publication_id = p.publication_id)
681 WHERE ps.setting_name = ? AND ps.setting_value = ? AND (s.status = ? or s.status = ?) ',
682 [
'issueId', (
int) $issueId, (
int) STATUS_SCHEDULED, (
int) STATUS_PUBLISHED]
684 $returner = isset($result->fields[0]) ? $result->fields[0] : 0;
695 'DELETE FROM custom_issue_orders WHERE journal_id = ?', (
int) $journalId
709 'SELECT i.issue_id FROM issues i LEFT JOIN custom_issue_orders o ON (o.issue_id = i.issue_id) WHERE i.journal_id = ? ORDER BY o.seq',
713 for ($i=1; !$result->EOF; $i++) {
714 list($issueId) = $result->fields;
715 $resultB = $this->
retrieve(
'SELECT issue_id FROM custom_issue_orders WHERE journal_id=? AND issue_id=?', array($journalId, $issueId));
716 if (!$resultB->EOF) {
718 'UPDATE custom_issue_orders SET seq = ? WHERE issue_id = ? AND journal_id = ?',
719 array($i, $issueId, $journalId)
738 'SELECT COUNT(*) FROM custom_issue_orders WHERE journal_id = ?',
741 $returner = isset($result->fields[0]) && $result->fields[0] == 0 ? false :
true;
754 'SELECT seq FROM custom_issue_orders WHERE journal_id = ? AND issue_id = ?',
755 array((
int) $journalId, (
int) $issueId)
760 list($returner) = $result->fields;
773 for ($i=1; $issue = $publishedIssues->next(); $i++) {
786 'INSERT INTO custom_issue_orders (issue_id, journal_id, seq) VALUES (?, ?, ?)',
802 $result = $this->
retrieve(
'SELECT issue_id FROM custom_issue_orders WHERE journal_id=? AND issue_id=?', array((
int) $journalId, (
int) $issueId));
805 'UPDATE custom_issue_orders SET seq = ? WHERE journal_id = ? AND issue_id = ?',
806 array($newPos, (
int) $journalId, (
int) $issueId)
818 function pubIdExists($pubIdType, $pubId, $excludePubObjectId, $contextId) {
821 FROM issue_settings ist
822 INNER JOIN issues i ON ist.issue_id = i.issue_id
823 WHERE ist.setting_name = ? AND ist.setting_value = ? AND i.issue_id <> ? AND i.journal_id = ?',
825 'pub-id::'.$pubIdType,
827 (
int) $excludePubObjectId,
831 $returner = $result->fields[0] ? true :
false;
841 'issue_id',
'locale',
'setting_name'
843 $updateArray = array(
844 'issue_id' => (
int) $pubObjectId,
846 'setting_name' =>
'pub-id::'.$pubIdType,
847 'setting_type' =>
'string',
848 'setting_value' => (
string)$pubId
850 $this->
replace(
'issue_settings', $updateArray, $idFields);
858 $settingName =
'pub-id::'.$pubIdType;
860 'DELETE FROM issue_settings WHERE setting_name = ? AND issue_id = ?',
873 $settingName =
'pub-id::'.$pubIdType;
877 while ($issue = $issues->next()) {
879 'DELETE FROM issue_settings WHERE setting_name = ? AND issue_id = ?',