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

TYPO3 v12+通用页脚预览渲染器实现问题求助

解决TYPO3 v12中替代tt_content_drawFooter钩子的通用方案

针对TYPO3 v12移除tt_content_drawFooter钩子后,无法通用添加内容元素预览页脚信息的问题,提供两种可行的通用实现方案:

方案一:装饰器模式统一包装所有预览渲染器

通过装饰器模式,无需逐个修改TCA配置,就能为所有内容元素的预览渲染器追加自定义页脚信息。

1. 创建装饰器类

实现ContentPreviewRendererInterface,包装原有渲染器并追加页脚内容:

<?php
namespace YourVendor\YourExtension\Preview;

use TYPO3\CMS\Backend\Preview\ContentPreviewRendererInterface;
use TYPO3\CMS\Backend\Preview\PreviewRenderingContext;

class CustomFooterContentPreviewRenderer implements ContentPreviewRendererInterface
{
    public function __construct(
        private readonly ContentPreviewRendererInterface $originalRenderer
    ) {}

    public function render(PreviewRenderingContext $context): string
    {
        // 获取原有渲染器生成的预览内容
        $previewContent = $this->originalRenderer->render($context);
        $record = $context->getRecord();
        
        // 构建自定义页脚
        $footer = '';
        // 添加l18n_parent关联信息
        if (!empty($record['l18n_parent'])) {
            $footer .= '<div class="t3-preview-footer">关联父内容元素: ' . $record['l18n_parent'] . '</div>';
        }
        // 添加textmedia类型的媒体资源统计
        if ($record['CType'] === 'textmedia' && !empty($record['assets'])) {
            $footer .= '<div class="t3-preview-footer">关联媒体资源数量: ' . count($record['assets']) . '</div>';
        }
        
        // 合并原有内容与自定义页脚
        return $previewContent . $footer;
    }
}

2. 配置装饰器

在Configuration/Services.yaml中注册装饰器,对所有预览渲染器生效:

services:
  YourVendor\YourExtension\Preview\CustomFooterContentPreviewRenderer:
    decorates: TYPO3\CMS\Backend\Preview\ContentPreviewRendererInterface
    arguments:
      $originalRenderer: '@.inner'

方案二:利用PageContentPreviewRenderingEvent追加内容

通过监听预览渲染事件,直接获取原有预览内容并追加自定义页脚,实现成本更低。

1. 创建事件监听器

<?php
namespace YourVendor\YourExtension\EventListener;

use TYPO3\CMS\Backend\Event\PageContentPreviewRenderingEvent;

class PageContentFooterListener
{
    public function __invoke(PageContentPreviewRenderingEvent $event): void
    {
        $originalContent = $event->getPreviewContent();
        $record = $event->getRecord();
        
        $footer = '';
        // 同方案一的页脚内容逻辑
        if (!empty($record['l18n_parent'])) {
            $footer .= '<div class="t3-preview-footer">关联父内容元素: ' . $record['l18n_parent'] . '</div>';
        }
        if ($record['CType'] === 'textmedia' && !empty($record['assets'])) {
            $footer .= '<div class="t3-preview-footer">关联媒体资源数量: ' . count($record['assets']) . '</div>';
        }
        
        // 覆盖预览内容为原有内容+自定义页脚
        $event->setPreviewContent($originalContent . $footer);
    }
}

2. 注册监听器

在Configuration/Services.yaml中添加事件监听标签:

services:
  YourVendor\YourExtension\EventListener\PageContentFooterListener:
    tags:
      - name: event.listener
        identifier: 'your-extension/preview-footer-listener'
        event: TYPO3\CMS\Backend\Event\PageContentPreviewRenderingEvent

方案对比

  • 装饰器模式:完全控制渲染流程,可灵活调整自定义内容的位置(如插入原有页脚前后),适合复杂需求;
  • 事件监听:代码更简洁,无需理解装饰器逻辑,适合快速实现,但自定义内容会追加在原有预览内容末尾,需通过CSS调整样式对齐原生页脚。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:55:02