【问题标题】:Fluid standalone view in BE contextBE 上下文中的流畅独立视图
【发布时间】:2018-02-13 17:11:03
【问题描述】:

假设您处于 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”的模板文件,但没有一个路径包含预期的模板文件...没有配置路径。

正如 wiki 页面 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/']);

但是,这并不能解决问题。

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

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

【问题讨论】:

    标签: typo3 fluid typo3-8.7.x


    【解决方案1】:

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

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

    【讨论】:

    • 我刚刚更新到 8.7.6,但在我看来这不是回归。
    • 再次测试,加上路径问题,确实是回归。
    【解决方案2】:

    在我的 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 作为默认值的参数,以便其他控制器/插件也可以使用此函数。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-23
        • 2012-01-22
        • 2014-10-12
        • 2019-04-25
        • 2018-03-01
        • 2013-12-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多