如何在TYPO3的ext:form模板和自定义finisher中获取FlexForm自定义设置
可以拿到,你遇到的问题是ext:form默认不会自动把自定义Flexform sheet的配置注入到模板上下文和Finisher运行环境,需要额外加配置和代码实现:
1. 模板中读取自定义配置
推荐通过自定义DataProcessor注入配置,无需修改原有模板逻辑:
1.1 新建DataProcessor类
Classes/DataProcessing/FlexFormSettingsProcessor.php
<?php namespace Vendor\ExtKey\DataProcessing; use TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; use TYPO3\CMS\Frontend\ContentObject\DataProcessorInterface; class FlexFormSettingsProcessor implements DataProcessorInterface { public function process( ContentObjectRenderer $cObj, array $contentObjectConfiguration, array $processorConfiguration, array $processedData ): array { // 解析Flexform中extraEntry sheet的配置 $flexFormTools = GeneralUtility::makeInstance(FlexFormTools::class); $flexFormData = $flexFormTools->convertFlexFormContentToArray($cObj->data['pi_flexform']); // 合并到现有settings变量 $processedData['settings'] = array_merge( $processedData['settings'] ?? [], $flexFormData['extraEntry'] ?? [] ); return $processedData; } }
1.2 注册DataProcessor到form插件
在你扩展的TypoScript配置中加入:
tt_content.form_formframework.dataProcessing.10 = Vendor\ExtKey\DataProcessing\FlexFormSettingsProcessor
注册完成后就可以直接在form模板中用{settings.postsPerPage}读取配置值。
2. 自定义Finisher中读取自定义配置
Finisher可以通过运行时上下文拿到当前插件的内容对象,直接解析Flexform取值即可,示例代码:
<?php namespace Vendor\ExtKey\Domain\Finishers; use TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher; class CustomFinisher extends AbstractFinisher { protected function execute(): void { // 获取当前内容对象 $cObj = $this->finisherContext->getFormRuntime() ->getRequest() ->getAttribute('currentContentObject'); // 解析Flexform取值 $flexFormTools = GeneralUtility::makeInstance(FlexFormTools::class); $flexFormData = $flexFormTools->convertFlexFormContentToArray($cObj->data['pi_flexform']); $postsPerPage = $flexFormData['extraEntry']['settings.postsPerPage'] ?? 3; // 后续业务逻辑 } }
额外优化建议
你现有的FlexFormHook中硬编码文件路径的写法可以优化,适配不同部署结构:
// 替换原来的$file赋值逻辑 $file = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('ext_key') . 'Configuration/Example.xml';
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

