Open Monograph Press  3.3.0
SiteDAO.inc.php
1 <?php
2 
16 import('lib.pkp.classes.site.Site');
17 import('classes.core.Services');
18 
19 class SiteDAO extends DAO {
20 
22  var $primaryTableColumns = [
23  'redirect' => 'redirect',
24  'primaryLocale' => 'primary_locale',
25  'minPasswordLength' => 'min_password_length',
26  'installedLocales' => 'installed_locales',
27  'supportedLocales' => 'supported_locales',
28  ];
29 
30 
35  function &getSite() {
36  $site = null;
37  $result = $this->retrieve(
38  'SELECT * FROM site'
39  );
40 
41  if ($result->RecordCount() != 0) {
42  $site = $this->_fromRow($result->GetRowAssoc(false));
43  }
44 
45  $result->Close();
46  return $site;
47  }
48 
53  function newDataObject() {
54  return new Site();
55  }
56 
60  function _fromRow($primaryRow, $callHook = true) {
61  $schemaService = Services::get('schema');
62  $schema = $schemaService->get(SCHEMA_SITE);
63 
64  $site = $this->newDataObject();
65 
66  foreach ($this->primaryTableColumns as $propName => $column) {
67  if (isset($primaryRow[$column])) {
68  // Backwards-compatible handling of the installedLocales and
69  // supportedLocales data. Before 3.2, these were stored as colon-separated
70  // strings (eg - en_US:fr_CA:ar_IQ). In 3.2, these are migrated to
71  // serialized arrays defined by the site.json schema. However, some of the
72  // older upgrade scripts use site data before the migration is performed,
73  // so SiteDAO must be able to return the correct array before the data
74  // is migrated. This code checks the format and converts the old data so
75  // that calls to $site->getInstalledLocales() and
76  // $site->getSupportedLocales() return an appropriate array.
77  if (in_array($column, ['installed_locales', 'supported_locales']) &&
78  !is_null($primaryRow[$column]) && strpos($primaryRow[$column], '{') === false) {
79  $site->setData($propName, explode(':', $primaryRow[$column]));
80  } else {
81  $site->setData(
82  $propName,
83  $this->convertFromDb($primaryRow[$column], $schema->properties->{$propName}->type)
84  );
85  }
86  }
87  }
88 
89  $result = $this->retrieve("SELECT * FROM site_settings");
90 
91  while (!$result->EOF) {
92  $settingRow = $result->getRowAssoc(false);
93  if (!empty($schema->properties->{$settingRow['setting_name']})) {
94  $site->setData(
95  $settingRow['setting_name'],
96  $this->convertFromDB(
97  $settingRow['setting_value'],
98  $schema->properties->{$settingRow['setting_name']}->type
99  ),
100  empty($settingRow['locale']) ? null : $settingRow['locale']
101  );
102  }
103  $result->MoveNext();
104  }
105 
106  return $site;
107  }
108 
113  function insertSite(&$site) {
114  $type = 'array';
115  $returner = $this->update(
116  'INSERT INTO site
117  (redirect, min_password_length, primary_locale, installed_locales, supported_locales)
118  VALUES
119  (?, ?, ?, ?, ?)',
120  array(
121  $site->getRedirect(),
122  (int) $site->getMinPasswordLength(),
123  $site->getPrimaryLocale(),
124  $this->convertToDB($site->getInstalledLocales(), $type),
125  $this->convertToDB($site->getInstalledLocales(), $type),
126  )
127  );
128  return $returner;
129  }
130 
134  public function updateObject($site) {
135  $schemaService = Services::get('schema');
136  $schema = $schemaService->get(SCHEMA_SITE);
137  $sanitizedProps = $schemaService->sanitize(SCHEMA_SITE, $site->_data);
138 
139  $set = $params = [];
140  foreach ($this->primaryTableColumns as $propName => $column) {
141  $set[] = $column . ' = ?';
142  $params[] = $this->convertToDb($sanitizedProps[$propName], $schema->properties->{$propName}->type);
143  }
144  $this->update("UPDATE site SET " . join(',', $set), $params);
145 
146  $deleteSettings = [];
147  $keyColumns = ['locale', 'setting_name'];
148  foreach ($schema->properties as $propName => $propSchema) {
149  if (array_key_exists($propName, $this->primaryTableColumns)) {
150  continue;
151  } elseif (!isset($sanitizedProps[$propName])) {
152  $deleteSettings[] = $propName;
153  continue;
154  }
155  if (!empty($propSchema->multilingual)) {
156  foreach ($sanitizedProps[$propName] as $localeKey => $localeValue) {
157  // Delete rows with a null value
158  if (is_null($localeValue)) {
159  $this->update("DELETE FROM site_settings WHERE setting_name = ? AND locale = ?",[
160  $propName,
161  $localeKey,
162  ]);
163  } else {
164  $updateArray = [
165  'locale' => $localeKey,
166  'setting_name' => $propName,
167  'setting_value' => $this->convertToDB($localeValue, $schema->properties->{$propName}->type),
168  ];
169  $result = $this->replace('site_settings', $updateArray, $keyColumns);
170  }
171  }
172  } else {
173  $updateArray = [
174  'locale' => '',
175  'setting_name' => $propName,
176  'setting_value' => $this->convertToDB($sanitizedProps[$propName], $schema->properties->{$propName}->type),
177  ];
178  $this->replace('site_settings', $updateArray, $keyColumns);
179  }
180  }
181 
182  if (count($deleteSettings)) {
183  $deleteSettingNames = join(',', array_map(function($settingName) {
184  return "'$settingName'";
185  }, $deleteSettings));
186  $this->update("DELETE FROM site_settings WHERE setting_name in ($deleteSettingNames)");
187  }
188  }
189 }
SiteDAO\newDataObject
newDataObject()
Definition: SiteDAO.inc.php:56
SiteDAO\_fromRow
_fromRow($primaryRow, $callHook=true)
Definition: SiteDAO.inc.php:63
SiteDAO\insertSite
insertSite(&$site)
Definition: SiteDAO.inc.php:116
DAO\retrieve
& retrieve($sql, $params=false, $callHooks=true)
Definition: DAO.inc.php:85
SiteDAO\$primaryTableColumns
$primaryTableColumns
Definition: SiteDAO.inc.php:25
DAO\convertFromDB
convertFromDB($value, $type)
Definition: DAO.inc.php:341
SiteDAO\updateObject
updateObject($site)
Definition: SiteDAO.inc.php:137
SiteDAO
Operations for retrieving and modifying the Site object.
Definition: SiteDAO.inc.php:19
Site
Describes system-wide site properties.
Definition: Site.inc.php:23
SiteDAO\getSite
& getSite()
Definition: SiteDAO.inc.php:38
DAO
Operations for retrieving and modifying objects from a database.
Definition: DAO.inc.php:31
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49