namelesscoder / typo3-cms-fluid-parameters
参数化 Fluid 模板的示例
Requires
- php: >=7.0.0
- typo3/cms-core: ^8.4.1|^9|dev-master
Replaces
- fluid_parameters: 1.0.0
This package is auto-updated.
Last update: 2024-09-08 07:10:49 UTC
README
将此包作为 TYPO3 扩展安装,允许您在部分或部分中的部分中声明参数,就像在 ViewHelper 类内部注册参数一样,并触发完全相同的参数验证。
这是第 3 点的有限功能示例,最终实现此功能将不会受到此包的限制。TYPO3/Fluid#424。
并且与 Fluid 预想的特性兼容,只有一个例外(见下文)。
示例
<!-- MyPartial.html --> <f:parameter name="partialParameterOne" type="bool" description="Required parameter" required="1" /> <f:parameter name="partialParameterTwo" type="string" description="Optional parameter with default" required="0" default="Default Value" /> <f:section name="MySection"> <f:parameter name="sectionParameter" type="int" description="Section parameter" required="0" default="Bar" forSection="MySection" /> Section parameter value: {sectionParameter} </f:section> <h4>Partial rendered!</h4> <ul> <li>Value of "partialParameterOne" is {partialParameterOne}</li> <li>Value of "partialParameterTwo" is {partialParameterTwo}</li> <li>Rendering MySection yielded: <f:render section="MySection" /></li> </ul>
此示例声明了两个用于部分本身的参数
partialParameterOne
是必需的,必须为布尔值partialParameterTwo
是可选的,默认值为 "默认值"。
并且有一个部分,其中包含一个参数 sectionParameter
,是可选的,默认值为 "Bar"。
渲染时会发生什么
给定上面的示例,如果您调用 <f:render partial="MyPartial" />
而不传递任何参数,您将看到一个 "必需参数未提供" 的异常,就像您调用了一个 ViewHelper 而遗漏了一个必需参数一样。
然而,如果您调用 <f:render partial="MyPartial" arguments="{partialParameterOne: 'My value'}" />
,则必需参数存在,部分将允许渲染。但由于您没有传递 partialParameterTwo
,此参数是可选的,因此不会引发错误,而是将默认值分配为参数值。
最后,当您从部分模板内部调用 <f:render section="MySection" />
或从任何地方调用 <f:render partial="MyPartial" section="MySection" />
时,将使用部分内定义的参数进行验证,并使用默认值填充缺失的值(如果已定义)。
限制(与 Fluid 中的最终实现相比)
由于此包选择最不具侵略性的解决方案,并避免使用 XCLASS 和使用最小数量的自定义实现,因此与该功能的最终版本相比有一些限制。
- 参数支持仅限于部分和部分内的部分。在其他地方指定部分的参数是不受支持的,并将引发错误。这是由于无法“注入”需要在 Fluid 内部逻辑中放置的必要代码。
- 将覆盖 TYPO3 CMS 的
RenderViewHelper
,导致解析时的类名不同。替代类完全与签名兼容,但这意味着该包可能与其他也覆盖此 ViewHelper 的包不兼容。 - 必须强制访问两个当前
protected
方法$node->getUinitializedViewHelper()
实例持有我们的$renderingContext
,但没有getter,因此强制访问。$view->getCurrentParsedTemplate()
方法是protected
的,并且强制访问。这两个实例是唯一的 API 违规,但仅因为“无覆盖”策略。然而,它们在保持正确的值在正确的时间方面是完全值得信赖的。
- 与最终实现不同,这个有限实现要求您在参数必须应用于特定部分(在该模板中)时,在
f:parameter
上指定forSection
参数。这意味着从技术上讲,您可以将在模板外部的所有f:parameter
调用都放置在模板外部,因为嵌套不会产生影响。最终实现将 不会 需要此参数,而是对它的位置(在部分内部或外部)敏感。
解决方案与 forSection
参数不兼容。一旦最终实现完成,此包将被标记为与包括它的任何 Fluid 版本或更高版本的 Fluid 不兼容,到那时您将必须编辑所有模板以删除 forSection
参数。
尽管可以将 f:paramter
放在 f:section
外部并提供 forSection
,但仍强烈建议将其放在 f:section
内部,因为最终实现将是层次敏感的。这也有助于减少迁移到最终实现所需的工作量。