From 6cfb0ad09db198a8c2c1c8d505543f0b23eed5df Mon Sep 17 00:00:00 2001 From: Nicklas Mantek Date: Fri, 11 Jul 2025 12:04:24 +0200 Subject: [PATCH 1/4] add ability to override email settings in condition blocks --- Classes/Controller/FormController.php | 82 ++++++++++++++++--- .../GeneralOptions/ConditionBlockModel.php | 4 +- 2 files changed, 74 insertions(+), 12 deletions(-) diff --git a/Classes/Controller/FormController.php b/Classes/Controller/FormController.php index 0992d17f..05fef965 100644 --- a/Classes/Controller/FormController.php +++ b/Classes/Controller/FormController.php @@ -21,6 +21,7 @@ use TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder; use Typoheads\Formhandler\Definitions\FormhandlerExtensionConfig; use Typoheads\Formhandler\Definitions\Severity; +use Typoheads\Formhandler\Domain\Model\Config\Finisher\MailFinisherModel; use Typoheads\Formhandler\Domain\Model\Config\FormModel; use Typoheads\Formhandler\Domain\Model\Config\FormUpload; use Typoheads\Formhandler\Domain\Model\Config\FormUploadFile; @@ -501,6 +502,38 @@ public function formAction(): ResponseInterface { return $this->htmlResponse(); } + /** + * @param array $valuesToSet + */ + private function emailOverride(array $valuesToSet): void { + /** @var false|MailFinisherModel */ + $emailFinisher = array_filter($this->formConfig->finishers, function ($finisher) { + return $finisher instanceof MailFinisherModel; + })[0] ?? false; + + if (!$emailFinisher) { + return; + } + + // user mail conf + if (is_array($valuesToSet['user'] ?? false)) { + foreach ($valuesToSet['user'] as $key => $value) { + if (isset($emailFinisher->userMailConfig[strval($key)])) { + $emailFinisher->userMailConfig[strval($key)] = strval($value); + } + } + } + + // admin mail conf + if (is_array($valuesToSet['admin'] ?? false)) { + foreach ($valuesToSet['admin'] as $key => $value) { + if (isset($emailFinisher->adminMailConfig[strval($key)])) { + $emailFinisher->adminMailConfig[strval($key)] = strval($value); + } + } + } + } + // TODO: Change return type to new model of Response and Finisher name so headless knows which Finisher returned private function finishers(): ?Response { foreach ($this->formConfig->finishers as $finisher) { @@ -549,8 +582,8 @@ private function formSession(): void { $this->formConfig->step = intval( ( (array) ($this->parsedBody[FormhandlerExtensionConfig::EXTENSION_KEY] ?? []) - )['step'] ?? - $this->formConfig->session->get('step') ?: 1 + )['step'] + ?? $this->formConfig->session->get('step') ?: 1 ); $this->formConfig->formValues = (array) ($this->formConfig->session->get('formValues') ?: []); @@ -674,15 +707,29 @@ private function parseConditionBlocks(): void { foreach ($this->formConfig->conditionBlocks as $conditionBlock) { $evaluation = $utility->conditionEvaluate($conditionBlock, $this->formConfig); + if ($evaluation) { foreach ($conditionBlock->isTrue as $key => $value) { if (empty($value)) { continue; } - if ('disableErrorCheckFields' == $key) { - foreach (explode(',', $value) ?: [] as $disableErrorCheckField) { - $this->formConfig->disableErrorCheckFields[$disableErrorCheckField] = ''; - } + + switch ($key) { + case 'disableErrorCheckFields': + foreach (explode(',', strval($value)) ?: [] as $disableErrorCheckField) { + $this->formConfig->disableErrorCheckFields[$disableErrorCheckField] = ''; + } + + break; + + case 'emailOverride': + case 'emailOverwrite': + $this->emailOverride((array) $value); + + break; + + default: + break; } } } else { @@ -690,14 +737,29 @@ private function parseConditionBlocks(): void { if (empty($value)) { continue; } - if ('disableErrorCheckFields' == $key) { - foreach (explode(',', $value) ?: [] as $disableErrorCheckField) { - $this->formConfig->disableErrorCheckFields[$disableErrorCheckField] = ''; - } + + switch ($key) { + case 'disableErrorCheckFields': + foreach (explode(',', strval($value)) ?: [] as $disableErrorCheckField) { + $this->formConfig->disableErrorCheckFields[$disableErrorCheckField] = ''; + } + + break; + + case 'emailoverride': + case 'emailoverwrite': + $this->emailOverride((array) $value); + + break; + + default: + break; } } } } + + exit; } private function prepareFieldsFileTypesAndRequired(string $fieldNamePath, FieldModel $field): void { diff --git a/Classes/Domain/Model/Config/GeneralOptions/ConditionBlockModel.php b/Classes/Domain/Model/Config/GeneralOptions/ConditionBlockModel.php index 55104924..69cd37c8 100644 --- a/Classes/Domain/Model/Config/GeneralOptions/ConditionBlockModel.php +++ b/Classes/Domain/Model/Config/GeneralOptions/ConditionBlockModel.php @@ -115,10 +115,10 @@ class ConditionBlockModel { /** @var array> */ public readonly array $conditions; - /** @var array */ + /** @var array */ public readonly array $else; - /** @var array */ + /** @var array */ public readonly array $isTrue; /** From 86930ee85b2a2596d07b7035d363ea606eb6f6c3 Mon Sep 17 00:00:00 2001 From: Nicklas Mantek Date: Fri, 11 Jul 2025 12:05:30 +0200 Subject: [PATCH 2/4] remove readonly flag --- Classes/Domain/Model/Config/Finisher/MailFinisherModel.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/Domain/Model/Config/Finisher/MailFinisherModel.php b/Classes/Domain/Model/Config/Finisher/MailFinisherModel.php index 5fd8851d..69ff3b0f 100644 --- a/Classes/Domain/Model/Config/Finisher/MailFinisherModel.php +++ b/Classes/Domain/Model/Config/Finisher/MailFinisherModel.php @@ -31,10 +31,10 @@ */ class MailFinisherModel extends AbstractFinisherModel { /** @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} */ - public readonly array $adminMailConfig; + public array $adminMailConfig; /** @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} */ - public readonly array $userMailConfig; + public array $userMailConfig; private Utility $utility; From 70d5b4a3eaa04b71ae9dba951f164533ce3d615b Mon Sep 17 00:00:00 2001 From: Nicklas Mantek Date: Fri, 11 Jul 2025 12:10:04 +0200 Subject: [PATCH 3/4] fix type --- Classes/Controller/FormController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/Controller/FormController.php b/Classes/Controller/FormController.php index 05fef965..0acaaf56 100644 --- a/Classes/Controller/FormController.php +++ b/Classes/Controller/FormController.php @@ -503,7 +503,7 @@ public function formAction(): ResponseInterface { } /** - * @param array $valuesToSet + * @param array $valuesToSet */ private function emailOverride(array $valuesToSet): void { /** @var false|MailFinisherModel */ From 855a48fe037ad9a569f785f1be8bd3fff26b7c00 Mon Sep 17 00:00:00 2001 From: Nicklas Mantek Date: Fri, 15 Aug 2025 11:03:51 +0200 Subject: [PATCH 4/4] remove exit statement --- Classes/Controller/FormController.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/Classes/Controller/FormController.php b/Classes/Controller/FormController.php index 0acaaf56..7362ea28 100644 --- a/Classes/Controller/FormController.php +++ b/Classes/Controller/FormController.php @@ -758,8 +758,6 @@ private function parseConditionBlocks(): void { } } } - - exit; } private function prepareFieldsFileTypesAndRequired(string $fieldNamePath, FieldModel $field): void {