2016-08-08 6 views
3

Я установил конкретный модуль в моей установке SilverStripe. Ниже структураРасширение расширения модулей SilverStripe

- Root 
    - framework 
    - cms 
    - mymodule 
    - code 
     - extensions 
     - CustomClass.php 

каталогов Ниже приведен пример CustomClass.php

class CustomClass extends Extension { 
    public function init() { 
    } 

    public function customMethod() { 
    } 
} 

мне нужно переопределить customMethod метод CustomClass класса. Я мог бы легко изменить этот метод, но изменение здесь вызовет проблемы в будущем, если модули будут обновлены. Все внесенные изменения будут потеряны.

Для этого я хочу расширить класс расширения, используемый в модулях.

Я создал расширение /mysite/extensions/MyCustomClass.php

class MyCustomClass extends Extension { 
    public function customMethod() { 
     //do my code here 
    } 
} 

, но я понятия не имею, как применить это. Я думал CustomClass::add_extension("MyCustomClass "), но, конечно, это не сработает, потому что add_extension метод не существует в CustomClass.

Как мы справляемся с этим сценарием? Можно ли использовать Injector вместо этого? Если да, то как его можно вызвать в mysite/_config.php вместо _config.yml?

ответ

3

Использование форсунки разрешает проблему, но также необходимо использовать _config.yml. Вот что я сделал.

Файл /mysite/extensions/MyCustomClass.php

class MyCustomClass extends CustomClass { 
    public function customMethod() { 
     //do my code here 
    } 
} 

в /mysite/_config/config.yml я добавил следующие строки

Injector: 
    CustomClass: 
    class: MyCustomClass 

И в /mysite/_config.php я добавил следующие строки

$object = Injector::inst()->create('CustomClass'); 

И все это работало нормально.

3

Существует еще один способ достижения аналогичной функциональности без прямой замены предыдущего расширения. С помощью системы расширения SilverStripe мы можем управлять не только тем, какие настройки конфигурации загружены but the order they are loaded. Это важно отметить, поскольку функция customMethod из расширения использует первый найденный из всех загруженных расширений.

Из-за этого может быть только вопрос контроля при добавлении расширения MyCustomClass, чтобы вы могли запустить свой собственный customMethod.

Допустим, модуль «MyModule» имеет следующий файл YAML определен:

--- 
Name: MyModuleExtensions 
After: 
    - 'framework/*' 
    - 'cms/*' 
--- 

Page: 
    extensions: 
    - CustomClass 

Все, что нам нужно сделать, это указать отдельный YAML файл для запуска до этого «MyModule» один.Это может быть достигнуто, как:

--- 
Name: MyCustomModule 
Before: 
    - MyModule/#MyModuleExtensions 
--- 

Page: 
    extensions: 
    - MyCustomClass 

Теперь, когда вы называете customMethod функцию на любой класс у вас есть свои расширения на (так в моем примере Page класса), он будет вызывать один из ваших MyCustomClass расширения.