From 7dbe8e8da28593bff396a3822cd95115992e7cd7 Mon Sep 17 00:00:00 2001 From: Nicklas Mantek Date: Wed, 20 Aug 2025 11:47:01 +0200 Subject: [PATCH 1/5] add ability to override setting arrays --- .../Domain/Model/Config/Finisher/MailFinisherModel.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Classes/Domain/Model/Config/Finisher/MailFinisherModel.php b/Classes/Domain/Model/Config/Finisher/MailFinisherModel.php index 5fd8851d..7b529844 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 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 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 { From 185ead8f8a7188c825f90413ce67dc19d8c4ac0e Mon Sep 17 00:00:00 2001 From: Nicklas Mantek Date: Wed, 20 Aug 2025 11:47:13 +0200 Subject: [PATCH 2/5] add new condition block model for interceptor --- ...EmailOverrideInterceptorConditionBlock.php | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 Classes/Domain/Model/Config/Interceptor/EmailOverrideInterceptorConditionBlock.php 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'] ?? []; + } +} From ac3424cd3f7433b7d078d89e8199007c2156b7e7 Mon Sep 17 00:00:00 2001 From: Nicklas Mantek Date: Wed, 20 Aug 2025 11:47:24 +0200 Subject: [PATCH 3/5] add email override interceptor --- .../EmailOverrideInterceptorModel.php | 55 ++++++++ .../Interceptor/EmailOverrideInterceptor.php | 122 ++++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 Classes/Domain/Model/Config/Interceptor/EmailOverrideInterceptorModel.php create mode 100644 Classes/Interceptor/EmailOverrideInterceptor.php diff --git a/Classes/Domain/Model/Config/Interceptor/EmailOverrideInterceptorModel.php b/Classes/Domain/Model/Config/Interceptor/EmailOverrideInterceptorModel.php new file mode 100644 index 00000000..665cdf8d --- /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/Interceptor/EmailOverrideInterceptor.php b/Classes/Interceptor/EmailOverrideInterceptor.php new file mode 100644 index 00000000..1e49781b --- /dev/null +++ b/Classes/Interceptor/EmailOverrideInterceptor.php @@ -0,0 +1,122 @@ +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; + }) ?? false; + + if (false === $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() { + return GeneralUtility::makeInstance( + MailFinisherModel::class, + ['returns' => $this->returns], + $this->adminMailConfig, + $this->userMailConfig, + ); + } + + protected function handleOverride(string $configToAffect, $overrideConfig) { + $configToAffect = &$this->{$configToAffect.'MailConfig'} ?? false; + + if (false === $configToAffect) { + return; + } + + foreach ($overrideConfig as $fieldToOverride => $valueToSet) { + if (array_key_exists($fieldToOverride, $configToAffect)) { + $configToAffect[$fieldToOverride] = strval($valueToSet); + } + } + } +} From cd24a3478584dcf446cf72023be7f527280cdc9e Mon Sep 17 00:00:00 2001 From: Nicklas Mantek Date: Wed, 20 Aug 2025 11:56:56 +0200 Subject: [PATCH 4/5] fix phpstan errors --- .../Interceptor/EmailOverrideInterceptorModel.php | 2 +- Classes/Finisher/MailFinisher.php | 2 +- Classes/Interceptor/EmailOverrideInterceptor.php | 15 ++++++++++----- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Classes/Domain/Model/Config/Interceptor/EmailOverrideInterceptorModel.php b/Classes/Domain/Model/Config/Interceptor/EmailOverrideInterceptorModel.php index 665cdf8d..a944b89e 100644 --- a/Classes/Domain/Model/Config/Interceptor/EmailOverrideInterceptorModel.php +++ b/Classes/Domain/Model/Config/Interceptor/EmailOverrideInterceptorModel.php @@ -42,7 +42,7 @@ protected function parseConfig(array $settings): array { $conditionBlocks = []; - foreach ($settings ?? [] as $conditionBlock) { + foreach ($settings as $conditionBlock) { if (!isset($conditionBlock['conditions']) || (!isset($conditionBlock['isTrue']) && !isset($conditionBlock['else']))) { continue; } 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 index 1e49781b..88a0062a 100644 --- a/Classes/Interceptor/EmailOverrideInterceptor.php +++ b/Classes/Interceptor/EmailOverrideInterceptor.php @@ -25,10 +25,12 @@ class EmailOverrideInterceptor extends AbstractInterceptor implements LoggerAwareInterface { use LoggerAwareTrait; + /** @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 $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; @@ -49,9 +51,9 @@ public function process(FormModel &$formConfig, AbstractInterceptorModel &$inter */ $allMailFinisherConfigs = array_filter($formConfig->finishers, function ($finisher) { return $finisher instanceof MailFinisherModel; - }) ?? false; + }); - if (false === $allMailFinisherConfigs) { + if (empty($allMailFinisherConfigs)) { return false; } @@ -87,7 +89,7 @@ public function process(FormModel &$formConfig, AbstractInterceptorModel &$inter // 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()); + $this->logger?->error($e->getMessage()); $formConfig->debugMessage('Mailfinisher Error', [$e->getMessage()], Severity::Error); @@ -97,7 +99,7 @@ public function process(FormModel &$formConfig, AbstractInterceptorModel &$inter return true; } - protected function createNewMailConfig() { + protected function createNewMailConfig(): MailFinisherModel { return GeneralUtility::makeInstance( MailFinisherModel::class, ['returns' => $this->returns], @@ -106,7 +108,10 @@ protected function createNewMailConfig() { ); } - protected function handleOverride(string $configToAffect, $overrideConfig) { + /** + * @param array $overrideConfig + */ + protected function handleOverride(string $configToAffect, array $overrideConfig): void { $configToAffect = &$this->{$configToAffect.'MailConfig'} ?? false; if (false === $configToAffect) { From 84ecfc2d412bd2e05e578618d8adefb6fc0e7144 Mon Sep 17 00:00:00 2001 From: Nicklas Mantek Date: Wed, 20 Aug 2025 12:01:38 +0200 Subject: [PATCH 5/5] fix type --- Classes/Domain/Model/Config/Finisher/MailFinisherModel.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Classes/Domain/Model/Config/Finisher/MailFinisherModel.php b/Classes/Domain/Model/Config/Finisher/MailFinisherModel.php index 7b529844..06e189c2 100644 --- a/Classes/Domain/Model/Config/Finisher/MailFinisherModel.php +++ b/Classes/Domain/Model/Config/Finisher/MailFinisherModel.php @@ -39,9 +39,9 @@ class MailFinisherModel extends AbstractFinisherModel { private Utility $utility; /** - * @param array $settings - * @param 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 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 + * @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,