TYPO3 v12+通用页脚预览渲染器实现问题求助
针对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
相关产品推荐
相关产品推荐

