BE上下文中的流体独立视图

时间:2017-09-05 11:56:11

标签: typo3 fluid typo3-8.7.x

鉴于您处于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中渲染流体独立视图的正确方法是什么?

3 个答案:

答案 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可能无法始终如一地应用您期望的所有上下文。

相关问题