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

TYPO3 9.5.9后台模块设置页实现:展示并修改扩展配置

嘿,很高兴帮你搞定这个问题!你已经成功把后台模块加到Admin Tools菜单里了,接下来要实现展示、编辑ext_conf_template里的扩展配置,还要支持保存并在前端调用,其实TYPO3有现成的机制可以用,不用自己从头造轮子。下面是具体步骤,跟着做就行:

步骤1:确保ext_conf_template.txt配置正确

如果还没创建这个文件,在你的扩展根目录下新建ext_conf_template.txt,按照TYPO3的格式定义配置字段。比如:

# cat=基础设置/功能开关; type=boolean; label=LLL:EXT:cbwebdesigntemplate/Resources/Private/Language/locallang.xlf:enable_feature
enableFeature = 0

# cat=基础设置/API配置; type=input; label=LLL:EXT:cbwebdesigntemplate/Resources/Private/Language/locallang.xlf:api_key
apiKey =

# cat=高级设置/主题; type=select; label=LLL:EXT:cbwebdesigntemplate/Resources/Private/Language/locallang.xlf:theme; options=浅色,深色,跟随系统
theme = 浅色

字段里的cat用来分组,type指定控件类型,label关联语言文件的翻译,这样TYPO3能自动识别并生成对应的表单控件。

步骤2:修改模块控制器,加载配置并渲染表单

你的模块已经有SettingsController和main动作了,现在更新这个控制器的逻辑,让它加载当前扩展配置,并传递给Fluid模板渲染。

更新SettingsController.php:

<?php
namespace CBWebdesign\Cbwebdesigntemplate\Controller;

use TYPO3\CMS\Backend\Template\ModuleTemplate;
use TYPO3\CMS\Core\Configuration\ExtensionConfiguration;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;

class SettingsController extends ActionController
{
    /**
     * @var ExtensionConfiguration
     */
    protected $extensionConfiguration;

    public function injectExtensionConfiguration(ExtensionConfiguration $extensionConfiguration)
    {
        $this->extensionConfiguration = $extensionConfiguration;
    }

    public function mainAction()
    {
        $extKey = 'cbwebdesigntemplate'; // 替换成你的扩展键名
        // 获取当前扩展的配置
        $currentConfig = $this->extensionConfiguration->get($extKey);

        // 初始化后台模块模板,保持样式和TYPO3后台一致
        $moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
        $moduleTemplate->setTitle($this->translate('module.settings.title'));

        // 把配置数据传递给视图
        $this->view->assign([
            'currentConfig' => $currentConfig,
            'extKey' => $extKey
        ]);

        // 设置模块内容并渲染
        $moduleTemplate->setContent($this->view->render());
        return $moduleTemplate->renderContent();
    }
}

然后创建对应的Fluid模板Resources/Private/Templates/Settings/Main.html,渲染配置表单:

<f:layout name="BackendModule" />

<f:section name="Content">
    <h1>{f:translate(key: 'module.settings.title')}</h1>

    <f:form action="save" method="post" class="form-horizontal">
        <f:hidden name="extKey" value="{extKey}" />

        <!-- 功能开关 -->
        <div class="form-group">
            <label class="col-sm-3 control-label" for="enableFeature">
                {f:translate(key: 'enable_feature')}
            </label>
            <div class="col-sm-9">
                <f:form.checkbox id="enableFeature" name="config[enableFeature]" value="1" checked="{currentConfig.enableFeature}" />
            </div>
        </div>

        <!-- API Key输入框 -->
        <div class="form-group">
            <label class="col-sm-3 control-label" for="apiKey">
                {f:translate(key: 'api_key')}
            </label>
            <div class="col-sm-9">
                <f:form.textfield id="apiKey" name="config[apiKey]" value="{currentConfig.apiKey}" class="form-control" />
            </div>
        </div>

        <!-- 主题选择框 -->
        <div class="form-group">
            <label class="col-sm-3 control-label" for="theme">
                {f:translate(key: 'theme')}
            </label>
            <div class="col-sm-9">
                <f:form.select id="theme" name="config[theme]" value="{currentConfig.theme}" class="form-control">
                    <f:option value="浅色">{f:translate(key: 'theme.light')}</f:option>
                    <f:option value="深色">{f:translate(key: 'theme.dark')}</f:option>
                    <f:option value="跟随系统">{f:translate(key: 'theme.system')}</f:option>
                </f:form.select>
            </div>
        </div>

        <div class="form-group">
            <div class="col-sm-offset-3 col-sm-9">
                <button type="submit" class="btn btn-primary">{f:translate(key: 'button.save')}</button>
            </div>
        </div>
    </f:form>
</f:section>

这里用了TYPO3后台的布局,确保表单样式和后台统一,表单会提交到save动作处理。

步骤3:实现保存配置的动作

在SettingsController里添加saveAction,处理表单提交并保存配置:

public function saveAction(string $extKey, array $config)
{
    try {
        // 调用TYPO3的API保存扩展配置
        $this->extensionConfiguration->set($extKey, $config);
        // 添加成功提示
        $this->addFlashMessage($this->translate('settings.saved.success'), '', \TYPO3\CMS\Core\Messaging\AbstractMessage::OK);
    } catch (\Exception $e) {
        // 保存失败时提示错误
        $this->addFlashMessage(
            $this->translate('settings.saved.error') . ': ' . $e->getMessage(),
            '',
            \TYPO3\CMS\Core\Messaging\AbstractMessage::ERROR
        );
    }

    // 重定向回配置页面
    $this->redirect('main');
}

这个方法用TYPO3内置的ExtensionConfiguration类处理保存,不用手动操作数据库,安全又可靠。

步骤4:在前端读取配置

配置保存后,前端可以通过两种方式获取:

方式1:直接读取全局变量

在前端模板或者插件控制器里,直接读取序列化的配置:

// 获取扩展配置
$extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['cbwebdesigntemplate']);
// 比如获取API Key
$apiKey = $extConf['apiKey'] ?? '';

TYPO3 9.5版本里扩展配置是序列化存储的,所以需要用unserialize解析。

方式2:Extbase控制器注入ConfigurationManager

如果是在Extbase前端控制器里,推荐注入ConfigurationManagerInterface来获取:

use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;

class FrontendController extends ActionController
{
    /**
     * @var ConfigurationManagerInterface
     */
    protected $configurationManager;

    public function injectConfigurationManager(ConfigurationManagerInterface $configurationManager)
    {
        $this->configurationManager = $configurationManager;
    }

    public function indexAction()
    {
        $extKey = 'cbwebdesigntemplate';
        $extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][$extKey]);
        // 使用配置,比如传递给视图
        $this->view->assign('apiKey', $extConf['apiKey'] ?? '');
    }
}
额外优化建议
  • 如果你不想手动写Fluid表单,可以用TYPO3的FormEngine自动生成表单,更贴合后台原生风格,不过9.5版本需要稍作配置,你可以参考官方文档里的FormEngine用法。
  • 给配置字段添加验证,比如API Key不能为空,可以在Fluid表单里加required="true",或者在控制器里添加验证逻辑。
  • 确保语言文件里包含所有需要的翻译标签,比如locallang_cbwebdesigntemplate.xlf里的按钮文字、配置项名称等。

这样操作下来,你的后台模块就能完美展示并编辑ext_conf_template里的配置,保存后前端也能正常调用啦!

内容的提问来源于stack exchange,提问作者Mikael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:11:11