如何在TYPO3 v11中创建Form Finisher?自定义实现遇阻求助
问题描述
- 正在为TYPO3的EXT:form开发自定义Finisher,缺少TYPO3 v11适配的示例(现有多为v8版本)
- 已参考官方文档完成
Smtp.yaml、SmtpFinisher.php及ext_localconf.php配置,但后台无法看到该Finisher - 不清楚如何将PHPMailer这类PHP库集成到扩展/TYPO3中
当前配置文件
/Configuration/Finishers/Smtp.yaml
TYPO3: CMS: Form: prototypes: standard: finishersDefinition: SmtpFinisher: implementationClassName: 'Vendor\personal\Domain\Finishers\SmtpFinisher' options: yourCustomOption: 'Ralf'
/Classes/Domain/Finishers/SmtpFinisher.php
<?php declare(strict_types=1); namespace VENDOR\personal\Domain\Finishers; use PHPMailer\PHPMailer\PHPMailer; use TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher; final class SmtpFinisher extends AbstractFinisher { protected $shortFinisherIdentifier = 'smtp'; public function executeInternal() : void{ $senderOptoins = $this->parseOptions("sender"); $mailer = new PHPMailer(); $mailer->isSMTP(); $mailer->SMTPAuth =true; $mailer->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mailer->Port = $senderOptoins["smtpPort"]; $mailer->Host = $senderOptoins["smtpServer"]; $mailer->Username = $senderOptoins["username"]; $mailer->Password = $senderOptoins["password"]; $mailer->setFrom($senderOptoins["senderAddress"]) ; foreach($this->parseOptions("recipents") as $recipent){ $mailer->addAddress($recipent); } $mailer->isHTML(); $mailer->Subject = "Hello, World!"; $mailer->Body = "Hi Test Email"; $mailer->AltBody = "Hi Test Email"; $mailer->Send(); } } ?>
/ext_localconf.php
if (\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('form')) { \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTypoScriptSetup(trim(' module.tx_form { settings { yamlConfigurations { 311 = EXT:personal/Configuration/Finishers/Smtp.yaml } } } plugin.tx_form { settings { yamlConfigurations { 311 = EXT:personal/Configuration/Finishers/Smtp.yaml } } } ')); }
解决方案
一、修复自定义Finisher后台不显示问题
统一命名空间大小写:
PHP文件中命名空间是VENDOR\personal\Domain\Finishers,但YAML里写的是Vendor\personal\Domain\Finishers\SmtpFinisher,TYPO3对命名空间大小写敏感,必须完全匹配。建议统一遵循PSR-4规范,用小写开头的vendor。补充后台显示必需的YAML配置:
要让Finisher在表单编辑器中显示,必须添加label和formEditor节点,示例修改后的YAML:TYPO3: CMS: Form: prototypes: standard: finishersDefinition: SmtpFinisher: implementationClassName: 'Vendor\personal\Domain\Finishers\SmtpFinisher' label: 'LLL:EXT:personal/Resources/Private/Language/locallang.xlf:smtpFinisher.label' formEditor: iconIdentifier: 'content-form' label: 'LLL:EXT:personal/Resources/Private/Language/locallang.xlf:smtpFinisher.label' predefinedDefaults: options: sender: [] recipents: [] options: yourCustomOption: 'Ralf'同时需要在
Resources/Private/Language/locallang.xlf中添加对应语言标签:<?xml version="1.0" encoding="UTF-8"?> <xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"> <file source-language="en" datatype="plaintext" original="messages"> <body> <trans-unit id="smtpFinisher.label"> <source>SMTP Mail Finisher</source> </trans-unit> </body> </file> </xliff>调整配置优先级:
ext_localconf.php中的311是配置加载优先级,如果有其他扩展也修改form配置,建议把数字调大(比如999),确保你的配置最后加载生效。强制清除缓存:
修改配置后必须清除TYPO3所有缓存,包括配置缓存和表单配置缓存,直接后台点击"清除所有缓存"即可。
二、集成PHPMailer到TYPO3扩展
通过Composer安装依赖:
在你的扩展根目录执行命令:composer require phpmailer/phpmailer确保扩展的
composer.json正确声明依赖,示例:{ "name": "vendor/personal", "type": "typo3-cms-extension", "autoload": { "psr-4": { "Vendor\\Personal\\": "Classes/" } }, "require": { "typo3/cms-core": "^11.5", "typo3/cms-form": "^11.5", "phpmailer/phpmailer": "^6.8" } }执行
composer dump-autoload更新类映射。完善异常处理:
PHPMailer的Send()方法会抛出异常,建议添加捕获逻辑避免表单无提示失败:try { $mailer->Send(); } catch (\PHPMailer\PHPMailer\Exception $e) { $this->finisherContext->getFormRuntime()->getResponse()->setStatus(500); throw new \TYPO3\CMS\Form\Domain\Finishers\FinisherException($e->getMessage(), 1690000001); }
内容的提问来源于stack exchange,提问作者peni4142
相关产品推荐
相关产品推荐

