Silverstripe 3为TreeDropDownField创建一个装饰器,以便我可以重载树函数

时间:2014-10-24 18:49:09

标签: php silverstripe

在Silverstripe 3中,我们无法为TreeDropDownField创建装饰器,因此我们可以重载树函数并从列表中隐藏页面类型。

我们创建了:

<?php

class TreeDropdownFieldDecorator extends Extension {

    public function tree(SS_HTTPRequest $request) { ...

在_config / config.yml中:

TreeDropdownField:
 extensions:
   - TreeDropdownFieldDecorator

然而,我们实际上并没有让我们的树函数被调用而不是原始函数。这是否可以在装饰器中扩展,如果没有,还有另一种方法可以实现吗?

1 个答案:

答案 0 :(得分:1)

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

两个选项:

1)使用TreeDropdownField为您提供的任意数量的钩子。 (setFilterFunction()看起来像是我的最佳候选者......接受任意回调),但也有像setChildrenMethod()等其他东西。

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

Injector:
  TreeDropdownField:
    class: MyTreeDropdownFieldSubclass

在你的FieldList中:

TreeDropdownField::create(...);

请注意,如果您只是使用&#34; new&#34;则不会注入新类。操作