鉴于您处于BE或CLI上下文中(例如,通过extbase命令控制器任务发送电子邮件),以下内容最多可达7 LTS,以呈现流畅的独立视图:
$view = $this->objectManager->get(StandaloneView::class);
$view->setTemplatePathAndFilename('/Absolute/Path/To/Template.html');
$view->setFormat('html');
$view->getRequest()->setControllerExtensionName('Myextensionname');
return trim($view->render());
然而,在8 LTS中,这引发了以下异常:
尝试解析控制器操作的模板文件"标准 - >索引"格式为" .html",但没有路径包含预期的模板文件...没有配置路径。
正如在https://wiki.typo3.org/How_to_use_the_Fluid_Standalone_view_to_render_template_based_emails#Usage_in_TYPO3_8.7的wiki页面中所建议的那样,我尝试为视图设置布局和部分根路径:
$view->setLayoutRootPaths(['EXT:Myextensionname/Resources/Private/Layouts/']);
$view->setPartialRootPaths(['EXT:Myextensionname/Resources/Private/Partials/']);
但是,这不会成功。
深入挖掘,我可以想象一个人必须设置控制器和动作名称,例如通过设置控制器上下文,但这似乎不是一个可靠的解决方案,因为多个其他类实例与它绑定。
在8 LTS中渲染流体独立视图的正确方法是什么?
答案 0 :(得分:2)
这是我们当前webproject的一个示例,我们希望在后端上下文中根据TYPO3 8.7中的FLUID HTML显示一个简单的注释
protected function renderMarkup(): string
{
$standaloneView = GeneralUtility::makeInstance(StandaloneView::class);
$standaloneView->getRequest()->setControllerExtensionName('in2template');
$templatePathAndFile = 'EXT:in2template/Resources/Private/Templates/Tca/ToolbarNoteEmptyFields.html';
$standaloneView->setTemplatePathAndFilename(GeneralUtility::getFileAbsFileName($templatePathAndFile));
$standaloneView->assign('toolbar', 'toolbarstuff');
return $standaloneView->render();
}
答案 1 :(得分:1)
在我的8.7扩展中,我使用以下代码获取StandaloneView:
$extbaseFrameworkConfiguration = $this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK);
/** @var StandaloneView $emailView */
$emailView = $this->objectManager->get(StandaloneView::class);
$emailView->getRequest()->setControllerExtensionName($controllerExtensionName);
$emailView->getRequest()->setPluginName($pluginName);
$emailView->getRequest()->setControllerName($controllerName);
$emailView->setTemplateRootPaths($extbaseFrameworkConfiguration['view']['templateRootPaths']);
$emailView->setLayoutRootPaths($extbaseFrameworkConfiguration['view']['layoutRootPaths']);
$emailView->setPartialRootPaths($extbaseFrameworkConfiguration['view']['partialRootPaths']);
$emailView->setTemplate('Email/' . ucfirst($templateName));
$emailView->assignMultiple($variables);
$emailBody = $emailView->render();
在我的函数中,我将$controllerExtensionName
,$pluginName
和$controllerName
作为参数使用默认值,以便其他控制器/插件也可以使用此函数。
答案 2 :(得分:1)
StandaloneView喜欢接收所有模板路径(部分,模板和布局根路径),因此如果您还没有提供所有模板路径,则应该这样做。原因是命名" Standalone"指视图既不与特定的MVC操作绑定,也不与特定的扩展上下文绑定。
那就是说,如果你使用8.7.5那么你有机会被https://review.typo3.org/#/c/53917/解决的回归所击中,所以在进行重大重构之前可能需要检查一下。从技术上讲,StandaloneView 可以像具有扩展上下文的TemplateView一样操作,它只是不受官方支持的行为,而且TYPO3可能无法始终如一地应用您期望的所有上下文。