Typo3中使用ViewHelper从目录加载HTML文件并输出原始内容
解决方案
你当前拿到的{file}是TYPO3的FAL文件实体对象,不是文件本身的文本内容,直接输出只会拿到文件的默认文本表述(比如文件名),当然无法渲染HTML内容。你需要先读取文件的物理内容再输出,有两种可落地的实现思路:
- 思路1:自定义ViewHelper读取HTML文件内容(最推荐,符合TYPO3开发规范)
你可以自己写一个简单的ViewHelper,接收FAL文件对象作为参数,读取文件内容后返回:
<?php namespace Your\ExtensionName\ViewHelpers; use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper; use TYPO3\CMS\Core\Resource\FileInterface; class GetFileContentViewHelper extends AbstractViewHelper { // 关闭输出转义,避免HTML标签被转义为普通文本 protected $escapeOutput = false; public function initializeArguments() { $this->registerArgument('file', FileInterface::class, 'FAL文件对象', true); } public function render() { /** @var FileInterface $file */ $file = $this->arguments['file']; // 额外增加安全校验,只允许读取html后缀的文件 if ($file->getExtension() !== 'html') { return ''; } return $file->getContents(); } }
之后在Fluid模板里注册你的ViewHelper命名空间,替换原来的渲染逻辑即可:
<f:for each="{mkk:getFilesInFolder(dir:'/stories/test1/')}" as="file"> <f:if condition="{file.properties.type} == 1"> <your:getFileContent file="{file}" /> </f:if> </f:for>
- 思路2:借助TYPO3内置功能实现(无需自定义代码)
如果不想写自定义ViewHelper,你也可以先拿到文件的路径,再用Fluid的renderViewHelper引入,需要先配置对应的PartialRootPaths指向你存放HTML文件的fileadmin目录,之后修改模板代码即可:
<f:for each="{mkk:getFilesInFolder(dir:'/stories/test1/')}" as="file"> <f:if condition="{file.properties.type} == 1 && {file.extension} == 'html'"> <f:render partial="{file.identifier}" /> </f:if> </f:for>
这个方案安全性稍低,仅适合内部使用的场景。
原代码不生效的原因
f:format.htmlViewHelper的作用是处理TYPO3富文本字段的内容格式,本身不具备读取外部文件内容的能力- 你直接传入的
{file}是FAL实体对象,不是字符串类型的HTML内容,自然无法正确输出
内容的提问来源于stack exchange,提问作者ahmkay
相关产品推荐
相关产品推荐

