首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展SilverStripe模块扩展

扩展SilverStripe模块扩展
EN

Stack Overflow用户
提问于 2016-08-08 12:19:23
回答 2查看 725关注 0票数 3

我在我的SilverStripe安装中安装了一个特定的模块。以下是目录结构

代码语言:javascript
复制
- Root
  - framework
  - cms
  - mymodule
    - code
      - extensions
        - CustomClass.php

下面是CustomClass.php的一个示例

代码语言:javascript
复制
class CustomClass extends Extension {
    public function init() {
    }

    public function customMethod() {
    }
}

我需要覆盖CustomClass类的customMethod方法。我可以很容易地更改这个方法,但是如果模块更新,在这里更改将会在将来造成麻烦。所做的所有更改都将丢失。

为此,我想扩展模块中使用的扩展类。

我已经创建了一个扩展/mysite/extensions/MyCustomClass.php

代码语言:javascript
复制
class MyCustomClass extends Extension {
    public function customMethod() {
       //do my code here
    }
}

但我不知道如何应用它。我以为是CustomClass::add_extension("MyCustomClass "),但这肯定行不通,因为CustomClass中不存在add_extension方法。

我们如何应对这种情况?我可以改用Injector吗?如果是,如何在mysite/_config.php中而不是在_config.yml中调用

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-08 13:38:37

使用injector确实解决了这个问题,但也必须使用_config.yml。这就是我所做的。

文件/mysite/extensions/MyCustomClass.php

代码语言:javascript
复制
class MyCustomClass extends CustomClass {
    public function customMethod() {
       //do my code here
    }
}

/mysite/_config/config.yml中,我添加了以下几行

代码语言:javascript
复制
Injector:
  CustomClass:
    class: MyCustomClass

/mysite/_config.php中,我添加了以下几行

代码语言:javascript
复制
$object = Injector::inst()->create('CustomClass');

一切都运行得很好。

票数 3
EN

Stack Overflow用户

发布于 2016-08-11 07:07:55

还有另一种方法可以实现类似的功能,而不需要直接替换以前的扩展。使用SilverStripe的扩展系统,我们不仅可以控制加载but the order they are loaded的配置设置。这一点很重要,因为来自扩展的customMethod函数使用它从加载的所有扩展中找到的第一个扩展。

因此,只需控制何时加载MyCustomClass扩展,以便您可以运行自己的customMethod函数。

假设"MyModule“模块定义了以下YAML文件:

代码语言:javascript
复制
---
Name: MyModuleExtensions
After:
  - 'framework/*'
  - 'cms/*'
---

Page:
  extensions:
    - CustomClass

我们需要做的就是指定一个单独的YAML文件在这个"MyModule“文件之前运行。这可以像这样完成:

代码语言:javascript
复制
---
Name: MyCustomModule
Before:
  - MyModule/#MyModuleExtensions
---

Page:
  extensions:
    - MyCustomClass

现在,当您在具有扩展的任何类(因此在我的示例中是Page类)上调用customMethod函数时,它将调用您的MyCustomClass扩展中的类。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38821251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档