namelesscoder/typo3-cms-fluid-gap

此包已被废弃,不再维护。未建议替代包。

2.0.1 2016-10-18 11:06 UTC

This package is not auto-updated.

Last update: 2016-11-18 14:16:50 UTC


README

一个微型库,用于填补TYPO3 CMS 7.6和8.x版本之间的差距

为什么需要它?

在Standalone Fluid 1.1.0及以上版本中,ViewHelper编译得到了特质(Traits)的帮助,这使得ViewHelper可以简单地包含一个特质,并自动变得可编译。然而,由于签名差异,当这些ViewHelper属于必须同时在TYPO3 CMS 7.6和8.x上运行的包时,无法在TYPO3 CMS ViewHelpers上实现compile()方法。目前有两个这样的特质

  • CompileWithRenderStatic 通过插入对ViewHelper上的renderStatic函数的直接调用来编译ViewHelper(然后你必须实现它!)
  • CompileWithContentArgumentAndRenderStatic 也编译成对renderStatic的调用,但增加了额外的行为,即第一个可选参数用作“内容参数”,这意味着如果该参数为空,则调用renderChildren()以检索值。这是通过创建一个替代闭包来实现的,以替换renderChildrenClosure。这在TYPO3 CMS和扩展中是一个相当常见的用例,特质的好处是您无需检查参数数组中设置的值 - 您可以无差别地调用为renderStatic方法提供的$renderChildrenClosure(),它将返回正确的值

基本上:您需要这个桥梁库来跨版本编译TYPO3 CMS Fluid ViewHelper - 并且您“需要”(即想要)它极大地减少ViewHelper的大小和代码重复。

它做什么?

由于Fluid Standalone更改了ViewHelper上compile()方法的签名,从需要AbstractNode更改为需要正确的ViewHelperNode,以及TemplateCompiler类的新命名空间位置,因此需要一个桥梁库来提供具有相同类名但不同签名的特质,并且在不破坏PHP 7.0+的严格签名要求的情况下(这是TYPO3 CMS 8.x的要求)这样做。

因此

  • 在TYPO3 CMS 8.4及以上版本中,该包提供了从Fluid Standalone版本1.1.0+对应的特质的别名。这使得ViewHelper可以使用桥梁特质,效果与使用“真实”特质相同。
  • 在TYPO3 CMS 7.6中,该包提供了特质的自定义实现,部分重写了Fluid Standalone 1.1.0的实现,以适应这个版本并且仅适应这个版本。

这意味着,通过将此包作为依赖项添加并使用特质的桥梁版本,您的TYPO3扩展可以提供完美可编译的ViewHelper(当它们符合两个标准用例时),并在TYPO3 CMS 7.6和8.x上以相同的方式工作。

安装

为了包含此依赖项,您必须使用版本限制来匹配此包的1.0 2.0分支 - 或使用通配符。这允许Composer根据选择的TYPO3 CMS版本选择适当的桥梁库版本。

有效的require语句可以是以下示例

composer require namelesscoder/typo3-cms-fluid-gap:*
composer require "namelesscoder/typo3-cms-fluid-gap:>=1.0 <2.1"
composer require "namelesscoder/typo3-cms-fluid-gap:1.0 - 2.0"

根据您选择的严格程度,您可以选择上述任何一种,但后两种推荐,因为它们将版本限制为1.0.x或2.0.x。

关于CompilableInterface的特殊说明

一点历史背景:在TYPO3 CMS 7.6中存在一个接口,它指示Fluid TemplateCompiler,一个ViewHelper支持编译(例如,实现了compile()方法)。自从Fluid Standalone以及因此TYPO3 CMS 8.x以来,此接口已不再存在 - 它已被与要求有意禁用编译的回退编译机制所取代。

这意味着您将实现一个在您的支持版本之一(即8.x)中已弃用的接口。遗憾的是,这是不可避免的。

此外,它要求您准备在您的扩展不再支持TYPO3 CMS 7.6时删除此接口的实现。并且它要求您在您的扩展必须开始支持一个在移除已弃用接口的临时别名时,放弃在TYPO3 CMS 7.6上的编译支持。

所以这是一个您必须准备稍后解决的警告。

一个在TYPO3 CMS 7.6和8.x上正常工作但注册为在TYPO3 CMS 8.x上已弃用的使用的示例实现

namespace My\Extension\ViewHelpers;

class MySpecialViewHelper implements \TYPO3\CMS\Fluid\Core\ViewHelper\CompilableInterface
{    
    use \NamelessCoder\FluidGap\Traits\CompileWithRenderStatic;
    // when using a "content argument" taken from `renderChildren()` if argument is empty:
    // use \NamelessCoder\FluidGap\Traits\CompileWithContentArgumentAndRenderStatic;

    public static function renderStatic(
        array $arguments, 
        \Closure $renderChildrenClosure, 
        TYPO3\CMS\Fluid\Core\Rendering\RenderingContextInterface $renderingContext
    ) {
        return 'This is what my ViewHelper returns';
    }
}

旁白:在TYPO3 CMS 8.x中,RenderingContextInterface也已弃用,并在删除后将需要迁移。TYPO3 CMS 8.4似乎将收到一个迁移分析工具,该工具将捕获您的扩展和第三方扩展中的此类事件。