如何为TYPO3站点配置定义自定义默认值(含后台不可见字段)
TYPO3 站点配置自定义问题
现有配置基础
目前可通过在站点包中创建Configuration/SiteConfiguration/Overrides/sites.php文件,修改后台字段的默认值,示例代码如下:
<?php defined('TYPO3') or die(); $GLOBALS['SiteConfiguration']['site_language']['columns']['title']['config']['default'] = 'Deutsch'; $GLOBALS['SiteConfiguration']['site_language']['columns']['typo3Language']['config']['default'] = 'de';
同时也支持给后台表单添加新字段。
核心疑问
- 是否可以定义后台表单不显示的配置项,但在创建新站点时自动将预设值写入
sites.yaml文件?例如希望自动写入以下配置:
routeEnhancers: PageTypeSuffix: type: PageType map: sitemap.xml: 1533906435 settings: redirects: autoUpdateSlugs: false autoCreateRedirects: false redirectTTL: 0 httpStatusCode: 301
这样TYPO3管理员无需手动编辑yaml文件,就能创建带预设配置的站点。
- 发现站点默认值由
createNewBasicSite()函数设置,是否可以扩展或重写该函数?
解答
针对后台不显示但自动写入yaml的配置需求
有两种可行方案:
- 隐藏字段并设置默认值:在
sites.php中定义字段默认值,同时通过配置将字段隐藏,确保后台不展示但值会被写入yaml。示例:
<?php defined('TYPO3') or die(); // 定义settings.redirects的默认值 $GLOBALS['SiteConfiguration']['site']['columns']['settings']['config']['default'] = [ 'redirects' => [ 'autoUpdateSlugs' => false, 'autoCreateRedirects' => false, 'redirectTTL' => 0, 'httpStatusCode' => 301 ] ]; // 隐藏该字段,避免后台显示 $GLOBALS['SiteConfiguration']['site']['columns']['settings']['l10n_mode'] = 'exclude'; $GLOBALS['SiteConfiguration']['site']['columns']['settings']['displayCond'] = 'FIELD:uid:REQ:false';
如果是更复杂的嵌套结构,可针对具体子字段单独配置默认值与隐藏规则。
- 事件监听自动追加配置:监听
AfterSiteCreatedEvent事件,在站点创建完成后自动写入预设配置。- 创建事件监听器类:
<?php namespace YourVendor\YourSitePackage\EventListener; use TYPO3\CMS\Core\Site\Event\AfterSiteCreatedEvent; use TYPO3\CMS\Core\Configuration\SiteConfiguration; class AddDefaultSiteConfigListener { public function __construct(protected SiteConfiguration $siteConfiguration) {} public function __invoke(AfterSiteCreatedEvent $event): void { $site = $event->getSite(); $siteConfig = $this->siteConfiguration->load($site->getRootPageId()); // 追加预设的路由增强器配置 $siteConfig['routeEnhancers'] = [ 'PageTypeSuffix' => [ 'type' => 'PageType', 'map' => [ 'sitemap.xml' => 1533906435 ] ] ]; // 追加预设的重定向配置 $siteConfig['settings']['redirects'] = [ 'autoUpdateSlugs' => false, 'autoCreateRedirects' => false, 'redirectTTL' => 0, 'httpStatusCode' => 301 ]; $this->siteConfiguration->write($site->getRootPageId(), $siteConfig); } }- 在
Services.yaml中注册监听器:
services: YourVendor\YourSitePackage\EventListener\AddDefaultSiteConfigListener: tags: - name: event.listener identifier: 'your-site-package/add-default-site-config' event: TYPO3\CMS\Core\Site\Event\AfterSiteCreatedEvent
针对扩展/重写createNewBasicSite()函数的需求
createNewBasicSite()函数位于TYPO3\CMS\Core\Site\SiteCreator类中,可通过类重写实现自定义:
- 在站点包的
Configuration/Services.yaml中配置类替换:
services: TYPO3\CMS\Core\Site\SiteCreator: class: YourVendor\YourSitePackage\Site\CustomSiteCreator arguments: - '@TYPO3\CMS\Core\Configuration\SiteConfiguration' - '@TYPO3\CMS\Core\Site\SiteFactory' - '@TYPO3\CMS\Core\Utility\GeneralUtility'
- 创建自定义类并重写目标方法:
<?php namespace YourVendor\YourSitePackage\Site; use TYPO3\CMS\Core\Site\SiteCreator; use TYPO3\CMS\Core\Site\Entity\Site; class CustomSiteCreator extends SiteCreator { public function createNewBasicSite(int $rootPageId, string $siteIdentifier, string $base, array $languages = []): Site { // 调用父类方法获取基础站点配置 $site = parent::createNewBasicSite($rootPageId, $siteIdentifier, $base, $languages); $siteConfig = $this->siteConfiguration->load($rootPageId); // 添加自定义默认配置 $siteConfig['routeEnhancers'] = [ 'PageTypeSuffix' => [ 'type' => 'PageType', 'map' => [ 'sitemap.xml' => 1533906435 ] ] ]; $siteConfig['settings']['redirects'] = [ 'autoUpdateSlugs' => false, 'autoCreateRedirects' => false, 'redirectTTL' => 0, 'httpStatusCode' => 301 ]; $this->siteConfiguration->write($rootPageId, $siteConfig); // 返回更新后的站点对象 return $this->siteFactory->create($rootPageId, $siteConfig); } }
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

