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

如何为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';

同时也支持给后台表单添加新字段。

核心疑问

  1. 是否可以定义后台表单不显示的配置项,但在创建新站点时自动将预设值写入sites.yaml文件?例如希望自动写入以下配置:
routeEnhancers:
  PageTypeSuffix:
    type: PageType
    map:
      sitemap.xml: 1533906435
settings:
  redirects:
    autoUpdateSlugs: false
    autoCreateRedirects: false
    redirectTTL: 0
    httpStatusCode: 301

这样TYPO3管理员无需手动编辑yaml文件,就能创建带预设配置的站点。

  1. 发现站点默认值由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事件,在站点创建完成后自动写入预设配置。
    1. 创建事件监听器类:
    <?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);
        }
    }
    
    1. 在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类中,可通过类重写实现自定义:

  1. 在站点包的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'
  1. 创建自定义类并重写目标方法:
<?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:30:39