Open Monograph Press  3.3.0
PKPEmailTemplateQueryBuilder.inc.php
1 <?php
16 
17 use Illuminate\Database\Capsule\Manager as Capsule;
19 
21 
23  protected $contextId = null;
24 
26  protected $isEnabled = null;
27 
29  protected $isCustom = null;
30 
32  protected $fromRoleIds = [];
33 
35  protected $toRoleIds = [];
36 
38  protected $keys = [];
39 
41  protected $searchPhrase = null;
42 
44  protected $stageIds = [];
45 
53  public function filterByContext($contextId) {
54  $this->contextId = $contextId;
55  return $this;
56  }
57 
65  public function filterByIsEnabled($isEnabled) {
66  $this->isEnabled = $isEnabled;
67  return $this;
68  }
69 
77  public function filterByIsCustom($isCustom) {
78  $this->isCustom = $isCustom;
79  return $this;
80  }
81 
89  public function filterByFromRoleIds($fromRoleIds) {
90  $this->fromRoleIds = $fromRoleIds;
91  return $this;
92  }
93 
101  public function filterByToRoleIds($toRoleIds) {
102  $this->toRoleIds = $toRoleIds;
103  return $this;
104  }
105 
113  public function filterByKeys($keys) {
114  $this->keys = $keys;
115  return $this;
116  }
117 
125  public function filterByStageIds($stageIds) {
126  $this->stageIds = $stageIds;
127  return $this;
128  }
129 
137  public function searchPhrase($phrase) {
138  $this->searchPhrase = $phrase;
139  return $this;
140  }
141 
149  public function limitTo($count) {
150  $this->limit = $count;
151  return $this;
152  }
153 
161  public function offsetBy($offset) {
162  $this->offset = $offset;
163  return $this;
164  }
165 
169  public function getIds() {
170  throw new \Exception('PKPEmailTemplateQueryBuilder::getIds() is not supported. Email templates should be referenced by key instead of id.');
171  }
172 
176  public function getCount() {
177  $compiledQuery = $this->getCompiledQuery();
178  return Capsule::table(Capsule::raw('(' . $compiledQuery[0] . ') as email_template_count'))
179  ->setBindings($compiledQuery[1])
180  ->count();
181  }
182 
188  public function getQuery() {
189  throw new \Exception('PKPEmailTemplateQueryBuilder::getQuery() is not supported. Use PKPEmailTemplateQueryBuilder::getCompiledQuery() instead.');
190  }
191 
213  public function getCompiledQuery() {
214  $this->setCommonColumns();
215 
216  $defaultQueryObject = $this->getDefault();
217 
218  // Use a UNION to ensure the query will match rows in email_templates and
219  // email_templates_default. This ensures that custom templates which have
220  // no default in email_templates_default are still returned. These templates
221  // should not be returned when a role filter is used.
222  if (empty($this->fromRoleIds) && empty($this->toRoleIds)) {
223  $customQueryObject = $this->getCustom();
224  return [
225  '(' . $defaultQueryObject->toSql() . ') union (' . $customQueryObject->toSql() . ')',
226  $defaultQueryObject->mergeBindings($customQueryObject)->getBindings(),
227  ];
228  }
229 
230  return [
231  $defaultQueryObject->toSql(),
232  $defaultQueryObject->getBindings(),
233  ];
234  }
235 
246  public function getModified() {
247  $this->setCommonColumns();
248  $q = $this->getCustom();
249  $q->whereNotNull('et.email_id');
250  return $q;
251  }
252 
256  protected function setCommonColumns() {
257  $this->columns = [
258  'etd.can_disable',
259  'etd.can_edit',
260  Capsule::raw('COALESCE(etd.email_key, et.email_key) as email_key'),
261  'etd.from_role_id',
262  'etd.to_role_id',
263  'etd.stage_id',
264  'et.email_id',
265  'et.context_id',
266  Capsule::raw('COALESCE(et.enabled, 1) as enabled'),
267  ];
268  }
269 
276  protected function getDefault() {
277  $q = Capsule::table('email_templates_default as etd')
278  ->orderBy('email_key', 'asc')
279  ->groupBy('etd.email_key')
280  ->groupBy('etd.can_disable')
281  ->groupBy('etd.can_edit')
282  ->groupBy('etd.from_role_id')
283  ->groupBy('etd.to_role_id')
284  ->groupBy('etd.stage_id')
285  ->groupBy('et.email_id');
286 
287  if (!is_null($this->contextId)) {
289  $q->leftJoin('email_templates as et', function ($table) use ($contextId) {
290  $table->on('etd.email_key', '=', 'et.email_key')
291  ->on('et.context_id', '=', Capsule::raw((int) $contextId));
292  });
293  } else {
294  $q->leftJoin('email_templates as et', 'etd.email_key', '=', 'et.email_key');
295  }
296 
297  if (!is_null($this->contextId)) {
299  $q->where(function($q) use ($contextId) {
300  $q->whereNull('et.context_id')
301  ->orWhere('et.context_id', '=', $this->contextId);
302  });
303  }
304 
305  if (!empty($this->isEnabled)) {
306  $q->where(function($q) {
307  // Unmodified default templates are considered enabled
308  $q->whereNull('et.enabled')
309  ->orWhere('et.enabled', '=', 1);
310  });
311  } elseif ($this->isEnabled === false) {
312  $q->where('et.enabled', '!=', 1);
313  }
314 
315  if (!empty($this->isCustom)) {
316  $q->whereNull('etd.can_disable');
317  } elseif ($this->isCustom === false) {
318  $q->whereNotNull('etd.can_disable');
319  }
320 
321  if (!empty($this->fromRoleIds)) {
322  $q->whereIn('etd.from_role_id', $this->fromRoleIds);
323  }
324 
325  if (!empty($this->toRoleIds)) {
326  $q->whereIn('etd.to_role_id', $this->toRoleIds);
327  }
328 
329  if (!empty($this->stageIds)) {
330  if (in_array(EMAIL_TEMPLATE_STAGE_DEFAULT, $this->stageIds)) {
331  $q->whereNull('etd.stage_id')
332  ->orWhereIn('etd.stage_id', $this->stageIds);
333  } else {
334  $q->whereIn('etd.stage_id', $this->stageIds);
335  }
336  }
337 
338  // search phrase
339  if (!empty($this->searchPhrase)) {
340  $words = explode(' ', $this->searchPhrase);
341  if (count($words)) {
342  $q->leftJoin('email_templates_settings as ets', 'et.email_id', '=', 'ets.email_id');
343  $q->leftJoin('email_templates_default_data as etddata', 'etd.email_key', '=', 'etddata.email_key');
344  foreach ($words as $word) {
345  $word = strtolower(addcslashes($word, '%_'));
346  $q->where(function($q) use ($word) {
347  $q->where(Capsule::raw('lower(et.email_key)'), 'LIKE', "%{$word}%")
348  ->orWhere(function($q) use ($word) {
349  $q->where('ets.setting_name', 'subject');
350  $q->where(Capsule::raw('lower(ets.setting_value)'), 'LIKE', "%{$word}%");
351  })
352  ->orWhere(function($q) use ($word) {
353  $q->where('ets.setting_name', 'body');
354  $q->where(Capsule::raw('lower(ets.setting_value)'), 'LIKE', "%{$word}%");
355  })
356  ->orWhere(Capsule::raw('lower(etd.email_key)'), 'LIKE', "%{$word}%")
357  ->orWhere(Capsule::raw('lower(etddata.subject)'), 'LIKE', "%{$word}%")
358  ->orWhere(Capsule::raw('lower(etddata.body)'), 'LIKE', "%{$word}%")
359  ->orWhere(Capsule::raw('lower(etddata.description)'), 'LIKE', "%{$word}%");
360  });
361  }
362  }
363  }
364 
365  if (!empty($this->keys)) {
366  $keys = $this->keys;
367  $q->where(function($q) use ($keys) {
368  $q->whereIn('etd.email_key', $this->keys)
369  ->orWhereIn('et.email_key', $this->keys);
370  });
371  }
372 
373  if (!empty($this->toRoleIds)) {
374  $q->whereIn('etd.to_role_id', $this->toRoleIds);
375  }
376 
377  // Add app-specific query statements
378  \HookRegistry::call('EmailTemplate::getMany::queryObject::default', array($q, $this));
379 
380  $q->select($this->columns);
381 
382  return $q;
383  }
384 
393  protected function getCustom() {
394  $q = Capsule::table('email_templates as et')
395  ->leftJoin('email_templates_default as etd', 'etd.email_key', '=', 'et.email_key');
396 
397  if (!is_null($this->contextId)) {
398  $q->where(function($q) {
399  $q->whereNull('et.context_id')
400  ->orWhere('et.context_id', '=', $this->contextId);
401  });
402  }
403 
404  if (!empty($this->isEnabled)) {
405  $q->where('et.enabled', '=', 1);
406  } elseif ($this->isEnabled === false) {
407  $q->where('et.enabled', '!=', 1);
408  }
409 
410  if (!empty($this->isCustom)) {
411  $q->whereNull('etd.can_disable');
412  } elseif ($this->isCustom === false) {
413  $q->whereNotNull('etd.can_disable');
414  }
415 
416  if (!empty($this->searchPhrase)) {
417  $words = explode(' ', $this->searchPhrase);
418  if (count($words)) {
419  $q->leftJoin('email_templates_settings as ets', 'et.email_id', '=', 'ets.email_id');
420  foreach ($words as $word) {
421  $word = strtolower(addcslashes($word, '%_'));
422  $q->where(function ($q) use ($word) {
423  $q->where(Capsule::raw('lower(et.email_key)'), 'LIKE', "%{$word}%")
424  ->orWhere(function($q) use ($word) {
425  $q->where('ets.setting_name', 'subject');
426  $q->where(Capsule::raw('lower(ets.setting_value)'), 'LIKE', "%{$word}%");
427  })
428  ->orWhere(function($q) use ($word) {
429  $q->where('ets.setting_name', 'body');
430  $q->where(Capsule::raw('lower(ets.setting_value)'), 'LIKE', "%{$word}%");
431  });
432  });
433  }
434  }
435  }
436 
437  if (!empty($this->keys)) {
438  $q->where(function($q) {
439  $q->whereIn('etd.email_key', $this->keys)
440  ->orWhereIn('et.email_key', $this->keys);
441  });
442  }
443 
444  // Add app-specific query statements
445  \HookRegistry::call('EmailTemplate::getMany::queryObject::custom', array($q, $this));
446 
447  $q->select($this->columns);
448 
449  return $q;
450  }
451 }
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\filterByStageIds
filterByStageIds($stageIds)
Definition: PKPEmailTemplateQueryBuilder.inc.php:149
PKP\Services\EMAIL_TEMPLATE_STAGE_DEFAULT
const EMAIL_TEMPLATE_STAGE_DEFAULT
Definition: PKPEmailTemplateService.inc.php:28
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\$contextId
$contextId
Definition: PKPEmailTemplateQueryBuilder.inc.php:26
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\$isCustom
$isCustom
Definition: PKPEmailTemplateQueryBuilder.inc.php:38
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\$fromRoleIds
$fromRoleIds
Definition: PKPEmailTemplateQueryBuilder.inc.php:44
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\filterByIsCustom
filterByIsCustom($isCustom)
Definition: PKPEmailTemplateQueryBuilder.inc.php:101
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder
Definition: PKPEmailTemplateQueryBuilder.inc.php:20
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\filterByKeys
filterByKeys($keys)
Definition: PKPEmailTemplateQueryBuilder.inc.php:137
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\$searchPhrase
$searchPhrase
Definition: PKPEmailTemplateQueryBuilder.inc.php:62
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\getCount
getCount()
Definition: PKPEmailTemplateQueryBuilder.inc.php:200
PKP\Services\QueryBuilders
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\getDefault
getDefault()
Definition: PKPEmailTemplateQueryBuilder.inc.php:300
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\getModified
getModified()
Definition: PKPEmailTemplateQueryBuilder.inc.php:270
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\$toRoleIds
$toRoleIds
Definition: PKPEmailTemplateQueryBuilder.inc.php:50
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\$keys
$keys
Definition: PKPEmailTemplateQueryBuilder.inc.php:56
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\limitTo
limitTo($count)
Definition: PKPEmailTemplateQueryBuilder.inc.php:173
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\setCommonColumns
setCommonColumns()
Definition: PKPEmailTemplateQueryBuilder.inc.php:280
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\offsetBy
offsetBy($offset)
Definition: PKPEmailTemplateQueryBuilder.inc.php:185
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\filterByFromRoleIds
filterByFromRoleIds($fromRoleIds)
Definition: PKPEmailTemplateQueryBuilder.inc.php:113
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\getCustom
getCustom()
Definition: PKPEmailTemplateQueryBuilder.inc.php:417
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\filterByToRoleIds
filterByToRoleIds($toRoleIds)
Definition: PKPEmailTemplateQueryBuilder.inc.php:125
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\filterByContext
filterByContext($contextId)
Definition: PKPEmailTemplateQueryBuilder.inc.php:77
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\searchPhrase
searchPhrase($phrase)
Definition: PKPEmailTemplateQueryBuilder.inc.php:161
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\$stageIds
$stageIds
Definition: PKPEmailTemplateQueryBuilder.inc.php:68
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\getCompiledQuery
getCompiledQuery()
Definition: PKPEmailTemplateQueryBuilder.inc.php:237
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\getIds
getIds()
Definition: PKPEmailTemplateQueryBuilder.inc.php:193
HookRegistry\call
static call($hookName, $args=null)
Definition: HookRegistry.inc.php:86
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\getQuery
getQuery()
Definition: PKPEmailTemplateQueryBuilder.inc.php:212
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\filterByIsEnabled
filterByIsEnabled($isEnabled)
Definition: PKPEmailTemplateQueryBuilder.inc.php:89
PKP\Services\QueryBuilders\Interfaces\EntityQueryBuilderInterface
Definition: EntityQueryBuilderInterface.inc.php:19
PKP\Services\QueryBuilders\PKPEmailTemplateQueryBuilder\$isEnabled
$isEnabled
Definition: PKPEmailTemplateQueryBuilder.inc.php:32