0

假设您处于 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”的控制器操作“Standard->index”的模板文件,但没有一个路径包含预期的模板文件……没有配置路径。

正如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 中渲染流畅的独立视图的正确方法是什么?

4

3 回答 3

2

这是我们当前 web 项目中的一个示例,我们希望在后端上下文中基于 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();
    }
于 2017-09-05T13:35:44.147 回答
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作为默认值的参数,以便其他控制器/插件也可以使用这个函数。

于 2017-09-06T07:02:34.617 回答
1

StandaloneView 喜欢接收所有模板路径(部分、模板和布局根路径),因此如果您还没有提供所有这些路径,则应该这样做。原因是命名“独立”是指视图既不绑定到特定的 MVC 操作也不绑定到特定的扩展上下文。

也就是说,如果您使用 8.7.5,您有可能会受到将由https://review.typo3.org/#/c/53917/解决的回归的影响,因此之前可能值得检查一下你做了一个重大的重构。从技术上讲,StandaloneView可以像具有扩展上下文的 TemplateView 一样操作,它只是不受官方支持的行为,并且 TYPO3 可能不会始终如一地应用您期望的所有上下文。

于 2017-09-06T17:14:55.487 回答