namelesscoder/typo3-cms-fluid-parameters

参数化 Fluid 模板的示例

安装: 7

依赖项: 0

建议者: 0

安全性: 0

星标: 2

关注者: 1

分支: 0

开放问题: 0

类型:typo3-cms-extension

1.0.0 2019-03-07 18:00 UTC

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>

此示例声明了两个用于部分本身的参数

  1. partialParameterOne 是必需的,必须为布尔值
  2. 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 和使用最小数量的自定义实现,因此与该功能的最终版本相比有一些限制。

  1. 参数支持仅限于部分和部分内的部分。在其他地方指定部分的参数是不受支持的,并将引发错误。这是由于无法“注入”需要在 Fluid 内部逻辑中放置的必要代码。
  2. 将覆盖 TYPO3 CMS 的 RenderViewHelper,导致解析时的类名不同。替代类完全与签名兼容,但这意味着该包可能与其他也覆盖此 ViewHelper 的包不兼容。
  3. 必须强制访问两个当前 protected 方法
    • $node->getUinitializedViewHelper() 实例持有我们的 $renderingContext,但没有getter,因此强制访问。
    • $view->getCurrentParsedTemplate() 方法是 protected 的,并且强制访问。这两个实例是唯一的 API 违规,但仅因为“无覆盖”策略。然而,它们在保持正确的值在正确的时间方面是完全值得信赖的。
  4. 与最终实现不同,这个有限实现要求您在参数必须应用于特定部分(在该模板中)时,在 f:parameter 上指定 forSection 参数。这意味着从技术上讲,您可以将在模板外部的所有 f:parameter 调用都放置在模板外部,因为嵌套不会产生影响。最终实现将 不会 需要此参数,而是对它的位置(在部分内部或外部)敏感。

解决方案与 forSection 参数不兼容。一旦最终实现完成,此包将被标记为与包括它的任何 Fluid 版本或更高版本的 Fluid 不兼容,到那时您将必须编辑所有模板以删除 forSection 参数。

尽管可以将 f:paramter 放在 f:section 外部并提供 forSection,但仍强烈建议将其放在 f:section 内部,因为最终实现将是层次敏感的。这也有助于减少迁移到最终实现所需的工作量。