00001 <?php
00002
00016
00017
00018
00019 import ('issue.Issue');
00020
00021 class IssueDAO extends DAO {
00027 function &getIssueById($issueId, $journalId = null) {
00028 if (isset($journalId)) {
00029 $result = &$this->retrieve(
00030 'SELECT i.* FROM issues i WHERE issue_id = ? AND journal_id = ?',
00031 array($issueId, $journalId)
00032 );
00033 } else {
00034 $result = &$this->retrieve(
00035 'SELECT i.* FROM issues i WHERE issue_id = ?', $issueId
00036 );
00037 }
00038
00039 $issue = null;
00040 if ($result->RecordCount() != 0) {
00041 $issue = &$this->_returnIssueFromRow($result->GetRowAssoc(false));
00042 }
00043
00044 $result->Close();
00045 unset($result);
00046
00047 return $issue;
00048 }
00049
00055 function &getIssueByPublicIssueId($publicIssueId, $journalId = null) {
00056 if (isset($journalId)) {
00057 $result = &$this->retrieve(
00058 'SELECT i.* FROM issues i WHERE public_issue_id = ? AND journal_id = ?',
00059 array($publicIssueId, $journalId)
00060 );
00061 } else {
00062 $result = &$this->retrieve(
00063 'SELECT i.* FROM issues i WHERE public_issue_id = ?', $publicIssueId
00064 );
00065 }
00066
00067 $issue = null;
00068 if ($result->RecordCount() != 0) {
00069 $issue = &$this->_returnIssueFromRow($result->GetRowAssoc(false));
00070 }
00071
00072 $result->Close();
00073 unset($result);
00074
00075 return $issue;
00076 }
00077
00086 function &getPublishedIssuesByNumber($journalId, $volume = null, $number = null, $year = null) {
00087 $sql = 'SELECT i.* FROM issues i WHERE i.published = 1 AND i.journal_id = ?';
00088 $params = array($journalId);
00089
00090 if ($volume !== null) {
00091 $sql .= ' AND i.volume = ?';
00092 $params[] = $volume;
00093 }
00094 if ($number !== null) {
00095 $sql .= ' AND i.number = ?';
00096 $params[] = $number;
00097 }
00098 if ($year !== null) {
00099 $sql .= ' AND i.year = ?';
00100 $params[] = $year;
00101 }
00102
00103 $result = &$this->retrieve($sql, $params);
00104 $returner = &new DAOResultFactory($result, $this, '_returnIssueFromRow');
00105 return $returner;
00106 }
00107
00114 function &getIssueByBestIssueId($issueId, $journalId = null) {
00115 $issue = &$this->getIssueByPublicIssueId($issueId, $journalId);
00116 if (!isset($issue)) $issue = &$this->getIssueById((int) $issueId, $journalId);
00117 return $issue;
00118 }
00119
00125 function &getLastCreatedIssue($journalId) {
00126 $result = &$this->retrieveLimit(
00127 'SELECT i.* FROM issues i WHERE journal_id = ? ORDER BY year DESC, volume DESC, number DESC', $journalId, 1
00128 );
00129
00130 $issue = null;
00131 if ($result->RecordCount() != 0) {
00132 $issue = &$this->_returnIssueFromRow($result->GetRowAssoc(false));
00133 }
00134
00135 $result->Close();
00136 unset($result);
00137
00138 return $issue;
00139 }
00140
00145 function &getCurrentIssue($journalId) {
00146 $result = &$this->retrieve(
00147 'SELECT i.* FROM issues i WHERE journal_id = ? AND current = 1', $journalId
00148 );
00149
00150 $issue = null;
00151 if ($result->RecordCount() != 0) {
00152 $issue = &$this->_returnIssueFromRow($result->GetRowAssoc(false));
00153 }
00154
00155 $result->Close();
00156 unset($result);
00157
00158 return $issue;
00159 }
00160
00165 function updateCurrentIssue($journalId, $issue = null) {
00166 $this->update(
00167 'UPDATE issues SET current = 0 WHERE journal_id = ? AND current = 1', $journalId
00168 );
00169 if ($issue) $this->updateIssue($issue);
00170 }
00171
00172
00178 function &_returnIssueFromRow($row) {
00179 $issue = &new Issue();
00180 $issue->setIssueId($row['issue_id']);
00181 $issue->setJournalId($row['journal_id']);
00182 $issue->setVolume($row['volume']);
00183 $issue->setNumber($row['number']);
00184 $issue->setYear($row['year']);
00185 $issue->setPublished($row['published']);
00186 $issue->setCurrent($row['current']);
00187 $issue->setDatePublished($this->datetimeFromDB($row['date_published']));
00188 $issue->setDateNotified($this->datetimeFromDB($row['date_notified']));
00189 $issue->setAccessStatus($row['access_status']);
00190 $issue->setOpenAccessDate($this->datetimeFromDB($row['open_access_date']));
00191 $issue->setPublicIssueId($row['public_issue_id']);
00192 $issue->setShowVolume($row['show_volume']);
00193 $issue->setShowNumber($row['show_number']);
00194 $issue->setShowYear($row['show_year']);
00195 $issue->setShowTitle($row['show_title']);
00196 $issue->setStyleFileName($row['style_file_name']);
00197 $issue->setOriginalStyleFileName($row['original_style_file_name']);
00198 $issue->setNumArticles($this->getNumArticles($row['issue_id']));
00199
00200 $this->getDataObjectSettings('issue_settings', 'issue_id', $row['issue_id'], $issue);
00201
00202 HookRegistry::call('IssueDAO::_returnIssueFromRow', array(&$issue, &$row));
00203
00204 return $issue;
00205 }
00206
00211 function getLocaleFieldNames() {
00212 return array('title', 'coverPageDescription', 'coverPageAltText', 'showCoverPage', 'hideCoverPageArchives', 'hideCoverPageCover', 'originalFileName', 'fileName', 'width', 'height', 'description');
00213 }
00214
00219 function updateLocaleFields(&$issue) {
00220 $this->updateDataObjectSettings('issue_settings', $issue, array(
00221 'issue_id' => $issue->getIssueId()
00222 ));
00223 }
00224
00230 function insertIssue(&$issue) {
00231 $this->update(
00232 sprintf('INSERT INTO issues
00233 (journal_id, volume, number, year, published, current, date_published, date_notified, access_status, open_access_date, public_issue_id, show_volume, show_number, show_year, show_title, style_file_name, original_style_file_name)
00234 VALUES
00235 (?, ?, ?, ?, ?, ?, %s, %s, ?, %s, ?, ?, ?, ?, ?, ?, ?)',
00236 $this->datetimeToDB($issue->getDatePublished()), $this->datetimeToDB($issue->getDateNotified()), $this->datetimeToDB($issue->getOpenAccessDate())),
00237 array(
00238 $issue->getJournalId(),
00239 $issue->getVolume(),
00240 $issue->getNumber(),
00241 $issue->getYear(),
00242 $issue->getPublished(),
00243 $issue->getCurrent(),
00244 $issue->getAccessStatus(),
00245 $issue->getPublicIssueId(),
00246 $issue->getShowVolume(),
00247 $issue->getShowNumber(),
00248 $issue->getShowYear(),
00249 $issue->getShowTitle(),
00250 $issue->getStyleFileName(),
00251 $issue->getOriginalStyleFileName()
00252 )
00253 );
00254
00255 $issue->setIssueId($this->getInsertIssueId());
00256
00257 $this->updateLocaleFields($issue);
00258
00259 if ($this->customIssueOrderingExists($issue->getJournalId())) {
00260 $this->resequenceCustomIssueOrders($issue->getJournalId());
00261 }
00262
00263 return $issue->getIssueId();
00264 }
00265
00270 function getInsertIssueId() {
00271 return $this->getInsertId('issues', 'issue_id');
00272 }
00273
00282 function issueExists($journalId, $volume, $number, $year, $issueId) {
00283 $result = &$this->retrieve(
00284 'SELECT i.* FROM issues i WHERE journal_id = ? AND volume = ? AND number = ? AND year = ? AND issue_id <> ?',
00285 array($journalId, $volume, $number, $year, $issueId)
00286 );
00287 $returner = $result->RecordCount() != 0 ? true : false;
00288
00289 $result->Close();
00290 unset($result);
00291
00292 return $returner;
00293 }
00294
00299 function updateIssue($issue) {
00300 $this->update(
00301 sprintf('UPDATE issues
00302 SET
00303 journal_id = ?,
00304 volume = ?,
00305 number = ?,
00306 year = ?,
00307 published = ?,
00308 current = ?,
00309 date_published = %s,
00310 date_notified = %s,
00311 open_access_date = %s,
00312 public_issue_id = ?,
00313 access_status = ?,
00314 show_volume = ?,
00315 show_number = ?,
00316 show_year = ?,
00317 show_title = ?,
00318 style_file_name = ?,
00319 original_style_file_name = ?
00320 WHERE issue_id = ?',
00321 $this->datetimeToDB($issue->getDatePublished()), $this->datetimeToDB($issue->getDateNotified()), $this->datetimeToDB($issue->getOpenAccessDate())),
00322 array(
00323 $issue->getJournalId(),
00324 $issue->getVolume(),
00325 $issue->getNumber(),
00326 $issue->getYear(),
00327 $issue->getPublished(),
00328 $issue->getCurrent(),
00329 $issue->getPublicIssueId(),
00330 $issue->getAccessStatus(),
00331 $issue->getShowVolume(),
00332 $issue->getShowNumber(),
00333 $issue->getShowYear(),
00334 $issue->getShowTitle(),
00335 $issue->getStyleFileName(),
00336 $issue->getOriginalStyleFileName(),
00337 $issue->getIssueId()
00338 )
00339 );
00340
00341 $this->updateLocaleFields($issue);
00342
00343 if ($this->customIssueOrderingExists($issue->getJournalId())) {
00344 $this->resequenceCustomIssueOrders($issue->getJournalId());
00345 }
00346 }
00347
00352 function deleteIssue(&$issue) {
00353 import('file.PublicFileManager');
00354 $publicFileManager = &new PublicFileManager();
00355
00356 if (is_array($issue->getFileName(null))) foreach ($issue->getFileName(null) as $fileName) {
00357 if ($fileName != '') {
00358 $publicFileManager->removeJournalFile($issue->getJournalId(), $fileName);
00359 }
00360 }
00361 if (($fileName = $issue->getStyleFileName()) != '') {
00362 $publicFileManager->removeJournalFile($issue->getJournalId(), $fileName);
00363 }
00364
00365 $issueId = $issue->getIssueId();
00366
00367
00368 $sectionDao = &DAORegistry::getDAO('SectionDAO');
00369 $sectionDao->deleteCustomSectionOrdering($issueId);
00370
00371 $publishedArticleDao = &DAORegistry::getDAO('PublishedArticleDAO');
00372 $publishedArticleDao->deletePublishedArticlesByIssueId($issueId);
00373
00374 $this->update('DELETE FROM issue_settings WHERE issue_id = ?', $issueId);
00375 $this->update('DELETE FROM issues WHERE issue_id = ?', $issueId);
00376 $this->resequenceCustomIssueOrders($issue->getJournalId());
00377 }
00378
00383 function deleteIssuesByJournal($journalId) {
00384 $issues =& $this->getIssues($journalId);
00385 while (($issue =& $issues->next())) {
00386 $this->deleteIssue($issue);
00387 unset($issue);
00388 }
00389 }
00390
00396 function issueIdExists($issueId, $journalId) {
00397 $result = &$this->retrieve(
00398 'SELECT COUNT(*) FROM issues WHERE issue_id = ? AND journal_id = ?',
00399 array($issueId, $journalId)
00400 );
00401 return $result->fields[0] ? true : false;
00402 }
00403
00409 function publicIssueIdExists($publicIssueId, $issueId, $journalId) {
00410 $result = &$this->retrieve(
00411 'SELECT COUNT(*) FROM issues WHERE public_issue_id = ? AND issue_id <> ? AND journal_id = ?', array($publicIssueId, $issueId, $journalId)
00412 );
00413 $returner = $result->fields[0] ? true : false;
00414
00415 $result->Close();
00416 unset($result);
00417
00418 return $returner;
00419 }
00420
00427 function &getIssueByArticleId($articleId, $journalId = null) {
00428 $params = array($articleId);
00429 $sql = 'SELECT i.*
00430 FROM issues i,
00431 published_articles pa,
00432 articles a
00433 WHERE i.issue_id = pa.issue_id AND
00434 pa.article_id = ? AND
00435 pa.article_id = a.article_id';
00436 if ($journalId !== null) {
00437 $sql .= ' AND i.journal_id = ? AND a.journal_id = i.journal_id';
00438 $params[] = $journalId;
00439 }
00440
00441 $result = &$this->retrieve($sql, $params);
00442
00443 $issue = null;
00444 if ($result->RecordCount() != 0) {
00445 $publishedArticleDao = &DAORegistry::getDAO('PublishedArticleDAO');
00446 $issue = &$this->_returnIssueFromRow($result->GetRowAssoc(false));
00447 }
00448
00449 $result->Close();
00450 unset($result);
00451
00452 return $issue;
00453 }
00454
00461 function &getIssues($journalId, $rangeInfo = null) {
00462 $issues = array();
00463
00464 $sql = 'SELECT i.* FROM issues i WHERE journal_id = ? ORDER BY current DESC, date_published DESC';
00465 $result = &$this->retrieveRange($sql, $journalId, $rangeInfo);
00466
00467 $returner = &new DAOResultFactory($result, $this, '_returnIssueFromRow');
00468 return $returner;
00469 }
00470
00477 function &getPublishedIssues($journalId, $rangeInfo = null) {
00478 $result = &$this->retrieveRange(
00479 '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',
00480 $journalId, $rangeInfo
00481 );
00482
00483 $returner = &new DAOResultFactory($result, $this, '_returnIssueFromRow');
00484 return $returner;
00485 }
00486
00493 function &getUnpublishedIssues($journalId, $rangeInfo = null) {
00494 $result = &$this->retrieveRange(
00495 'SELECT i.* FROM issues i WHERE journal_id = ? AND published = 0 ORDER BY year ASC, volume ASC, number ASC',
00496 $journalId, $rangeInfo
00497 );
00498
00499 $returner = &new DAOResultFactory($result, $this, '_returnIssueFromRow');
00500 return $returner;
00501 }
00502
00508 function getNumArticles($issueId) {
00509 $result = &$this->retrieve('SELECT COUNT(*) FROM published_articles WHERE issue_id = ?', $issueId);
00510 $returner = isset($result->fields[0]) ? $result->fields[0] : 0;
00511
00512 $result->Close();
00513 unset($result);
00514
00515 return $returner;
00516 }
00517
00522 function deleteCustomIssueOrdering($journalId) {
00523 return $this->update(
00524 'DELETE FROM custom_issue_orders WHERE journal_id = ?', $journalId
00525 );
00526 }
00527
00532 function resequenceCustomIssueOrders($journalId) {
00533 $result = &$this->retrieve(
00534 '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',
00535 $journalId
00536 );
00537
00538 for ($i=1; !$result->EOF; $i++) {
00539 list($issueId) = $result->fields;
00540 $resultB =& $this->retrieve('SELECT issue_id FROM custom_issue_orders WHERE journal_id=? AND issue_id=?', array($journalId, $issueId));
00541 if (!$resultB->EOF) {
00542 $this->update(
00543 'UPDATE custom_issue_orders SET seq = ? WHERE issue_id = ? AND journal_id = ?',
00544 array($i, $issueId, $journalId)
00545 );
00546 } else {
00547
00548 $this->insertCustomIssueOrder($journalId, $issueId, $i);
00549 }
00550 $resultB->Close();
00551 unset($resultB);
00552 $result->moveNext();
00553 }
00554
00555 $result->close();
00556 unset($result);
00557 }
00558
00564 function customIssueOrderingExists($journalId) {
00565 $result = &$this->retrieve(
00566 'SELECT COUNT(*) FROM custom_issue_orders WHERE journal_id = ?',
00567 $journalId
00568 );
00569 $returner = isset($result->fields[0]) && $result->fields[0] == 0 ? false : true;
00570
00571 $result->Close();
00572 unset($result);
00573
00574 return $returner;
00575 }
00576
00583 function getCustomIssueOrder($journalId, $issueId) {
00584 $result = &$this->retrieve(
00585 'SELECT seq FROM custom_issue_orders WHERE journal_id = ? AND issue_id = ?',
00586 array($journalId, $issueId)
00587 );
00588
00589 $returner = null;
00590 if (!$result->EOF) {
00591 list($returner) = $result->fields;
00592 }
00593 $result->Close();
00594 unset($result);
00595
00596 return $returner;
00597 }
00598
00604 function setDefaultCustomIssueOrders($journalId) {
00605 $publishedIssues =& $this->getPublishedIssues($journalId);
00606 $i=1;
00607 while ($issue =& $publishedIssues->next()) {
00608 $this->insertCustomIssueOrder($journalId, $issue->getIssueId(), $i);
00609 unset($issue);
00610 $i++;
00611 }
00612 }
00613
00620 function insertCustomIssueOrder($journalId, $issueId, $seq) {
00621 $this->update(
00622 'INSERT INTO custom_issue_orders (issue_id, journal_id, seq) VALUES (?, ?, ?)',
00623 array(
00624 $issueId,
00625 $journalId,
00626 $seq
00627 )
00628 );
00629 }
00630
00638 function moveCustomIssueOrder($journalId, $issueId, $newPos, $up) {
00639 $result =& $this->retrieve('SELECT issue_id FROM custom_issue_orders WHERE journal_id=? AND issue_id=?', array($journalId, $issueId));
00640 if (!$result->EOF) {
00641 $this->update(
00642 'UPDATE custom_issue_orders SET seq = ? ' . ($up?'-':'+') . ' 0.5 WHERE journal_id = ? AND issue_id = ?',
00643 array($newPos, $journalId, $issueId)
00644 );
00645 } else {
00646
00647 $this->insertCustomIssueOrder($journalId, $issueId, $newPos + ($up?-0.5:0.5));
00648 }
00649 $result->Close();
00650 unset($result);
00651 $this->resequenceCustomIssueOrders($journalId);
00652 }
00653 }
00654
00655 ?>