Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions Classes/Domain/Model/Config/Finisher/MailFinisherModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,19 @@
private Utility $utility;

/**
* @param array<string, mixed> $settings
* @param array<string, mixed> $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<string, array{fileOrField: string, mime: null|string, renameTo: null|string}>, embedFiles: array<string, array{fileOrField: string, mime: null|string, renameTo: null|string}>} $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<string, array{fileOrField: string, mime: null|string, renameTo: null|string}>, embedFiles: array<string, array{fileOrField: string, mime: null|string, renameTo: null|string}>} $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 {
Expand Down Expand Up @@ -104,7 +108,7 @@
$parsedConfig[$option] = $value;
}

return $parsedConfig;

Check failure on line 111 in Classes/Domain/Model/Config/Finisher/MailFinisherModel.php

View workflow job for this annotation

GitHub Actions / phpstan

Method Typoheads\Formhandler\Domain\Model\Config\Finisher\MailFinisherModel::parseEmailTypeSettings() should return array{toEmail: string, subject: string, senderEmail: string, senderName: string, replyToEmail: string, replyToName: string, ccEmail: string, ccName: string, ...} but returns non-empty-array<'attachments'|'bccEmail'|'bccName'|'ccEmail'|'ccName'|'embedFiles'|'replyToEmail'|'replyToName'|'returnPath'|'senderEmail'|'senderName'|'subject'|'templateMailHtml'|'templateMailText'|'toEmail', array<string, array{fileOrField: string, mime: string|null, renameTo: string|null}>|string>.
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

declare(strict_types=1);

/*
* This file is part of TYPO3 CMS-based extension "Formhandler" by JAKOTA.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*/

namespace Typoheads\Formhandler\Domain\Model\Config\Interceptor;

use Typoheads\Formhandler\Domain\Model\Config\GeneralOptions\ConditionBlockModel;

class EmailOverrideInterceptorConditionBlock extends ConditionBlockModel {
/** @var array<string, array<string, string>> */
public readonly array $conditions;

/** @var array<string, array<string, string>> */
public readonly array $else;

/** @var array<string, array<string, string>> */
public readonly array $isTrue;

/**
* @param array<string, mixed> $settings
*/
public function __construct(array $settings) {
$this->conditions = $settings['conditions'] ?? [];
$this->else = $settings['else'] ?? [];
$this->isTrue = $settings['isTrue'] ?? [];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php

declare(strict_types=1);

/*
* This file is part of TYPO3 CMS-based extension "Formhandler" by JAKOTA.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*/

namespace Typoheads\Formhandler\Domain\Model\Config\Interceptor;

use TYPO3\CMS\Core\Utility\GeneralUtility;
use Typoheads\Formhandler\Interceptor\EmailOverrideInterceptor;

class EmailOverrideInterceptorModel extends AbstractInterceptorModel {
/** @var array<EmailOverrideInterceptorConditionBlock> */
public readonly array $conditonBlocks;

/**
* @param array<mixed> $settings
*/
public function __construct(array $settings) {
$this->conditonBlocks = $this->parseConfig($settings);
}

public function class(): string {
return EmailOverrideInterceptor::class;
}

/**
* @param array<mixed> $settings
*
* @return array<EmailOverrideInterceptorConditionBlock>
*/
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;
}
}
2 changes: 1 addition & 1 deletion Classes/Finisher/MailFinisher.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
127 changes: 127 additions & 0 deletions Classes/Interceptor/EmailOverrideInterceptor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
<?php

declare(strict_types=1);

/*
* This file is part of TYPO3 CMS-based extension "Formhandler" by JAKOTA.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*/

namespace Typoheads\Formhandler\Interceptor;

use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerAwareTrait;
use TYPO3\CMS\Core\Utility\GeneralUtility;
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\Interceptor\AbstractInterceptorModel;
use Typoheads\Formhandler\Domain\Model\Config\Interceptor\EmailOverrideInterceptorModel;
use Typoheads\Formhandler\Utility\Utility;

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<string, array{fileOrField: string, mime: null|string, renameTo: null|string}>, embedFiles: array<string, array{fileOrField: string, mime: null|string, renameTo: null|string}>} */
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<string, array{fileOrField: string, mime: null|string, renameTo: null|string}>, embedFiles: array<string, array{fileOrField: string, mime: null|string, renameTo: null|string}>} */
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<int, MailFinisherModel> $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<string, string> $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);
}
}
}
}
Loading