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 = ?',