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

Fluid standalone view in BE context

假设您处于 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 中,这会引发以下异常:

Tried resolving a template file for controller action "Standard->index" in format ".html", but none of the paths contained the expected template file… No paths configured.

根据 https://wiki.typo3.org/How_to_use_the_Fluid_Standalone_view_to_render_template_based_emails#Usage_in_TYPO3_8.7 的维基页面中的建议,我尝试为视图设置布局和部分根路径:

$view->setLayoutRootPaths(['EXT:Myextensionname/Resources/Private/Layouts/']);
$view->setPartialRootPaths(['EXT:Myextensionname/Resources/Private/Partials/']);

但是,这不会奏效。

再深入一点,我可以想象必须设置控制器和动作名称,例如通过设置控制器上下文,但这似乎不是一个可靠的解决方案,因为多个其他 class 实例与它相关联。

在 8 LTS 中呈现流畅的独立视图的正确方法是什么?

这里是我们当前 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();
    }

在我的 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 作为具有默认值的参数,以便其他 controllers/plugins 也可以使用此函数。

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

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