Open Journal Systems  3.3.0
PKPPublicationDAO.inc.php
1 <?php
2 
16 import('lib.pkp.classes.db.SchemaDAO');
17 import('lib.pkp.classes.plugins.PKPPubIdPluginDAO');
18 import('classes.publication.Publication');
19 import('lib.pkp.classes.services.PKPSchemaService'); // SCHEMA_ constants
20 
21 class PKPPublicationDAO extends SchemaDAO implements PKPPubIdPluginDAO {
23  public $schemaName = SCHEMA_PUBLICATION;
24 
26  public $tableName = 'publications';
27 
29  public $settingsTableName = 'publication_settings';
30 
32  public $primaryKeyColumn = 'publication_id';
33 
35  public $controlledVocabProps = ['disciplines', 'keywords', 'languages', 'subjects', 'supportingAgencies'];
36 
42  public function newDataObject() {
43  return new Publication();
44  }
45 
49  public function _fromRow($primaryRow) {
50  $publication = parent::_fromRow($primaryRow);
51 
52  // Get authors
53  $publication->setData('authors', iterator_to_array(
54  Services::get('author')->getMany(['publicationIds' => $publication->getId()])
55  ));
56 
57  // Get controlled vocab metadata
58  $submissionKeywordDao = DAORegistry::getDAO('SubmissionKeywordDAO'); /* @var $submissionKeywordDao SubmissionKeywordDAO */
59  $publication->setData('keywords', $submissionKeywordDao->getKeywords($publication->getId()));
60  $submissionSubjectDao = DAORegistry::getDAO('SubmissionSubjectDAO'); /* @var $submissionSubjectDao SubmissionSubjectDAO */
61  $publication->setData('subjects', $submissionSubjectDao->getSubjects($publication->getId()));
62  $submissionDisciplineDao = DAORegistry::getDAO('SubmissionDisciplineDAO'); /* @var $submissionDisciplineDao SubmissionDisciplineDAO */
63  $publication->setData('disciplines', $submissionDisciplineDao->getDisciplines($publication->getId()));
64  $submissionLanguageDao = DAORegistry::getDAO('SubmissionLanguageDAO'); /* @var $submissionLanguageDao SubmissionLanguageDAO */
65  $publication->setData('languages', $submissionLanguageDao->getLanguages($publication->getId()));
66  $submissionAgencyDao = DAORegistry::getDAO('SubmissionAgencyDAO'); /* @var $submissionAgencyDao SubmissionAgencyDAO */
67  $publication->setData('supportingAgencies', $submissionAgencyDao->getAgencies($publication->getId()));
68 
69  // Get categories
70  $categoryDao = DAORegistry::getDAO('CategoryDAO'); /* @var $categoryDao CategoryDAO */
71  $publication->setData('categoryIds', array_map(
72  function($category) {
73  return (int) $category->getId();
74  },
75  $categoryDao->getByPublicationId($publication->getId())->toArray()
76  ));
77 
78  return $publication;
79  }
80 
84  public function insertObject($publication) {
85 
86  // Remove the controlled vocabulary from the publication to save it separately
87  $controlledVocabKeyedArray = array_flip($this->controlledVocabProps);
88  $controlledVocabProps = array_intersect_key($publication->_data, $controlledVocabKeyedArray);
89  $publication->_data = array_diff_key($publication->_data, $controlledVocabKeyedArray);
90 
91  parent::insertObject($publication);
92 
93  // Add controlled vocabularly for which we have props
94  if (!empty($controlledVocabProps)) {
95  foreach ($controlledVocabProps as $prop => $value) {
96  switch ($prop) {
97  case 'keywords':
98  $submissionKeywordDao = DAORegistry::getDAO('SubmissionKeywordDAO'); /* @var $submissionKeywordDao SubmissionKeywordDAO */
99  $submissionKeywordDao->insertKeywords($value, $publication->getId());
100  break;
101  case 'subjects':
102  $submissionSubjectDao = DAORegistry::getDAO('SubmissionSubjectDAO'); /* @var $submissionSubjectDao SubmissionSubjectDAO */
103  $submissionSubjectDao->insertSubjects($value, $publication->getId());
104  break;
105  case 'disciplines':
106  $submissionDisciplineDao = DAORegistry::getDAO('SubmissionDisciplineDAO'); /* @var $submissionDisciplineDao SubmissionDisciplineDAO */
107  $submissionDisciplineDao->insertDisciplines($value, $publication->getId());
108  break;
109  case 'languages':
110  $submissionLanguageDao = DAORegistry::getDAO('SubmissionLanguageDAO'); /* @var $submissionLanguageDao SubmissionLanguageDAO */
111  $submissionLanguageDao->insertLanguages($value, $publication->getId());
112  break;
113  case 'supportingAgencies':
114  $submissionAgencyDao = DAORegistry::getDAO('SubmissionAgencyDAO'); /* @var $submissionAgencyDao SubmissionAgencyDAO */
115  $submissionAgencyDao->insertAgencies($value, $publication->getId());
116  break;
117  }
118  }
119  }
120 
121  // Set categories
122  if (!empty($publication->getData('categoryIds'))) {
123  $categoryDao = DAORegistry::getDAO('CategoryDAO'); /* @var $categoryDao CategoryDAO */
124  foreach ($publication->getData('categoryIds') as $categoryId) {
125  $categoryDao->insertPublicationAssignment($categoryId, $publication->getId());
126  }
127  }
128 
129  return $publication->getId();
130  }
131 
135  public function updateObject($publication) {
136 
137  // Remove the controlled vocabulary from the publication to save it separately
138  $controlledVocabKeyedArray = array_flip($this->controlledVocabProps);
139  $controlledVocabProps = array_intersect_key($publication->_data, $controlledVocabKeyedArray);
140  $publication->_data = array_diff_key($publication->_data, $controlledVocabKeyedArray);
141 
142  parent::updateObject($publication);
143 
144  // Update controlled vocabularly for which we have props
145  if (!empty($controlledVocabProps)) {
146  foreach ($controlledVocabProps as $prop => $value) {
147  switch ($prop) {
148  case 'keywords':
149  $submissionKeywordDao = DAORegistry::getDAO('SubmissionKeywordDAO'); /* @var $submissionKeywordDao SubmissionKeywordDAO */
150  $submissionKeywordDao->insertKeywords($value, $publication->getId());
151  break;
152  case 'subjects':
153  $submissionSubjectDao = DAORegistry::getDAO('SubmissionSubjectDAO'); /* @var $submissionSubjectDao SubmissionSubjectDAO */
154  $submissionSubjectDao->insertSubjects($value, $publication->getId());
155  break;
156  case 'disciplines':
157  $submissionDisciplineDao = DAORegistry::getDAO('SubmissionDisciplineDAO'); /* @var $submissionDisciplineDao SubmissionDisciplineDAO */
158  $submissionDisciplineDao->insertDisciplines($value, $publication->getId());
159  break;
160  case 'languages':
161  $submissionLanguageDao = DAORegistry::getDAO('SubmissionLanguageDAO'); /* @var $submissionLanguageDao SubmissionLanguageDAO */
162  $submissionLanguageDao->insertLanguages($value, $publication->getId());
163  break;
164  case 'supportingAgencies':
165  $submissionAgencyDao = DAORegistry::getDAO('SubmissionAgencyDAO'); /* @var $submissionAgencyDao SubmissionAgencyDAO */
166  $submissionAgencyDao->insertAgencies($value, $publication->getId());
167  break;
168  }
169  }
170  }
171 
172  // Set categories
173  $categoryDao = DAORegistry::getDAO('CategoryDAO'); /* @var $categoryDao CategoryDAO */
174  $categoryDao->deletePublicationAssignments($publication->getId());
175  if (!empty($publication->getData('categoryIds'))) {
176  foreach ($publication->getData('categoryIds') as $categoryId) {
177  $categoryDao->insertPublicationAssignment($categoryId, $publication->getId());
178  }
179  }
180  }
181 
185  public function deleteById($publicationId) {
186  parent::deleteById($publicationId);
187 
188  // Delete authors
189  $authorsIterator = Services::get('author')->getMany(['publicationIds' => $publicationId]);
190  foreach ($authorsIterator as $author) {
191  Services::get('author')->delete($author);
192  }
193 
194  // Delete the controlled vocabulary
195  // Insert an empty array will clear existing entries
196  $submissionKeywordDao = DAORegistry::getDAO('SubmissionKeywordDAO'); /* @var $submissionKeywordDao SubmissionKeywordDAO */
197  $submissionKeywordDao->insertKeywords([], $publicationId);
198  $submissionSubjectDao = DAORegistry::getDAO('SubmissionSubjectDAO'); /* @var $submissionSubjectDao SubmissionSubjectDAO */
199  $submissionSubjectDao->insertSubjects([], $publicationId);
200  $submissionDisciplineDao = DAORegistry::getDAO('SubmissionDisciplineDAO'); /* @var $submissionDisciplineDao SubmissionDisciplineDAO */
201  $submissionDisciplineDao->insertDisciplines([], $publicationId);
202  $submissionLanguageDao = DAORegistry::getDAO('SubmissionLanguageDAO'); /* @var $submissionLanguageDao SubmissionLanguageDAO */
203  $submissionLanguageDao->insertLanguages([], $publicationId);
204  $submissionAgencyDao = DAORegistry::getDAO('SubmissionAgencyDAO'); /* @var $submissionAgencyDao SubmissionAgencyDAO */
205  $submissionAgencyDao->insertAgencies([], $publicationId);
206 
207  // Delete categories
208  $categoryDao = DAORegistry::getDAO('CategoryDAO'); /* @var $categoryDao CategoryDAO */
209  $categoryDao->deletePublicationAssignments($publicationId);
210 
211  // Delete citations
212  $citationDao = DAORegistry::getDAO('CitationDAO'); /* @var $citationDao CitationDAO */
213  $citationDao->deleteByPublicationId($publicationId);
214  }
215 
219  public function pubIdExists($pubIdType, $pubId, $excludePubObjectId, $contextId) {
220  $result = $this->retrieve(
221  'SELECT COUNT(*)
222  FROM publication_settings ps
223  LEFT JOIN publications p ON p.publication_id = ps.publication_id
224  LEFT JOIN submissions s ON p.submission_id = s.submission_id
225  WHERE ps.setting_name = ? and ps.setting_value = ? and s.submission_id <> ? AND s.context_id = ?',
226  array(
227  'pub-id::'.$pubIdType,
228  $pubId,
229  // The excludePubObjectId refers to the submission id
230  // because multiple versions of the same submission
231  // are allowed to share a DOI.
232  (int) $excludePubObjectId,
233  (int) $contextId
234  )
235  );
236  $returner = $result->fields[0] ? true : false;
237  $result->Close();
238  return $returner;
239  }
240 
244  function changePubId($pubObjectId, $pubIdType, $pubId) {
245  $idFields = array(
246  'publication_id', 'locale', 'setting_name'
247  );
248  $updateArray = array(
249  'publication_id' => (int) $pubObjectId,
250  'locale' => '',
251  'setting_name' => 'pub-id::'.$pubIdType,
252  'setting_value' => (string)$pubId
253  );
254  $this->replace('publication_settings', $updateArray, $idFields);
255  $this->flushCache();
256  }
257 
261  public function deletePubId($pubObjectId, $pubIdType) {
262  $this->update(
263  'DELETE FROM publication_settings ps
264  WHERE ps.publication_id = ?
265  AND ps.setting_name= ?',
266  [
267  $pubObjectId,
268  'pubid::' . $pubIdType,
269  ]
270  );
271  $this->flushCache();
272  }
273 
277  public function deleteAllPubIds($contextId, $pubIdType) {
278  switch ($this->getDriver()) {
279  case 'mysql':
280  case 'mysqli':
281  $this->update(
282  'DELETE ps FROM publication_settings ps
283  LEFT JOIN publications p ON p.publication_id = ps.publication_id
284  LEFT JOIN submissions s ON s.submission_id = p.submission_id
285  WHERE ps.setting_name = ?
286  AND s.context_id = ?',
287  [
288  'pub-id::' . $pubIdType,
289  $contextId,
290  ]
291  );
292  break;
293  case 'postgres':
294  case 'postgres64':
295  case 'postgres7':
296  case 'postgres8':
297  case 'postgres9':
298  $this->update(
299  'DELETE FROM publication_settings
300  USING publication_settings ps
301  LEFT JOIN publications p ON p.publication_id = ps.publication_id
302  LEFT JOIN submissions s ON s.submission_id = p.submission_id
303  WHERE ps.setting_name = ?
304  AND s.context_id = ?
305  AND ps.publication_id = publication_settings.publication_id
306  AND ps.locale = publication_settings.locale
307  AND ps.setting_name = publication_settings.setting_name',
308  [
309  'pub-id::' . $pubIdType,
310  $contextId,
311  ]
312  );
313  break;
314  default: fatalError("Unknown database type!");
315  }
316  $this->flushCache();
317  }
318 }
DAO\getDriver
getDriver()
Definition: DAO.inc.php:611
PKPPubIdPluginDAO
Interface that DAOs would need to implement in order for pub ID support to be added.
Definition: PKPPubIdPluginDAO.inc.php:16
PKPPublicationDAO\insertObject
insertObject($publication)
Definition: PKPPublicationDAO.inc.php:87
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
PKPPublicationDAO\updateObject
updateObject($publication)
Definition: PKPPublicationDAO.inc.php:138
PKPPublicationDAO\$settingsTableName
$settingsTableName
Definition: PKPPublicationDAO.inc.php:29
PKPPublicationDAO\$primaryKeyColumn
$primaryKeyColumn
Definition: PKPPublicationDAO.inc.php:32
DAO\retrieve
& retrieve($sql, $params=false, $callHooks=true)
Definition: DAO.inc.php:85
PKPPublicationDAO\$tableName
$tableName
Definition: PKPPublicationDAO.inc.php:26
PKPPublicationDAO\$controlledVocabProps
$controlledVocabProps
Definition: PKPPublicationDAO.inc.php:38
PKPPublicationDAO\$schemaName
$schemaName
Definition: PKPPublicationDAO.inc.php:23
PKPPublicationDAO\newDataObject
newDataObject()
Definition: PKPPublicationDAO.inc.php:45
PKPPublicationDAO\pubIdExists
pubIdExists($pubIdType, $pubId, $excludePubObjectId, $contextId)
Definition: PKPPublicationDAO.inc.php:222
Publication
Class for Publication.
Definition: Publication.inc.php:18
PKPPublicationDAO\deleteAllPubIds
deleteAllPubIds($contextId, $pubIdType)
Definition: PKPPublicationDAO.inc.php:280
PKPPublicationDAO\deleteById
deleteById($publicationId)
Definition: PKPPublicationDAO.inc.php:188
DAO\update
update($sql, $params=false, $callHooks=true, $dieOnError=true)
Definition: DAO.inc.php:214
PKPPublicationDAO\changePubId
changePubId($pubObjectId, $pubIdType, $pubId)
Definition: PKPPublicationDAO.inc.php:247
PKPPublicationDAO\deletePubId
deletePubId($pubObjectId, $pubIdType)
Definition: PKPPublicationDAO.inc.php:264
PKPPublicationDAO
Operations for retrieving and modifying publication objects.
Definition: PKPPublicationDAO.inc.php:21
DAO\replace
replace($table, $arrFields, $keyCols)
Definition: DAO.inc.php:243
DAO\flushCache
flushCache()
Definition: DAO.inc.php:288
fatalError
if(!function_exists('import')) fatalError($reason)
Definition: functions.inc.php:32
PKPPublicationDAO\_fromRow
_fromRow($primaryRow)
Definition: PKPPublicationDAO.inc.php:52
SchemaDAO
A base class for DAOs which rely on a json-schema file to define the data object.
Definition: SchemaDAO.inc.php:18
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49