You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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后台不显示问题

  1. 统一命名空间大小写:
    PHP文件中命名空间是VENDOR\personal\Domain\Finishers,但YAML里写的是Vendor\personal\Domain\Finishers\SmtpFinisher,TYPO3对命名空间大小写敏感,必须完全匹配。建议统一遵循PSR-4规范,用小写开头的vendor。

  2. 补充后台显示必需的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>
    
  3. 调整配置优先级:
    ext_localconf.php中的311是配置加载优先级,如果有其他扩展也修改form配置,建议把数字调大(比如999),确保你的配置最后加载生效。

  4. 强制清除缓存:
    修改配置后必须清除TYPO3所有缓存,包括配置缓存和表单配置缓存,直接后台点击"清除所有缓存"即可。

二、集成PHPMailer到TYPO3扩展

  1. 通过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更新类映射。

  2. 完善异常处理:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 08:47:41