2017-06-01 9 views
1

これを探す場所が不明です。私はComposerで自分のサイトに追加したSilverstripeモジュールに変更を加えたいが、後でモジュールを更新するときにカスタムコードを上書きしたくない。Silverstripe - モジュールへのカスタム変更

コアファイルを編集せずにコードの一部をいくつか変更するにはどうすればよいですか?問題のコードは、コントローラ内の関数内にあります。

答えて

1

自分で拡張することができます。 class MyModuleExtension extends Extension

オーバーライド/編集/変更コードがあります。あなたのconfig.yml

、そのような新しい拡張登録:それは間違いなくあなたのケースに依存

OriginalController: 
    extensions: 
    - MyModuleExtension 
+0

それはあなたが使用することはできません、拡張クラスのみが、クラスの公開APIを拡張することができることは注目に値します既存のメソッドをオーバーライドします。 –

4

を。

  • あなたには、いくつかのカスタムメソッドがExtensionを使い追加したい場合は(サイモンの 答えを参照)
  • あなたには、いくつかのデータベースフィールドや関係を追加したい場合は、モジュールがある場合は、DataExtension はあなたの友人
  • です拡張可能であり、フックを提供する場合、 は、(あなたが推測した)拡張機能の動作を変更することができます。モジュールに $this->extend('functionName')を探して、あなたはあなたの拡張方法functionName()

をもの を変更することができます。しかし、時にはそれは バグですか、モジュールが使用できるフックを提供していない場合、あなたは にを持っていますクラスをサブクラス化し、代わりにあなたのサブクラスを使用するようにSilverStripeを伝える:

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

あなたは、あなたのサブクラスであなたのサブクラスですべてのものをコピーする必要があなたの変更や上書き方法を必要としません。この方法で、ほとんどのモジュールアップデートを後で入手できます。

次に、あなたがあなたのconfig.ymlに代わりSomeClassのごMySubClassを使用するようにインジェクターを構成する必要があります。

Injector: 
    SomeClass: 
    class: MySubClass 
+1

何もできない場合があることに注意する価値があります。変更したいクラスがObjectを拡張しない(またはそのコンストラクタを呼び出さない)ため、拡張できず、直接インスタンス化されます。例えば、新しい「SomeClass」を注入することができる。 'SomeClass :: create()' - この場合はまれですが、最初にモジュールを拡張可能にするために、モジュールへのPR以外のことは全くできません –

関連する問題