Open Journal Systems  3.3.0
EmailTemplateDAO.inc.php
1 <?php
2 
17 import('lib.pkp.classes.mail.EmailTemplate');
18 import('lib.pkp.classes.db.SchemaDAO');
19 import('classes.core.Services');
20 
21 class EmailTemplateDAO extends SchemaDAO {
23  var $schemaName = SCHEMA_EMAIL_TEMPLATE;
24 
26  var $tableName = 'email_templates';
27 
29  var $settingsTableName = 'email_templates_settings';
30 
32  var $primaryKeyColumn = 'email_id';
33 
35  var $primaryTableColumns = [
36  'id' => 'email_id',
37  'key' => 'email_key',
38  'contextId' => 'context_id',
39  'enabled' => 'enabled',
40  'canDisable' => 'can_disable',
41  'canEdit' => 'can_edit',
42  'fromRoleId' => 'from_role_id',
43  'toRoleId' => 'to_role_id',
44  'stageId' => 'stage_id',
45  ];
46 
50  public function newDataObject() {
51  return new EmailTemplate();
52  }
53 
57  public function insertObject($object) {
58  // The object contains custom template information as well as the default data.
59  // Strip default data from the object before calling insertObject so that it
60  // doesn't try to write this data to the email templates settings table.
61  $partialObject = clone $object;
62  unset($partialObject->_data['canDisable']);
63  unset($partialObject->_data['canEdit']);
64  unset($partialObject->_data['description']);
65  unset($partialObject->_data['fromRoleId']);
66  unset($partialObject->_data['toRoleId']);
67  unset($partialObject->_data['stageId']);
68 
69  parent::insertObject($partialObject);
70  }
71 
75  public function updateObject($object) {
76  // The object contains custom template information as well as the default data.
77  // Strip default data from the object before calling updateObject so that it
78  // doesn't try to write this data to the email templates settings table.
79  $partialObject = clone $object;
80  unset($partialObject->_data['canDisable']);
81  unset($partialObject->_data['canEdit']);
82  unset($partialObject->_data['description']);
83  unset($partialObject->_data['fromRoleId']);
84  unset($partialObject->_data['toRoleId']);
85  unset($partialObject->_data['stageId']);
86 
87  parent::updateObject($partialObject);
88  }
89 
96  public function _fromRow($primaryRow) {
97  $emailTemplate = parent::_fromRow($primaryRow);
98  $schema = Services::get('schema')->get($this->schemaName);
99 
100  $result = $this->retrieve(
101  "SELECT * FROM email_templates_default_data WHERE email_key = ?",
102  [$emailTemplate->getData('key')]
103  );
104  $props = ['subject', 'body', 'description'];
105  while (!$result->EOF) {
106  $settingRow = $result->getRowAssoc(false);
107  foreach ($props as $prop) {
108  // Don't allow default data to override custom template data
109  if ($emailTemplate->getData($prop, $settingRow['locale'])) {
110  continue;
111  }
112  $emailTemplate->setData(
113  $prop,
114  $this->convertFromDB(
115  $settingRow[$prop],
116  $schema->properties->{$prop}->type
117  ),
118  $settingRow['locale']
119  );
120  }
121  $result->MoveNext();
122  }
123  $result->Close();
124 
125  return $emailTemplate;
126  }
127 
132  function deleteEmailTemplatesByLocale($locale) {
133  $this->update(
134  'DELETE FROM email_templates_settings WHERE locale = ?', $locale
135  );
136  }
137 
142  function deleteDefaultEmailTemplatesByLocale($locale) {
143  $this->update(
144  'DELETE FROM email_templates_default_data WHERE locale = ?', $locale
145  );
146  }
147 
155  function defaultTemplateIsInstalled($key) {
156  $result = $this->retrieve(
157  'SELECT COUNT(*)
158  FROM email_templates_default
159  WHERE email_key = ?',
160  $key
161  );
162  $returner = isset($result->fields[0]) && $result->fields[0] != 0;
163  $result->Close();
164  return $returner;
165  }
166 
171  function getMainEmailTemplatesFilename() {
172  return 'registry/emailTemplates.xml';
173  }
174 
189  function installEmailTemplates($templatesFile, $locales = array(), $returnSql = false, $emailKey = null, $skipExisting = false) {
190  $xmlDao = new XMLDAO();
191  $sql = array();
192  $data = $xmlDao->parseStruct($templatesFile, array('email'));
193  if (!isset($data['email'])) return false;
194  foreach ($data['email'] as $entry) {
195  $attrs = $entry['attributes'];
196  if ($emailKey && $emailKey != $attrs['key']) continue;
197  if ($skipExisting && $this->defaultTemplateIsInstalled($attrs['key'])) continue;
198  $dataSource = $this->getDataSource();
199  $sql[] = 'DELETE FROM email_templates_default WHERE email_key = ' . $dataSource->qstr($attrs['key']);
200  if (!$returnSql) {
201  $this->update(array_shift($sql));
202  }
203  $sql[] = 'INSERT INTO email_templates_default
204  (email_key, can_disable, can_edit, from_role_id, to_role_id, stage_id)
205  VALUES
206  (' .
207  $dataSource->qstr($attrs['key']) . ', ' .
208  ($attrs['can_disable']?1:0) . ', ' .
209  ($attrs['can_edit']?1:0) . ', ' .
210  (isset($attrs['from_role_id'])?((int) $attrs['from_role_id']):'null') . ', ' .
211  (isset($attrs['to_role_id'])?((int) $attrs['to_role_id']):'null') . ', ' .
212  (isset($attrs['stage_id'])?((int) $attrs['stage_id']):'null') .
213  ")";
214  if (!$returnSql) {
215  $this->update(array_shift($sql));
216  }
217 
218  // Add localized data
219  $additionalQueries = $this->installEmailTemplateLocaleData($templatesFile, $locales, $returnSql, $attrs['key']);
220  if ($returnSql) $sql = array_merge($sql, $additionalQueries);
221  }
222  if ($returnSql) return $sql;
223  return true;
224  }
225 
238  function installEmailTemplateLocaleData($templatesFile, $locales = array(), $returnSql = false, $emailKey = null) {
239  $xmlDao = new XMLDAO();
240  $sql = array();
241  $data = $xmlDao->parseStruct($templatesFile, array('email'));
242  if (!isset($data['email'])) return false;
243  $dataSource = $this->getDataSource();
244  foreach ($data['email'] as $entry) {
245  $attrs = $entry['attributes'];
246  if ($emailKey && $emailKey != $attrs['key']) continue;
247 
248  $subject = $attrs['subject']??null;
249  $body = $attrs['body']??null;
250  $description = $attrs['description']??null;
251  if ($subject && $body) foreach ($locales as $locale) {
252  $sql[] = 'DELETE FROM email_templates_default_data WHERE email_key = ' . $dataSource->qstr($attrs['key']) . ' AND locale = ' . $dataSource->qstr($locale);
253  if (!$returnSql) {
254  $this->update(array_shift($sql));
255  }
256 
257  $keyNotFoundHandler = function($key) {
258  return null;
259  };
260  $translatedSubject = __($subject, [], $locale, $keyNotFoundHandler);
261  $translatedBody = __($body, [], $locale, $keyNotFoundHandler);
262  if ($translatedSubject !== null && $translatedBody !== null) {
263  $sql[] = 'INSERT INTO email_templates_default_data
264  (email_key, locale, subject, body, description)
265  VALUES
266  (' .
267  $dataSource->qstr($attrs['key']) . ', ' .
268  $dataSource->qstr($locale) . ', ' .
269  $dataSource->qstr($translatedSubject) . ', ' .
270  $dataSource->qstr($translatedBody) . ', ' .
271  $dataSource->qstr(__($description, [], $locale)) .
272  ")";
273  if (!$returnSql) {
274  $this->update(array_shift($sql));
275  }
276  }
277  }
278  }
279  if ($returnSql) return $sql;
280  return true;
281  }
282 
296  function installEmailTemplateData($templateDataFile, $locale, $returnSql = false, $emailKey = null) {
297  $xmlDao = new XMLDAO();
298  $sql = array();
299  $data = $xmlDao->parse($templateDataFile, array('email_texts', 'email_text', 'subject', 'body', 'description'));
300  if (!$data) return false;
301 
302  foreach ($data->getChildren() as $emailNode) {
303  $subject = $emailNode->getChildValue('subject');
304  $body = $emailNode->getChildValue('body');
305  $description = $emailNode->getChildValue('description');
306 
307  // Translate variable contents
308  foreach (array(&$subject, &$body, &$description) as &$var) {
309  $var = preg_replace_callback('{{translate key="([^"]+)"}}', function($matches) {
310  return __($matches[1], array(), $locale);
311  }, $var);
312  }
313 
314  if ($emailKey && $emailKey != $emailNode->getAttribute('key')) continue;
315  $dataSource = $this->getDataSource();
316  $sql[] = 'DELETE FROM email_templates_default_data WHERE email_key = ' . $dataSource->qstr($emailNode->getAttribute('key')) . ' AND locale = ' . $dataSource->qstr($locale);
317  if (!$returnSql) {
318  $this->update(array_shift($sql));
319  }
320 
321  $sql[] = 'INSERT INTO email_templates_default_data
322  (email_key, locale, subject, body, description)
323  VALUES
324  (' .
325  $dataSource->qstr($emailNode->getAttribute('key')) . ', ' .
326  $dataSource->qstr($locale) . ', ' .
327  $dataSource->qstr($subject) . ', ' .
328  $dataSource->qstr($body) . ', ' .
329  $dataSource->qstr($description) .
330  ")";
331  if (!$returnSql) {
332  $this->update(array_shift($sql));
333  }
334  }
335  if ($returnSql) return $sql;
336  return true;
337  }
338 }
EmailTemplateDAO
Operations for retrieving and modifying Email Template objects.
Definition: EmailTemplateDAO.inc.php:21
XMLDAO
Operations for retrieving and modifying objects from an XML data source.
Definition: XMLDAO.inc.php:19
EmailTemplateDAO\updateObject
updateObject($object)
Definition: EmailTemplateDAO.inc.php:78
EmailTemplateDAO\installEmailTemplateLocaleData
installEmailTemplateLocaleData($templatesFile, $locales=array(), $returnSql=false, $emailKey=null)
Definition: EmailTemplateDAO.inc.php:241
EmailTemplateDAO\$tableName
$tableName
Definition: EmailTemplateDAO.inc.php:26
EmailTemplateDAO\insertObject
insertObject($object)
Definition: EmailTemplateDAO.inc.php:60
EmailTemplateDAO\$settingsTableName
$settingsTableName
Definition: EmailTemplateDAO.inc.php:29
DAO\retrieve
& retrieve($sql, $params=false, $callHooks=true)
Definition: DAO.inc.php:85
EmailTemplateDAO\deleteEmailTemplatesByLocale
deleteEmailTemplatesByLocale($locale)
Definition: EmailTemplateDAO.inc.php:135
DAO\convertFromDB
convertFromDB($value, $type)
Definition: DAO.inc.php:341
EmailTemplateDAO\$primaryKeyColumn
$primaryKeyColumn
Definition: EmailTemplateDAO.inc.php:32
EmailTemplate
Describes basic email template properties.
Definition: EmailTemplate.inc.php:17
EmailTemplateDAO\installEmailTemplates
installEmailTemplates($templatesFile, $locales=array(), $returnSql=false, $emailKey=null, $skipExisting=false)
Definition: EmailTemplateDAO.inc.php:192
EmailTemplateDAO\$primaryTableColumns
$primaryTableColumns
Definition: EmailTemplateDAO.inc.php:38
EmailTemplateDAO\getMainEmailTemplatesFilename
getMainEmailTemplatesFilename()
Definition: EmailTemplateDAO.inc.php:174
EmailTemplateDAO\_fromRow
_fromRow($primaryRow)
Definition: EmailTemplateDAO.inc.php:99
EmailTemplateDAO\newDataObject
newDataObject()
Definition: EmailTemplateDAO.inc.php:53
EmailTemplateDAO\installEmailTemplateData
installEmailTemplateData($templateDataFile, $locale, $returnSql=false, $emailKey=null)
Definition: EmailTemplateDAO.inc.php:299
EmailTemplateDAO\defaultTemplateIsInstalled
defaultTemplateIsInstalled($key)
Definition: EmailTemplateDAO.inc.php:158
EmailTemplateDAO\deleteDefaultEmailTemplatesByLocale
deleteDefaultEmailTemplatesByLocale($locale)
Definition: EmailTemplateDAO.inc.php:145
EmailTemplateDAO\$schemaName
$schemaName
Definition: EmailTemplateDAO.inc.php:23
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
installEmailTemplates
Definition: installEmailTemplate.php:20