coreのクラスをパッケージでオーバーライド

2013年10月5日 at 23:25

お世話になります。

/concrete/core/helpers/file.php
をオーバーライドしたく、
http://concrete5-japan.org/community/forums/development/post-6571/
を拝見して
/concrete/helpers/file.php
の中に
class FileHelper extends Concrete5_Helper_File {
//処理
}
とするとうまくいくのですが、

/packages/パッケージ名/helpers/file.php
で同じように書いてもうまくいきません。

パッケージでオーバーライドした場合、

class FileHelper extends FileHelper {
//処理
}

で良いでしょうか?

タグ:

Re: coreのクラスをパッケージでオーバーライド

2013年10月5日 at 23:50
パッケージの場合は置くだけではダメで、パッケージのcontroller.phpのon_startメソッドで指定する必要があります。

class MyPackage extends Package {
...
public function on_start() {
$env = Environment::get();
$env->overrideCoreByPackage('helpers/file.php', $this);
}
}


ただし、完全ではありません。concrete/dispatcher.php に書かれている処理の中で concrete/startup/packages.php を読み込んでいる部分でパッケージがロードされていますが、それより以前にすでに使われているクラスはオーバーライドするには遅いんです…。Fileヘルパーはそれに該当します。なので、パッケージからのオーバーライドは現状無理のようです。
 

Re: coreのクラスをパッケージでオーバーライド

2013年10月6日 at 0:18
なるほど。了解しました。
残念です。
ありがとうございました。
 

Re: coreのクラスをパッケージでオーバーライド

2013年10月6日 at 1:54
これだとアップデートの度に修正しなきゃいけないので、何か良い方法はないでしょうか?
ユーザー領域はどうなんでしょう?
 

Re: coreのクラスをパッケージでオーバーライド

2013年10月6日 at 9:17
ユーザー領域なら大丈夫です。
 

Re: coreのクラスをパッケージでオーバーライド

2013年10月6日 at 12:51
ユーザー領域のみのオーバーライドで問題無い事を確認しました。
これでアップデートしても大丈夫(のはず?)です。

ありがとうございました。