パッケージ領域の優先順位について

2011年1月4日 at 0:35

concrete5.4.1.1用のパッケージ制作を試しているとき、表題の件について疑問に思ったので質問させてください。

concrete5 のシステム基本構造のページを見ると、例えばパッケージ領域内に tools/files/properties.php というファイルを作成してそのパッケージをインストールした状態では、ユーザー領域に tools/files/properties.php が無ければ、コアの tools/files/properties.php は読まずにパッケージ領域内のそれを読みに行くものと解釈していますが、実際にやってみると、どうもパッケージ領域のファイルを読んでくれないようなのです。(tools以外、例えばelementなども同様です)
パッケージのインストール自体はちゃんとできています。

Loader::helper() とか Loader::packageElement() など、$pkgHandle という引数をもつメソッドが鍵なのでは?と思ったりもしますが、これらを何らかの方法でパッケージの controller.php から呼び出せばよいのでしょうか?それとも、そもそも既存ファイルのオーバーライドはパッケージでは行えないものなのでしょうか?
どなたかご存知の方がいらっしゃいましたら教えていただければ幸いです。よろしくお願いいたします。

Re: パッケージ領域の優先順位について

2011年1月4日 at 0:55
確か読んでくれるところとディレクトリはあるのに読んでくれない物があったと思います。
(helperは読んでくれなかったと思います)

この辺の動作もバージョン毎に若干変わっているので確認が必要ですが、パッケージのインストール時に指定してインストールしないといけなかったと思います。
もしかしたら、パッケージ指定でそういったファイルをインストールした場合、そのパッケージが動くときしか読まないかもしれません。

とりあえず5.4.1の段階ではmodelsとかは読んでくれましたよ
 

Re: Re: パッケージ領域の優先順位について

2011年1月4日 at 1:21
taoさん、ありがとうございます。

要するに、パッケージのインストール時(controller.php の ***Package::install() 内)にブロックなら BlockType::installBlockTypeFromPackage()、テーマなら PageTheme::add() を呼び出して登録するように、おそらくhelperなどにも登録用のメソッドがあるだろうということですね。後日調べてみたいと思います。

# 試したところなぜかmodelも読んでくれない様子なので、きっと登録がうまくいっていないのですね…。
 

Re: Re: Re: パッケージ領域の優先順位について

2011年3月9日 at 1:27
今更感がありますが、後日やると書いていてそのままだとまずいと思ったので。

Can a package override the core functionality? (concrete5本家フォーラム)

↑のスレッドなどを参考にしつつ作業してみましたが、自分でファイルを増やす場合はいいものの、既存ファイルの上書き(オーバーライド)については上手く動作しませんでした。

例えばmodelなら、Loader::model(..., 'package'); でオーバーライドを狙うも、「Cannot redeclare class」と、当たり前といえば当たり前のエラーを返してくれます。

前々から言っていたマルチバイト対応をパッケージでできたらと思ったのですが、どうも難しそうですね。というわけで「今後の課題」ということにさせていただこうと思います。

パッケージの使い方というか、位置づけをちゃんと勉強しないといけませんね。
 

Re: Re: Re: Re: パッケージ領域の優先順位について

2011年3月9日 at 3:43
試してないので何とも言えませんが、
Loader::model('package',"package_handle");

で読めるかも。
でもpackageモデルは難しそうですね...