diff --git a/Classes/Domain/Model/Config/Finisher/MailFinisherModel.php b/Classes/Domain/Model/Config/Finisher/MailFinisherModel.php index 5fd8851d..06e189c2 100644 --- a/Classes/Domain/Model/Config/Finisher/MailFinisherModel.php +++ b/Classes/Domain/Model/Config/Finisher/MailFinisherModel.php @@ -39,15 +39,19 @@ class MailFinisherModel extends AbstractFinisherModel { private Utility $utility; /** - * @param array $settings + * @param array $settings + * @param null|array{toEmail: string, subject: string, senderEmail: string, senderName: string, replyToEmail: string, replyToName: string, ccEmail: string, ccName: string, bccEmail: string, bccName: string, returnPath: string, templateMailHtml: string, templateMailText: string, attachments: array, embedFiles: array} $adminMailConfig + * @param null|array{toEmail: string, subject: string, senderEmail: string, senderName: string, replyToEmail: string, replyToName: string, ccEmail: string, ccName: string, bccEmail: string, bccName: string, returnPath: string, templateMailHtml: string, templateMailText: string, attachments: array, embedFiles: array} $userMailConfig */ public function __construct( private readonly array $settings, + ?array $adminMailConfig = null, + ?array $userMailConfig = null, ) { $this->utility = GeneralUtility::makeInstance(Utility::class); $this->returns = filter_var($settings['returns'] ?? false, FILTER_VALIDATE_BOOLEAN); - $this->adminMailConfig = $this->parseEmailTypeSettings(isset($this->settings['admin']) && is_array($this->settings['admin']) ? $this->settings['admin'] : []); - $this->userMailConfig = $this->parseEmailTypeSettings(isset($this->settings['user']) && is_array($this->settings['user']) ? $this->settings['user'] : []); + $this->adminMailConfig = (null !== $adminMailConfig) ? $adminMailConfig : $this->parseEmailTypeSettings(isset($this->settings['admin']) && is_array($this->settings['admin']) ? $this->settings['admin'] : []); + $this->userMailConfig = (null !== $userMailConfig) ? $userMailConfig : $this->parseEmailTypeSettings(isset($this->settings['user']) && is_array($this->settings['user']) ? $this->settings['user'] : []); } public function class(): string { diff --git a/Classes/Domain/Model/Config/Interceptor/EmailOverrideInterceptorConditionBlock.php b/Classes/Domain/Model/Config/Interceptor/EmailOverrideInterceptorConditionBlock.php new file mode 100644 index 00000000..0488cb8c --- /dev/null +++ b/Classes/Domain/Model/Config/Interceptor/EmailOverrideInterceptorConditionBlock.php @@ -0,0 +1,35 @@ +> */ + public readonly array $conditions; + + /** @var array> */ + public readonly array $else; + + /** @var array> */ + public readonly array $isTrue; + + /** + * @param array $settings + */ + public function __construct(array $settings) { + $this->conditions = $settings['conditions'] ?? []; + $this->else = $settings['else'] ?? []; + $this->isTrue = $settings['isTrue'] ?? []; + } +} diff --git a/Classes/Domain/Model/Config/Interceptor/EmailOverrideInterceptorModel.php b/Classes/Domain/Model/Config/Interceptor/EmailOverrideInterceptorModel.php new file mode 100644 index 00000000..a944b89e --- /dev/null +++ b/Classes/Domain/Model/Config/Interceptor/EmailOverrideInterceptorModel.php @@ -0,0 +1,55 @@ + */ + public readonly array $conditonBlocks; + + /** + * @param array $settings + */ + public function __construct(array $settings) { + $this->conditonBlocks = $this->parseConfig($settings); + } + + public function class(): string { + return EmailOverrideInterceptor::class; + } + + /** + * @param array $settings + * + * @return array + */ + protected function parseConfig(array $settings): array { + if (!is_array($settings)) { + return []; + } + + $conditionBlocks = []; + + foreach ($settings as $conditionBlock) { + if (!isset($conditionBlock['conditions']) || (!isset($conditionBlock['isTrue']) && !isset($conditionBlock['else']))) { + continue; + } + + $conditionBlocks[] = GeneralUtility::makeInstance(EmailOverrideInterceptorConditionBlock::class, $conditionBlock); + } + + return $conditionBlocks; + } +} diff --git a/Classes/Finisher/MailFinisher.php b/Classes/Finisher/MailFinisher.php index ce0cb719..7e227686 100644 --- a/Classes/Finisher/MailFinisher.php +++ b/Classes/Finisher/MailFinisher.php @@ -370,7 +370,7 @@ protected function sendMail(array $finisherConfig, MailModel $formConfig, string $mailer = GeneralUtility::makeInstance(Mailer::class); $mailer->send($beforeSendEvent->getEmailObject()); } catch (\Exception $e) { - $this->logger->error($e->getMessage()); + $this->logger?->error($e->getMessage()); $this->formConfig->debugMessage('Mailfinisher Error', [$e->getMessage()], Severity::Error); } diff --git a/Classes/Interceptor/EmailOverrideInterceptor.php b/Classes/Interceptor/EmailOverrideInterceptor.php new file mode 100644 index 00000000..88a0062a --- /dev/null +++ b/Classes/Interceptor/EmailOverrideInterceptor.php @@ -0,0 +1,127 @@ +, embedFiles: array} */ + protected array $adminMailConfig; + + protected bool $returns; + + /** @var array{toEmail: string, subject: string, senderEmail: string, senderName: string, replyToEmail: string, replyToName: string, ccEmail: string, ccName: string, bccEmail: string, bccName: string, returnPath: string, templateMailHtml: string, templateMailText: string, attachments: array, embedFiles: array} */ + protected array $userMailConfig; + + protected Utility $utility; + + public function __construct() { + $this->utility = GeneralUtility::makeInstance(Utility::class); + } + + public function process(FormModel &$formConfig, AbstractInterceptorModel &$interceptorConfig): bool { + if (!$interceptorConfig instanceof EmailOverrideInterceptorModel) { + return false; + } + + /** + * find finisher config by Classname. + * + * @var array $allMailFinisherConfigs + */ + $allMailFinisherConfigs = array_filter($formConfig->finishers, function ($finisher) { + return $finisher instanceof MailFinisherModel; + }); + + if (empty($allMailFinisherConfigs)) { + return false; + } + + $currentFinisherConfig = current($allMailFinisherConfigs); + + $this->adminMailConfig = $currentFinisherConfig->adminMailConfig; + $this->userMailConfig = $currentFinisherConfig->userMailConfig; + $this->returns = $currentFinisherConfig->returns; + + try { + foreach ($interceptorConfig->conditonBlocks as $conditionBlock) { + $evaluation = $this->utility->conditionEvaluate($conditionBlock, $formConfig); + + if ($evaluation) { + foreach ($conditionBlock->isTrue as $emailConfigToAffect => $valuesToSet) { + if (empty($valuesToSet) || ('admin' !== $emailConfigToAffect && 'user' !== $emailConfigToAffect)) { + continue; + } + + $this->handleOverride($emailConfigToAffect, $valuesToSet); + } + } else { + foreach ($conditionBlock->else as $emailConfigToAffect => $valuesToSet) { + if (empty($valuesToSet) || ('admin' !== $emailConfigToAffect && 'user' !== $emailConfigToAffect)) { + continue; + } + + $this->handleOverride($emailConfigToAffect, $valuesToSet); + } + } + } + + // results from array_filter keep their original keys. Use that key to override the config + $formConfig->finishers[key($allMailFinisherConfigs)] = $this->createNewMailConfig(); + } catch (\Exception $e) { + $this->logger?->error($e->getMessage()); + + $formConfig->debugMessage('Mailfinisher Error', [$e->getMessage()], Severity::Error); + + return false; + } + + return true; + } + + protected function createNewMailConfig(): MailFinisherModel { + return GeneralUtility::makeInstance( + MailFinisherModel::class, + ['returns' => $this->returns], + $this->adminMailConfig, + $this->userMailConfig, + ); + } + + /** + * @param array $overrideConfig + */ + protected function handleOverride(string $configToAffect, array $overrideConfig): void { + $configToAffect = &$this->{$configToAffect.'MailConfig'} ?? false; + + if (false === $configToAffect) { + return; + } + + foreach ($overrideConfig as $fieldToOverride => $valueToSet) { + if (array_key_exists($fieldToOverride, $configToAffect)) { + $configToAffect[$fieldToOverride] = strval($valueToSet); + } + } + } +}