在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"运算符,则不会注入新类。