Silverstripe - 自定义模块更改

时间:2017-06-01 06:32:06

标签: module silverstripe

不知道在哪里寻找这个。我想对使用composer添加到我网站的Silverstripe模块进行更改,但是我不希望在稍后更新模块时覆盖自定义代码。

如何在不编辑核心文件的情况下对某些代码进行一些更改?有问题的代码位于控制器中的函数中。

2 个答案:

答案 0 :(得分:4)

这绝对取决于你的情况。

  • 如果您想添加一些自定义方法,请使用Extension(请参阅Simon的 回答)
  • 如果要添加一些数据库字段或关系,请使用DataExtension 是你的朋友
  • 如果模块是可扩展的并提供挂钩,那么 可以改变你(你猜对了)扩展的行为。寻找 在模块中$this->extend('functionName'),您可以修改内容 在您的分机
  • 中的方法functionName()

但有时它是一个 bug或模块没有提供你可以使用的钩子,那么你有 将该类子类化并告诉SilverStripe使用您的子类:

class MySubClass extends SomeClass
{
    public function doSomething()
        $something = parent::doSomething();
        //your changes
        return $something;
    }
}

您只需要在子类中进行更改和覆盖方法,无需复制子类中的所有内容。这样,您将在以后获得大多数模块更新。

然后您需要配置Injector以在config.yml中使用MySubClass而不是SomeClass

Injector:
  SomeClass:
    class: MySubClass

答案 1 :(得分:1)

您可以对其进行自己的扩展,例如class MyModuleExtension extends Extension

并覆盖/编辑/更改代码。

config.yml中,注册新的扩展名,如下所示:

OriginalController:
  extensions:
    - MyModuleExtension