如何创建TYPO3后台模块设置页面?

How to create TYPO3 back-end module settings page?

我有 TYPO3 版本 9.5.9 并使用以下函数添加了后端模块:

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerModule(
    'CBWebdesign.' . $_EXTKEY,
    'tools', // Make module a submodule of 'admin'
    'tools', // Submodule key
    'top', // Position
    array(
        'Settings' => 'main',
    ),
    array(
        'access' => 'admin',
        'icon' => 'EXT:' . $_EXTKEY . '/Resources/Public/icons/template/tx_ext_cbwebdesigntemplate.gif',
        'labels' => 'LLL:EXT:' . $_EXTKEY . '/Resources/Private/Language/locallang_cbwebdesigntemplate.xlf',
    )
);

新的后端模块出现在 ADMIN TOOLS 下的菜单中。但是下一步我必须做什么才能看到包含我的模块设置字段的页面?我还需要保存它们并在前端使用。

抱歉,我必须指定我的用例。我需要实现我的设置页面。我的意思是我已经将模块项添加到菜单中。但是在那里实施设置的最佳方式是什么?甚至确切地说,我想在那里显示 ext_conf_template 文件中的扩展配置,并且还可以在那里更改设置。

您必须实现一个名为 Settings 的控制器,并在 PHP class 中实现一个名为 mainAction() 的方法。假设您的扩展密钥读取 my_example,那么 PHP 命名空间应该是:

  • CBWebdesign\MyExample\Controller\Settings

...并且扩展中控制器文件的 file/path 显示为:

  • Classes/Controller/Settings.php

您还必须实施视图(例如使用Fluid)。控制器 "Settings" 和操作 "main" 的模板文件应位于:

  • Classes/Resources/Private/Templates/Settings/Main.html

我建议查看 TYPO3 附带的现有系统扩展的源代码(例如位于 typo3/sysext/extensionmanager/ 的扩展管理器)。他们都遵循这个范式。

[基于更新问题的新答案]

您在扩展模板文件 ext_conf_template.txt 中指定的 TYPO3 扩展配置存储在 TYPO3 的系统范围配置 typo3conf/LocalConfiguration.php 中。这些配置旨在由 TYPO3 核心管理,并由仅具有管理权限的后端用户编辑。

你在TYPO3版本9中找到了更改这些设置的功能。5.x在ADMIN TOOLS ➜ Settings ➜ Extension Configuration下,如下图所示:

您可以使用 TYPO3 的 API 在您的扩展程序(例如您的控制器)中轻松地 访问 这些设置。例如,要访问扩展配置的值 foo

use \TYPO3\CMS\Core\Configuration\ExtensionConfiguration;
use \TYPO3\CMS\Core\Utility\GeneralUtility;
...
$extensionKey = 'my_example';
$foo = GeneralUtility::makeInstance(ExtensionConfiguration::class)
  ->get($extensionKey, 'foo');

然后您可以将变量 $foo 传递给视图(例如 Fluid)以将其输出给用户(后端 and/or 前端)。

但是,不要更改您自己的扩展中的扩展配置!这不是功能或核心的目的 class ExtensionConfiguration。此类配置只能使用 TYPO3 的安装工具(如上所示)进行维护。

查看文件 typo3/sysext/core/Classes/Configuration/ExtensionConfiguration.php 中的评论。

API to get() instance specific extension configuration options. [...]

Note only ->get() is official API and other public methods are low level core internal API that is usually only used by extension manager and install tool.

另请注意,此class中的其他方法标记为@internal

虽然访问和处理(甚至显示)配置没有问题,但您不应在安装工具之外更改它。

根据您的具体用例,您可能要考虑使用 FlexForms to let backend users (incl. editors) configure certain aspects of an extension — or TypoScript(如果配置应仅限于管理员用户)。对于更复杂的场景,您可以创建一个专用数据库 table(或扩展现有的 table,例如 be_users)并将配置存储在那里。