18 use \DAOResultFactory;
23 use \PKP\Services\interfaces\EntityPropertyInterface;
24 use \PKP\Services\interfaces\EntityReadInterface;
25 use \PKP\Services\interfaces\EntityWriteInterface;
26 use \PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder;
28 define(
'EMAIL_TEMPLATE_STAGE_DEFAULT', 0);
30 import(
'lib.pkp.classes.db.DBResultRange');
39 public function get($emailTemplateId) {
40 throw new \Exception(
'Use the PKPEmailTemplateService::getByKey() method to retrieve an email template.');
57 $emailTemplateQueryParts = $emailTemplateQB
58 ->filterByContext($contextId)
59 ->filterByKeys([$key])
62 $result = $emailTemplateDao->retrieve($emailTemplateQueryParts[0], $emailTemplateQueryParts[1]);
63 if ($result->RecordCount() !== 0) {
64 $emailTemplate = $emailTemplateDao->_fromRow($result->GetRowAssoc(
false));
67 return !empty($emailTemplate) ? $emailTemplate :
null;
81 throw new \Exception(
'PKPEmailTemplateService::getIds() is not supported. Email templates should be referenced by key instead of id.');
97 $emailTemplateQueryParts = $this->
getQueryBuilder($args)->getCompiledQuery();
99 $result = $emailTemplateDao->retrieveRange($emailTemplateQueryParts[0], $emailTemplateQueryParts[1]);
100 $queryResults =
new DAOResultFactory($result, $emailTemplateDao,
'_fromRow');
102 return $queryResults->toIterator();
121 $defaultArgs = array(
122 'contextId' => $context ? $context->getId() : CONTEXT_SITE,
125 'fromRoleIds' =>
null,
128 'searchPhrase' =>
null,
131 $args = array_merge($defaultArgs, $args);
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']);
143 HookRegistry::call(
'EmailTemplate::getMany::queryBuilder', array($emailTemplateQB, $args));
145 return $emailTemplateQB;
155 foreach ($props as $prop) {
158 if ($emailTemplate->getData(
'contextId')) {
159 $context =
Services::get(
'context')->get($emailTemplate->getData(
'contextId'));
161 $context = $args[
'request']->getContext();
163 $values[$prop] = $args[
'request']->getDispatcher()->url(
166 $context->getData(
'urlPath'),
167 'emailTemplates/' . $emailTemplate->getData(
'key')
171 $values[$prop] = $emailTemplate->getData($prop);
176 if ($args[
'supportedLocales']) {
180 HookRegistry::call(
'EmailTemplate::getProperties', array(&$values, $emailTemplate, $props, $args));
208 public function validate($action, $props, $allowedLocales, $primaryLocale) {
211 import(
'lib.pkp.classes.validation.ValidatorFactory');
218 LOCALE_COMPONENT_PKP_MANAGER,
219 LOCALE_COMPONENT_APP_MANAGER
232 if ($action === VALIDATE_ACTION_ADD) {
235 $validator->after(
function($validator) use ($props) {
236 if (!isset($props[
'contextId'])) {
237 $validator->errors()->
add(
'contextId', __(
'manager.emails.emailTemplate.contextRequired'));
242 $validator->after(
function($validator) use ($props) {
243 if (!isset($props[
'contextId'])) {
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'));
256 if ($validator->fails()) {
257 $errors = $schemaService->formatValidationErrors($validator->errors(), $schemaService->get(
SCHEMA_EMAIL_TEMPLATE), $allowedLocales);
260 HookRegistry::call(
'EmailTemplate::validate', array(&$errors, $action, $props, $allowedLocales, $primaryLocale));
268 public function add($emailTemplate, $request) {
269 if ($emailTemplate->getData(
'contextId')) {
270 $contextId = $emailTemplate->getData(
'contextId');
272 $context = $request->getContext();
273 $contextId = $context ? $context->getId() : CONTEXT_SITE;
277 $emailTemplateDao->insertObject($emailTemplate);
278 $emailTemplate = $this->
getByKey($contextId, $emailTemplate->getData(
'key'));
282 return $emailTemplate;
288 public function edit($emailTemplate, $params, $request) {
290 $newEmailTemplate = $emailTemplateDao->newDataObject();
291 $newEmailTemplate->_data = array_merge($emailTemplate->_data, $params);
293 HookRegistry::call(
'EmailTemplate::edit', array($newEmailTemplate, $emailTemplate, $params, $request));
295 $emailTemplateKey = $emailTemplate->getData(
'key');
299 if ($newEmailTemplate->getData(
'id')) {
300 $emailTemplateDao->updateObject($newEmailTemplate);
302 $emailTemplateDao->insertObject($newEmailTemplate);
305 if ($newEmailTemplate->getData(
'contextId')) {
306 $contextId = $newEmailTemplate->getData(
'contextId');
308 $context = $request->getContext();
309 $contextId = $context ? $context->getId() : CONTEXT_SITE;
312 $newEmailTemplate = $this->
getByKey($contextId, $newEmailTemplate->getData(
'key'));
314 return $newEmailTemplate;
320 public function delete($emailTemplate) {
323 $emailTemplateDao->deleteObject($emailTemplate);
335 $emailTemplateQB->filterByContext($contextId);
336 $emailTemplateQO = $emailTemplateQB->getModified();
338 $result = $emailTemplateDao->retrieve($emailTemplateQO->toSql(), $emailTemplateQO->getBindings());
339 $queryResults =
new DAOResultFactory($result, $emailTemplateDao,
'_fromRow');
341 while ($emailTemplate = $queryResults->next()) {
342 $deletedKeys[] = $emailTemplate->getData(
'key');
343 $this->
delete($emailTemplate);
345 HookRegistry::call(
'EmailTemplate::restoreDefaults', array(&$deletedKeys, $contextId));