TYPO3 - 将变量从流体传递到 cObject

Posted

技术标签:

【中文标题】TYPO3 - 将变量从流体传递到 cObject【英文标题】:TYPO3 - Pass a variable from Fluid to a cObject 【发布时间】:2017-02-19 20:08:13 【问题描述】:

我正在使用流体内容,我想在内容元素中呈现一个插件。因此,我创建了以下 COA:

form = COA
form 
     15 < tt_content.list.20.extname_form
     15.settings.id = |

此对象正在使用 cOject 视图助手在流体模板中呈现。

<f:cObject typoscriptObjectPath="form" data="testId" />

渲染过程运行良好。

问题是我无法访问 COA 对象内的数据变量。在表单模板中,变量 settings.id 的内容是 | 而不是 testId

我尝试使用 vhs viewhelper request.render 渲染插件,但我在传递变量时遇到问题。

<v:render.request action="request" controller="Form" extensionName="ExtName" pluginName="Form" vendorName="VendorName" arguments="_all" />

【问题讨论】:

【参考方案1】:

还有另一种使用全局注册表的方法。 TYPO3 包含一个所谓的“LOAD REGISTER”,这意味着变量的静态存储。 VHS 扩展包含与该存储交互的 ViewHelpers:

https://fluidtypo3.org/viewhelpers/vhs/master/Variable/Register/GetViewHelper.html

使用set 变体,您可以添加变量,然后调用f:cObject,无论您的下一个流体模板在渲染堆栈中有多深,使用get 变体检索值。

例如,如果您将内容元素与其他嵌套内容元素一起使用,则非常有用,例如检索或重新定义任何嵌套深度的值。

注意:也可以在 TypoScript 以及通过 TYPO3 执行的自定义 php 中访问,使用 https://docs.typo3.org/typo3cms/TyposcriptReference/ContentObjects/LoadRegister/Index.html。所以总的来说,它可能比严格传递参数要简单得多,而且绝对更灵活。

【讨论】:

【参考方案2】:

您可以使用流体模板中的一些帮助(也许):

<f:debug>_all</f:debug>

这样您就可以检查大量可用信息,否则在您的控制器中:

\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($yourVariable);

【讨论】:

【参考方案3】:

如果您将字符串定义为数据,请使用 stdWrap 的 .current = 1 选项:

form = COA
form 
     15 < tt_content.list.20.extname_form
     15.settings.id.current = 1

但是你的“extname_form”应该在设置上使用stdWrap,否则你应该使用“variables”:

form = COA
form 
     15 < tt_content.list.20.extname_form
     15.variables.id = TEXT
     15.variables.id.current = 1


使用 stdWrap 进行设置的示例:

form = COA
form 
     15 < tt_content.list.20.extname_form
     15.settings.id.current = 1

在您的控制器操作中:

  /** @var \TYPO3\CMS\Extbase\Service\TypoScriptService $typoScriptService */
  $typoScriptService = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Service\TypoScriptService::class);
  $typoScriptSettings = $typoScriptService->convertTypoScriptArrayToPlainArray($this->settings);
  $this->settings['id'] = $this->configurationManager->getContentObject()->stdWrap($typoScriptSettings['id'], $typoScriptSettings['id.']);

现在你的 settings.id 被 stdWrap 解析并且应该包含你的 cObjectViewHelper 数据。

【讨论】:

感谢您的帮助。我尝试了这两个版本,但我无法将变量传递给表单的流体模板。 extname_form 扩展中可能有一些东西取决于如何访问变量。对于带有“变量”的示例,仅当 tt_content.list.20.extname_form 是 FLUID_TEMPLATE 对象时才有效。在不知道扩展名的情况下,您必须解析控制器中的设置并将它们分配给您的视图。 我无法让它工作。同样在表单控制器中,我无法访问变量。表单插件也是用流体模板实现的。如果我使用第一个版本,我会在模板中看到变量。问题是没有取变量内容。 我已经用一个示例编辑了我的答案,以便在设置中使用stdWrap 很抱歉,它不起作用。我没有得到变量的内容。我这样称呼打字稿对象: 对吗?

以上是关于TYPO3 - 将变量从流体传递到 cObject的主要内容,如果未能解决你的问题,请参考以下文章

TYPO3 在流体中裁剪图像

通过 typeNum 动态改变 TYPO3 流体布局

流体动力 TYPO3 部分中的 enableFields -> 对象

流体驱动的 TYPO3 - 命名空间的正确设置

所有流体含量 FCE 的概述

如何覆盖后端流体模板?