TYPO3自定义扩展中Form Factory未调用Finisher问题求助
TYPO3自定义Form Factory表单Finisher未执行问题解决
问题分析
你的表单能正常显示但Finisher不触发、邮件未发送,核心问题出在EmailToSender Finisher的配置错误,以及部分Form Definition的配置遗漏:
1. EmailToSender Finisher参数混淆
EmailToSender的作用是给表单提交者发送邮件,它不需要recipients数组配置(这是EmailToReceiver的专属配置项),而是需要通过recipientAddress绑定用户提交的邮箱字段。当前错误的配置导致Finisher无法识别有效收件人,直接跳过执行。
2. 缺少必要的Finisher配置项
EmailToSender需明确指定核心参数:
recipientAddress:绑定表单中用户输入的邮箱字段(如{email})- 建议补充:
senderName、recipientName,同时确保senderAddress是系统允许的合法发件地址(避免被邮件服务商拦截)
3. 控制器动作需确保正确处理提交
虽然你设置了controllerAction为perform,但要确认对应的Extbase控制器动作中,正确初始化Form Runtime并处理表单提交逻辑,示例代码如下:
public function performAction(\TYPO3\CMS\Form\Domain\Model\FormDefinition $formDefinition = null) { $formRuntime = GeneralUtility::makeInstance(\TYPO3\CMS\Form\Domain\Runtime\FormRuntime::class, $formDefinition); if ($this->request->getMethod() === 'POST') { $formRuntime->bind($this->request->getArguments()); if ($formRuntime->isValid()) { $formRuntime->submit(); } } $this->view->assign('form', $formRuntime); }
修正后的Form Factory代码
<?php declare(strict_types = 1); namespace Ready24\Ready24Ext\Domain\Factory; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Validation\Validator\NotEmptyValidator; use TYPO3\CMS\Extbase\Validation\Validator\EmailAddressValidator; use TYPO3\CMS\Form\Domain\Configuration\ConfigurationService; use TYPO3\CMS\Form\Domain\Factory\AbstractFormFactory; use TYPO3\CMS\Form\Domain\Model\FormDefinition; class NotifyFactory extends AbstractFormFactory { /** * Build a FormDefinition. * This builds a FormDefinition manually for notification Form, * * @param array $configuration * @param string $prototypeName * @return FormDefinition */ public function build(array $configuration, string $prototypeName = null): FormDefinition { $prototypeName = $prototypeName ?? 'standard'; $configurationService = GeneralUtility::makeInstance(ConfigurationService::class); $prototypeConfiguration = $configurationService->getPrototypeConfiguration($prototypeName); $form = GeneralUtility::makeInstance(FormDefinition::class, 'NotificationForm', $prototypeConfiguration); $form->setRenderingOption('controllerAction', 'perform'); $page1 = $form->createPage('page1'); $name = $page1->createElement('name', 'Text'); $name->setLabel('Name'); $name->addValidator(GeneralUtility::makeInstance(NotEmptyValidator::class)); $email = $page1->createElement('email', 'Email'); $email->setLabel('Email'); $email->addValidator(GeneralUtility::makeInstance(NotEmptyValidator::class)); $email->addValidator(GeneralUtility::makeInstance(EmailAddressValidator::class)); // 修正EmailToSender的配置 $form->createFinisher('EmailToSender', [ 'subject' => '感谢您的提交', // 绑定用户提交的邮箱字段 'recipientAddress' => '{email}', 'recipientName' => '{name}', // 使用系统配置的发件地址,或填写有效的发件邮箱 'senderAddress' => 'noreply@your-domain.com', 'senderName' => '您的网站名称', // 可选:自定义邮件模板路径 'templatePathAndFilename' => 'EXT:ready24_ext/Resources/Private/Templates/Email/Notification.html', ]); $this->triggerFormBuildingFinished($form); return $form; } }
调试与验证步骤
- 查看TYPO3系统日志(系统 > 日志),检查是否有Finisher执行错误或邮件发送失败的记录
- 开启Form模块调试模式:在
config.yaml中设置TYPO3:CMS:Form:settings:debugMode: true,查看表单提交时的详细错误信息 - 测试邮件发送功能:使用TYPO3的邮件测试工具(系统 > 设置 > 邮件设置)验证系统邮件配置是否正常
内容的提问来源于stack exchange,提问作者dade
相关产品推荐
相关产品推荐

