Open Journal Systems  3.3.0
PKPEmailTemplateService.inc.php
1 <?php
15 namespace PKP\Services;
16 
17 use \Application;
18 use \DAOResultFactory;
19 use \DAORegistry;
20 use \DBResultRange;
21 use \HookRegistry;
22 use \Services;
23 use \PKP\Services\interfaces\EntityPropertyInterface;
24 use \PKP\Services\interfaces\EntityReadInterface;
25 use \PKP\Services\interfaces\EntityWriteInterface;
26 use \PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder;
27 
28 define('EMAIL_TEMPLATE_STAGE_DEFAULT', 0);
29 
30 import('lib.pkp.classes.db.DBResultRange');
31 
32 class PKPEmailTemplateService implements EntityPropertyInterface, EntityReadInterface, EntityWriteInterface {
33 
39  public function get($emailTemplateId) {
40  throw new \Exception('Use the PKPEmailTemplateService::getByKey() method to retrieve an email template.');
41  }
42 
55  public function getByKey($contextId, $key) {
56  $emailTemplateQB = new PKPEmailTemplateQueryBuilder();
57  $emailTemplateQueryParts = $emailTemplateQB
58  ->filterByContext($contextId)
59  ->filterByKeys([$key])
60  ->getCompiledQuery();
61  $emailTemplateDao = DAORegistry::getDAO('EmailTemplateDAO'); /* @var $emailTemplateDao EmailTemplateDAO */
62  $result = $emailTemplateDao->retrieve($emailTemplateQueryParts[0], $emailTemplateQueryParts[1]);
63  if ($result->RecordCount() !== 0) {
64  $emailTemplate = $emailTemplateDao->_fromRow($result->GetRowAssoc(false));
65  }
66  $result->Close();
67  return !empty($emailTemplate) ? $emailTemplate : null;
68  }
69 
73  public function getCount($args = []) {
74  return $this->getQueryBuilder($args)->getCount();
75  }
76 
80  public function getIds($args = []) {
81  throw new \Exception('PKPEmailTemplateService::getIds() is not supported. Email templates should be referenced by key instead of id.');
82  }
83 
96  public function getMany($args = []) {
97  $emailTemplateQueryParts = $this->getQueryBuilder($args)->getCompiledQuery();
98  $emailTemplateDao = DAORegistry::getDAO('EmailTemplateDAO'); /* @var $emailTemplateDao EmailTemplateDAO */
99  $result = $emailTemplateDao->retrieveRange($emailTemplateQueryParts[0], $emailTemplateQueryParts[1]);
100  $queryResults = new DAOResultFactory($result, $emailTemplateDao, '_fromRow');
101 
102  return $queryResults->toIterator();
103  }
104 
108  public function getMax($args = []) {
109  // Count/offset is not supported so getMax is always
110  // the same as getCount
111  return $this->getCount();
112  }
113 
118  public function getQueryBuilder($args = []) {
119  $context = Application::get()->getRequest()->getContext();
120 
121  $defaultArgs = array(
122  'contextId' => $context ? $context->getId() : CONTEXT_SITE,
123  'isEnabled' => null,
124  'isCustom' => null,
125  'fromRoleIds' => null,
126  'toRoleIds' => null,
127  'stageIds' => null,
128  'searchPhrase' => null,
129  );
130 
131  $args = array_merge($defaultArgs, $args);
132 
133  $emailTemplateQB = new PKPEmailTemplateQueryBuilder();
134  $emailTemplateQB
135  ->filterByContext($args['contextId'])
136  ->filterByIsEnabled($args['isEnabled'])
137  ->filterByIsCustom($args['isCustom'])
138  ->filterByFromRoleIds($args['fromRoleIds'])
139  ->filterByToRoleIds($args['toRoleIds'])
140  ->filterByStageIds($args['stageIds'])
141  ->searchPhrase($args['searchPhrase']);
142 
143  HookRegistry::call('EmailTemplate::getMany::queryBuilder', array($emailTemplateQB, $args));
144 
145  return $emailTemplateQB;
146  }
147 
151  public function getProperties($emailTemplate, $props, $args = null) {
152 
153  $values = array();
154 
155  foreach ($props as $prop) {
156  switch ($prop) {
157  case '_href':
158  if ($emailTemplate->getData('contextId')) {
159  $context = Services::get('context')->get($emailTemplate->getData('contextId'));
160  } else {
161  $context = $args['request']->getContext();
162  }
163  $values[$prop] = $args['request']->getDispatcher()->url(
164  $args['request'],
165  ROUTE_API,
166  $context->getData('urlPath'),
167  'emailTemplates/' . $emailTemplate->getData('key')
168  );
169  break;
170  default:
171  $values[$prop] = $emailTemplate->getData($prop);
172  break;
173  }
174  }
175 
176  if ($args['supportedLocales']) {
177  $values = Services::get('schema')->addMissingMultilingualValues(SCHEMA_EMAIL_TEMPLATE, $values, $args['supportedLocales']);
178  }
179 
180  HookRegistry::call('EmailTemplate::getProperties', array(&$values, $emailTemplate, $props, $args));
181 
182  ksort($values);
183 
184  return $values;
185  }
186 
190  public function getSummaryProperties($emailTemplate, $args = null) {
191  $props = Services::get('schema')->getSummaryProps(SCHEMA_EMAIL_TEMPLATE);
192 
193  return $this->getProperties($emailTemplate, $props, $args);
194  }
195 
199  public function getFullProperties($emailTemplate, $args = null) {
200  $props = Services::get('schema')->getFullProps(SCHEMA_EMAIL_TEMPLATE);
201 
202  return $this->getProperties($emailTemplate, $props, $args);
203  }
204 
208  public function validate($action, $props, $allowedLocales, $primaryLocale) {
209  $schemaService = Services::get('schema');
210 
211  import('lib.pkp.classes.validation.ValidatorFactory');
212  $validator = \ValidatorFactory::make(
213  $props,
214  $schemaService->getValidationRules(SCHEMA_EMAIL_TEMPLATE, $allowedLocales)
215  );
216 
218  LOCALE_COMPONENT_PKP_MANAGER,
219  LOCALE_COMPONENT_APP_MANAGER
220  );
221 
222  // Check required fields
224  $validator,
225  $action,
226  $schemaService->getRequiredProps(SCHEMA_EMAIL_TEMPLATE),
227  $schemaService->getMultilingualProps(SCHEMA_EMAIL_TEMPLATE),
228  $allowedLocales,
229  $primaryLocale
230  );
231 
232  if ($action === VALIDATE_ACTION_ADD) {
233 
234  // Require a context id
235  $validator->after(function($validator) use ($props) {
236  if (!isset($props['contextId'])) {
237  $validator->errors()->add('contextId', __('manager.emails.emailTemplate.contextRequired'));
238  }
239  });
240 
241  // Don't allow duplicate keys in the same context
242  $validator->after(function($validator) use ($props) {
243  if (!isset($props['contextId'])) {
244  return;
245  }
246  $existingEmailTemplate = $this->getByKey($props['contextId'], $props['key']);
247  if (!empty($existingEmailTemplate) && !empty($existingEmailTemplate->getData('id'))) {
248  $validator->errors()->add('key', __('manager.emails.emailTemplate.noDuplicateKeys'));
249  }
250  });
251  }
252 
253  // Check for input from disallowed locales
254  \ValidatorFactory::allowedLocales($validator, $schemaService->getMultilingualProps(SCHEMA_EMAIL_TEMPLATE), $allowedLocales);
255 
256  if ($validator->fails()) {
257  $errors = $schemaService->formatValidationErrors($validator->errors(), $schemaService->get(SCHEMA_EMAIL_TEMPLATE), $allowedLocales);
258  }
259 
260  HookRegistry::call('EmailTemplate::validate', array(&$errors, $action, $props, $allowedLocales, $primaryLocale));
261 
262  return $errors;
263  }
264 
268  public function add($emailTemplate, $request) {
269  if ($emailTemplate->getData('contextId')) {
270  $contextId = $emailTemplate->getData('contextId');
271  } else {
272  $context = $request->getContext();
273  $contextId = $context ? $context->getId() : CONTEXT_SITE;
274  }
275 
276  $emailTemplateDao = DAORegistry::getDAO('EmailTemplateDAO'); /* @var $emailTemplateDao EmailTemplateDAO */
277  $emailTemplateDao->insertObject($emailTemplate);
278  $emailTemplate = $this->getByKey($contextId, $emailTemplate->getData('key'));
279 
280  HookRegistry::call('EmailTemplate::add', array($emailTemplate, $request));
281 
282  return $emailTemplate;
283  }
284 
288  public function edit($emailTemplate, $params, $request) {
289  $emailTemplateDao = DAORegistry::getDAO('EmailTemplateDAO'); /* @var $emailTemplateDao EmailTemplateDAO */
290  $newEmailTemplate = $emailTemplateDao->newDataObject();
291  $newEmailTemplate->_data = array_merge($emailTemplate->_data, $params);
292 
293  HookRegistry::call('EmailTemplate::edit', array($newEmailTemplate, $emailTemplate, $params, $request));
294 
295  $emailTemplateKey = $emailTemplate->getData('key');
296 
297  // When editing a default template for the first time, we must insert a new entry
298  // in the email_templates table.
299  if ($newEmailTemplate->getData('id')) {
300  $emailTemplateDao->updateObject($newEmailTemplate);
301  } else {
302  $emailTemplateDao->insertObject($newEmailTemplate);
303  }
304 
305  if ($newEmailTemplate->getData('contextId')) {
306  $contextId = $newEmailTemplate->getData('contextId');
307  } else {
308  $context = $request->getContext();
309  $contextId = $context ? $context->getId() : CONTEXT_SITE;
310  }
311 
312  $newEmailTemplate = $this->getByKey($contextId, $newEmailTemplate->getData('key'));
313 
314  return $newEmailTemplate;
315  }
316 
320  public function delete($emailTemplate) {
321  HookRegistry::call('EmailTemplate::delete::before', array($emailTemplate));
322  $emailTemplateDao = DAORegistry::getDAO('EmailTemplateDAO'); /* @var $emailTemplateDao EmailTemplateDAO */
323  $emailTemplateDao->deleteObject($emailTemplate);
324  HookRegistry::call('EmailTemplate::delete', array($emailTemplate));
325  }
326 
333  public function restoreDefaults($contextId) {
334  $emailTemplateQB = new PKPEmailTemplateQueryBuilder();
335  $emailTemplateQB->filterByContext($contextId);
336  $emailTemplateQO = $emailTemplateQB->getModified();
337  $emailTemplateDao = DAORegistry::getDAO('EmailTemplateDAO'); /* @var $emailTemplateDao EmailTemplateDAO */
338  $result = $emailTemplateDao->retrieve($emailTemplateQO->toSql(), $emailTemplateQO->getBindings());
339  $queryResults = new DAOResultFactory($result, $emailTemplateDao, '_fromRow');
340  $deletedKeys = [];
341  while ($emailTemplate = $queryResults->next()) {
342  $deletedKeys[] = $emailTemplate->getData('key');
343  $this->delete($emailTemplate);
344  }
345  HookRegistry::call('EmailTemplate::restoreDefaults', array(&$deletedKeys, $contextId));
346  return $deletedKeys;
347  }
348 }
PKP\Services
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
DAOResultFactory
Wrapper around ADORecordSet providing "factory" features for generating objects from DAOs.
Definition: DAOResultFactory.inc.php:21
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder
Definition: PKPEmailTemplateQueryBuilder.inc.php:20
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
PKP\Services\PKPEmailTemplateService\getMax
getMax($args=[])
Definition: PKPEmailTemplateService.inc.php:108
PKP\Services\PKPEmailTemplateService\getMany
getMany($args=[])
Definition: PKPEmailTemplateService.inc.php:96
ValidatorFactory\allowedLocales
static allowedLocales($validator, $multilingualProps, $allowedLocales)
Definition: ValidatorFactory.inc.php:320
PKP\Services\PKPEmailTemplateService\add
add($emailTemplate, $request)
Definition: PKPEmailTemplateService.inc.php:268
ValidatorFactory\required
static required($validator, $action, $requiredProps, $multilingualProps, $allowedLocales, $primaryLocale)
Definition: ValidatorFactory.inc.php:261
PKP\Services\PKPEmailTemplateService\getProperties
getProperties($emailTemplate, $props, $args=null)
Definition: PKPEmailTemplateService.inc.php:151
PKP\Services\PKPEmailTemplateService\getIds
getIds($args=[])
Definition: PKPEmailTemplateService.inc.php:80
PKP\Services\PKPEmailTemplateService\getFullProperties
getFullProperties($emailTemplate, $args=null)
Definition: PKPEmailTemplateService.inc.php:199
PKP\Services\SCHEMA_EMAIL_TEMPLATE
const SCHEMA_EMAIL_TEMPLATE
Definition: PKPSchemaService.inc.php:20
PKP\Services\PKPEmailTemplateService\validate
validate($action, $props, $allowedLocales, $primaryLocale)
Definition: PKPEmailTemplateService.inc.php:208
ValidatorFactory\make
static make($props, $rules, $messages=[])
Definition: ValidatorFactory.inc.php:38
PKP\Services\PKPEmailTemplateService\edit
edit($emailTemplate, $params, $request)
Definition: PKPEmailTemplateService.inc.php:288
PKP\Services\PKPEmailTemplateService\getQueryBuilder
getQueryBuilder($args=[])
Definition: PKPEmailTemplateService.inc.php:118
PKP\Services\PKPEmailTemplateService
Definition: PKPEmailTemplateService.inc.php:32
PKP\Services\PKPEmailTemplateService\restoreDefaults
restoreDefaults($contextId)
Definition: PKPEmailTemplateService.inc.php:333
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
HookRegistry\call
static call($hookName, $args=null)
Definition: HookRegistry.inc.php:86
PKP\Services\PKPEmailTemplateService\getByKey
getByKey($contextId, $key)
Definition: PKPEmailTemplateService.inc.php:55
PKP\Services\PKPEmailTemplateService\getCount
getCount($args=[])
Definition: PKPEmailTemplateService.inc.php:73
PKP\Services\PKPEmailTemplateService\getSummaryProperties
getSummaryProperties($emailTemplate, $args=null)
Definition: PKPEmailTemplateService.inc.php:190
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49