vendor/pimcore/pimcore/lib/Workflow/EventSubscriber/NotificationSubscriber.php line 95

Open in your IDE?
  1. <?php
  2. /**
  3. * Pimcore
  4. *
  5. * This source file is available under two different licenses:
  6. * - GNU General Public License version 3 (GPLv3)
  7. * - Pimcore Commercial License (PCL)
  8. * Full copyright and license information is available in
  9. * LICENSE.md which is distributed with this source code.
  10. *
  11. * @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12. * @license http://www.pimcore.org/license GPLv3 and PCL
  13. */
  14. namespace Pimcore\Workflow\EventSubscriber;
  15. use Pimcore\Model\DataObject\Concrete;
  16. use Pimcore\Model\Element\ElementInterface;
  17. use Pimcore\Model\Element\Service;
  18. use Pimcore\Model\Element\ValidationException;
  19. use Pimcore\Workflow;
  20. use Pimcore\Workflow\Notification\NotificationEmailService;
  21. use Pimcore\Workflow\Transition;
  22. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  23. use Symfony\Component\Workflow\Event\Event;
  24. use Symfony\Contracts\Translation\TranslatorInterface;
  25. /**
  26. * @internal
  27. */
  28. class NotificationSubscriber implements EventSubscriberInterface
  29. {
  30. const MAIL_TYPE_TEMPLATE = 'template';
  31. const MAIL_TYPE_DOCUMENT = 'pimcore_document';
  32. const NOTIFICATION_CHANNEL_MAIL = 'mail';
  33. const NOTIFICATION_CHANNEL_PIMCORE_NOTIFICATION = 'pimcore_notification';
  34. const DEFAULT_MAIL_TEMPLATE_PATH = '@PimcoreCore/Workflow/NotificationEmail/notificationEmail.html.twig';
  35. /**
  36. * @var NotificationEmailService
  37. */
  38. protected $mailService;
  39. /**
  40. * @var Workflow\Notification\PimcoreNotificationService
  41. */
  42. protected $pimcoreNotificationService;
  43. /**
  44. * @var TranslatorInterface
  45. */
  46. protected $translator;
  47. /**
  48. * @var bool
  49. */
  50. protected $enabled = true;
  51. /**
  52. * @var Workflow\ExpressionService
  53. */
  54. protected $expressionService;
  55. /**
  56. * @var Workflow\Manager
  57. */
  58. protected $workflowManager;
  59. /**
  60. * @param NotificationEmailService $mailService
  61. * @param Workflow\Notification\PimcoreNotificationService $pimcoreNotificationService
  62. * @param TranslatorInterface $translator
  63. * @param Workflow\ExpressionService $expressionService
  64. * @param Workflow\Manager $workflowManager
  65. */
  66. public function __construct(NotificationEmailService $mailService, Workflow\Notification\PimcoreNotificationService $pimcoreNotificationService, TranslatorInterface $translator, Workflow\ExpressionService $expressionService, Workflow\Manager $workflowManager)
  67. {
  68. $this->mailService = $mailService;
  69. $this->pimcoreNotificationService = $pimcoreNotificationService;
  70. $this->translator = $translator;
  71. $this->expressionService = $expressionService;
  72. $this->workflowManager = $workflowManager;
  73. }
  74. /**
  75. * @param Event $event
  76. *
  77. * @throws ValidationException
  78. */
  79. public function onWorkflowCompleted(Event $event)
  80. {
  81. if (!$this->checkEvent($event)) {
  82. return;
  83. }
  84. /** @var ElementInterface $subject */
  85. $subject = $event->getSubject();
  86. /** @var Transition $transition */
  87. $transition = $event->getTransition();
  88. $workflow = $this->workflowManager->getWorkflowByName($event->getWorkflowName());
  89. $notificationSettings = $transition->getNotificationSettings();
  90. foreach ($notificationSettings as $notificationSetting) {
  91. $condition = $notificationSetting['condition'] ?? null;
  92. if (empty($condition) || $this->expressionService->evaluateExpression($workflow, $subject, $condition)) {
  93. $notifyUsers = $notificationSetting['notifyUsers'] ?? [];
  94. $notifyRoles = $notificationSetting['notifyRoles'] ?? [];
  95. if (in_array(self::NOTIFICATION_CHANNEL_MAIL, $notificationSetting['channelType'])) {
  96. $this->handleNotifyPostWorkflowEmail($transition, $workflow, $subject, $notificationSetting['mailType'], $notificationSetting['mailPath'], $notifyUsers, $notifyRoles);
  97. }
  98. if (in_array(self::NOTIFICATION_CHANNEL_PIMCORE_NOTIFICATION, $notificationSetting['channelType'])) {
  99. $this->handleNotifyPostWorkflowPimcoreNotification($transition, $workflow, $subject, $notifyUsers, $notifyRoles);
  100. }
  101. }
  102. }
  103. }
  104. /**
  105. * @param Transition $transition
  106. * @param \Symfony\Component\Workflow\Workflow $workflow
  107. * @param ElementInterface $subject
  108. * @param string $mailType
  109. * @param string $mailPath
  110. * @param array $notifyUsers
  111. * @param array $notifyRoles
  112. */
  113. private function handleNotifyPostWorkflowEmail(Transition $transition, \Symfony\Component\Workflow\Workflow $workflow, ElementInterface $subject, string $mailType, string $mailPath, array $notifyUsers, array $notifyRoles)
  114. {
  115. //notify users
  116. $subjectType = ($subject instanceof Concrete ? $subject->getClassName() : Service::getElementType($subject));
  117. $this->mailService->sendWorkflowEmailNotification(
  118. $notifyUsers,
  119. $notifyRoles,
  120. $workflow,
  121. $subjectType,
  122. $subject,
  123. $transition->getLabel(),
  124. $mailType,
  125. $mailPath
  126. );
  127. }
  128. /**
  129. * @param Transition $transition
  130. * @param \Symfony\Component\Workflow\Workflow $workflow
  131. * @param ElementInterface $subject
  132. * @param array $notifyUsers
  133. * @param array $notifyRoles
  134. */
  135. private function handleNotifyPostWorkflowPimcoreNotification(Transition $transition, \Symfony\Component\Workflow\Workflow $workflow, ElementInterface $subject, array $notifyUsers, array $notifyRoles)
  136. {
  137. $subjectType = ($subject instanceof Concrete ? $subject->getClassName() : Service::getElementType($subject));
  138. $this->pimcoreNotificationService->sendPimcoreNotification(
  139. $notifyUsers,
  140. $notifyRoles,
  141. $workflow,
  142. $subjectType,
  143. $subject,
  144. $transition->getLabel()
  145. );
  146. }
  147. /**
  148. * check's if the event subscriber should be executed
  149. *
  150. * @param Event $event
  151. *
  152. * @return bool
  153. */
  154. private function checkEvent(Event $event): bool
  155. {
  156. return $this->isEnabled()
  157. && $event->getTransition() instanceof Transition
  158. && $event->getSubject() instanceof ElementInterface;
  159. }
  160. /**
  161. * @return bool
  162. */
  163. public function isEnabled(): bool
  164. {
  165. return $this->enabled;
  166. }
  167. /**
  168. * @param bool $enabled
  169. */
  170. public function setEnabled(bool $enabled): void
  171. {
  172. $this->enabled = $enabled;
  173. }
  174. public static function getSubscribedEvents(): array
  175. {
  176. return [
  177. 'workflow.completed' => ['onWorkflowCompleted', 0],
  178. ];
  179. }
  180. }