问题描述
StandaloneView
的名称和描述(“如果您想在没有 Extbase 扩展的情况下使用 Fluid,则应该用作视图”)表明,可以在外部的任何地方使用此视图任何 Extbase 上下文。例如。用于 CLI 任务,例如生成电子邮件 (FluidMail
) 或使用视图生成 HTML 代码,然后将其转换为 PDF。
不幸的是,如果模板引用了图像或 CSS/JS 文件等资产,则上述方法均无效。
原因是,视图依赖请求对象来派生到资产的域相关路径,这在 CLI 中显然不起作用,因为不存在适当的请求对象:
TYPO3\CMS\Extbase\Mvc\Web\Request prototype object
format => protected "html" (4 chars)
pluginName => protected "" (0 chars)
controllerExtensionName => protected NULL
controllerSubpackageKey => protected NULL
controllerObjectName => protected "" (0 chars)
controllerName => protected "Standard" (8 chars)
controllerActionName => protected "index" (5 chars)
arguments => protected array(empty)
internalArguments => protected array(empty)
dispatched => protected FALSE
originalRequest => protected NULL
originalRequestMappingResults => protected NULL
method => protected "GET" (3 chars)
requestUri => protected "http:///var/www/html/vendor/bin/typo3cms" (40 chars)
baseUri => protected "http:///va/typo3/" (17 chars)
isCached => protected FALSE
视图助手将创建错误的 URI,如下所示:
// f:uri.resource(path:'Css/pdf.css',extensionName: 'myext')
<link href="typo3conf/ext/myext/Resources/Public/Css/pdf.css" rel="stylesheet" />
// f:image(src:'EXT:myext/Resources/Public/Images/logo.png')
<img src="/va/typo3conf/ext/myext/Resources/Public/Images/logo.png" />
here 中给出的解决方案无济于事,因为已呈现/找到模板文件,但缺少链接的资产,这完全弄乱了模板。
此问题的可能解决方案是什么?或者:如何以正确的方式使用 StandaloneView
?因为即使是核心 FluidMail
也有这个问题,所以这似乎是一个普遍的概念问题。
感谢任何输入、想法或解决方案!
附注: 将任何资源嵌入模板都不是解决方案!
解决方法
对于有同样问题并正在寻找解决方案的人,我将总结我已经想到的以及朱利安确认的内容(谢谢)。如果有人提出更好的解决方案,欢迎随时分享。
解决方案 1:避免在模板中链接资产,这些模板应该在 CLI 上下文中使用,并将所有需要的资源嵌入模板中。
解决方案 2: 使用域伪造 ServerRequest,以允许 ViewHelper 确定喜欢的资产的正确路径。
方案三:使用base-url扩展的BaseUrl辅助函数
解决方案 4: 编写自定义 ViewHelpers(或更好地扩展通用的),它不仅从请求对象确定资产的路径,而且如果作为 CLI 运行,则从 TYPO3 实例路径确定资产的路径,这应该足以进行内部处理。
尽管如此,名称 StandaloneView
仍然具有误导性,IMO 会考虑使用它的所有意外问题,例如在 CLI 上下文中。