2016-08-08 31 views
3

SilverStripeインストールで特定のモジュールをインストールしました。以下は、ここでは、ディレクトリ構造SilverStripeモジュール拡張の拡張

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

である私はCustomClassクラスのcustomMethodメソッドをオーバーライドする必要がCustomClass.php

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

    public function customMethod() { 
    } 
} 

の一例です。私はこのメソッドを簡単に変更することができますが、ここで変更すると、モジュールが更新されると、将来的にトラブルが発生します。すべての変更は失われます。

このため、モジュールで使用される拡張クラスを拡張したいと思います。

私は拡張子/mysite/extensions/MyCustomClass.php

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

を作成しましたが、私はこれをどのように適用するか見当がつかない。私はCustomClass::add_extension("MyCustomClass ")と考えていましたが、確かにこれは動作しません。add_extensionメソッドがCustomClassに存在しないためです。

このシナリオにはどのように対処しますか?代わりにインジェクターを使用できますか?はいの場合、_config.ymlの代わりにmysite/_config.phpでどのように呼び出すことができますか?

答えて

3

インジェクタを使用すると問題は解決しますが、_config.ymlも使用する必要があります。ここに私がしたことがあります。 /mysite/_config/config.yml

ファイル/mysite/extensions/MyCustomClass.php

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

私は次の行に

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 

私たちは、この「MyModuleという」1前に実行するために、別のYAMLファイルを指定するだけです。これは以下のように行うことができます:あなたは上の拡張機能を持っているどんなクラス上のごcustomMethod関数を呼び出すとき、今

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

Page: 
    extensions: 
    - MyCustomClass 

(ので、私の例で、Pageクラスで)、それはあなたのMyCustomClass拡張子から1を呼び出します。

関連する問題