在Silverstripe 3中,我们无法为TreeDropDownField创建装饰器,因此我们可以重载树函数并从列表中隐藏页面类型。
我们创建了:
<?php
class TreeDropdownFieldDecorator extends Extension {
public function tree(SS_HTTPRequest $request) { ...
在_config / config.yml中:
TreeDropdownField:
extensions:
- TreeDropdownFieldDecorator
然而,我们实际上并没有让我们的树函数被调用而不是原始函数。这是否可以在装饰器中扩展,如果没有,还有另一种方法可以实现吗?
答案 0 :(得分:1)
看起来你在滥用扩展程序。它们不像子类那样重载方法。他们将新方法注入到现有类中,核心类也可以调用 - &gt; extend('someMethod');为您提供在运行时修改本机方法的钩子,例如: “updateCMSFields”,但就纯粹重载方法而言,只能由子类完成。
两个选项:
1)使用TreeDropdownField为您提供的任意数量的钩子。 (setFilterFunction()看起来像是我的最佳候选者......接受任意回调),但也有像setChildrenMethod()等其他东西。
2)使用Injector创建自己的TreeDropdownField。
Injector:
TreeDropdownField:
class: MyTreeDropdownFieldSubclass
在你的FieldList中:
TreeDropdownField::create(...);
请注意,如果您只是使用&#34; new&#34;则不会注入新类。操作