Silversstripe 3为TreeDropDownField创建了一个装饰器,这样我就可以重载树函数


Silverstripe 3 create a decorator for TreeDropDownField so that I can overload the tree function

在Silversstripe 3中,我们在为TreeDropDownField创建装饰器时遇到问题,因此我们可以重载树函数并从列表中隐藏页面类型。

我们创建了:

<?php
class TreeDropdownFieldDecorator extends Extension {
    public function tree(SS_HTTPRequest $request) { ...

在_config/config.yml:中

TreeDropdownField:
 extensions:
   - TreeDropdownFieldDecorator

然而,我们并没有真正调用我们的树函数,而不是原来的树函数。这在装饰器中是可扩展的吗?如果不是,还有其他方法可以实现吗?

看起来您滥用了扩展。它们不像子类那样重载方法。它们将新方法注入到现有类中,核心类也可以调用->extend("someMethod");为您提供一个在运行时修改本机方法的钩子,例如"updateCMSFields",但就纯粹重载方法而言,这只能由子类完成。

两种选择:

1) 使用TreeDropdownField为您提供的任意数量的挂钩。(setFilterFunction()在我看来是最好的候选者…接受任意回调),但也有类似setChildrenMethod()和其他的东西。

2) 使用Injector创建您自己的TreeDropdownField。

Injector:
  TreeDropdownField:
    class: MyTreeDropdownFieldSubclass

在您的字段列表中:

TreeDropdownField::create(...);

请注意,如果只使用"new"运算符,则不会注入新类。