プラグインをコピーして使う
2008年11月15日
Nucleus JPフォーラムでのあるトピックで、一つのプラグインを二つの異なるプラグインとしてインストールできれば、有用であるケースがあることを知った。フォーラムでの結論としては、プラグインのPHPファイル及び下層ディレクトリのファイル名を書き換えてコピーし、クラス名も同じ名で書き換えることで対応できるということになった。
このような対応をした場合、後にプラグインのアップグレードをする時は、コピー元とコピーしたプラグインの両方を変更しなければならない。
masさんがtwitterで、これを解決する方法をつぶやいていたので、少しまとめてここにメモ。
結論としては、NP_Calendar_english.phpを次の内容で作成すれば、それでOK。
少し解説。
1)ミソはmasさんのアイデア、『class NP_Calendar_english extends NP_Calendar』。要は、NP_Calendar_englishというクラスが、NP_Calendarと同じ動作をすればよいので、そっくりそのまま継承すればよい。
2)ただし、NP_Calendar_englishクラスの定義の際、NP_Calendarクラスが定義されていないと、fatal errorとなる。そこで必要なのが、『$this->getPlugin('NP_Calendar');』の行。ここで、NP_Calendarオブジェクトを作成している。ちなみに、『$this』はMANAGERオブジェクト。プラグインのPHPファイルは、MANAGER::_loadPlugin()メソッド内で、include()命令により読み込まれているので、『$this』によりMANAGERオブジェクトにアクセス可能。
3)もしプラグインが下層ディレクトリを持っていない場合、上記の1)、2)の実装だけでOKのはず。つまり、
4)h1028さんのコメントを受けて修正し、install(), uninstall()メソッドをオーバライドして、プラグインのインストール時とアンインストール時に、何も行わないようにした。
補足:上記コードは、もしかしたらPHP4ではうまく働かないかもしれない。その場合は、次のように変更すればうまく行くかも。
(2008-11-18 改定)
このような対応をした場合、後にプラグインのアップグレードをする時は、コピー元とコピーしたプラグインの両方を変更しなければならない。
masさんがtwitterで、これを解決する方法をつぶやいていたので、少しまとめてここにメモ。
結論としては、NP_Calendar_english.phpを次の内容で作成すれば、それでOK。
<?php $this->getPlugin('NP_Calendar'); class NP_Calendar_english extends NP_Calendar { function getShortName() { return 'calendar'; } function install() { } function unInstall() { } }
少し解説。
1)ミソはmasさんのアイデア、『class NP_Calendar_english extends NP_Calendar』。要は、NP_Calendar_englishというクラスが、NP_Calendarと同じ動作をすればよいので、そっくりそのまま継承すればよい。
2)ただし、NP_Calendar_englishクラスの定義の際、NP_Calendarクラスが定義されていないと、fatal errorとなる。そこで必要なのが、『$this->getPlugin('NP_Calendar');』の行。ここで、NP_Calendarオブジェクトを作成している。ちなみに、『$this』はMANAGERオブジェクト。プラグインのPHPファイルは、MANAGER::_loadPlugin()メソッド内で、include()命令により読み込まれているので、『$this』によりMANAGERオブジェクトにアクセス可能。
3)もしプラグインが下層ディレクトリを持っていない場合、上記の1)、2)の実装だけでOKのはず。つまり、
<?php $this->getPlugin('NP_Calendar'); class NP_Calendar_english extends NP_Calendar { }でよい。しかし、下層ディレクトリを持っている場合はこれだけではうまく行かない。今の例だと、日本語版のカレンダープラグインでプラグイン独自の言語ファイルを読み込みもうとするとき、『plugins/calendar_english/』ディレクトリ以下のファイルを利用しようとする。これをごまかすには、getShortName()メソッドをオーバライドして、下層ディレクトリに『plugins/calendar/』が利用されるようにすれば良い。
4)h1028さんのコメントを受けて修正し、install(), uninstall()メソッドをオーバライドして、プラグインのインストール時とアンインストール時に、何も行わないようにした。
補足:上記コードは、もしかしたらPHP4ではうまく働かないかもしれない。その場合は、次のように変更すればうまく行くかも。
<?php $this->getPlugin('NP_Calendar'); if (!class_exists('NP_Calendar_english')) { class NP_Calendar_english extends NP_Calendar { function getShortName() { return 'calendar'; } function install() { } function unInstall() { } } }
(2008-11-18 改定)
コメント
佐藤(な) (2008年11月16日 01:51:07)
これ、面白いですね~
ディレクトリ対応までできるところがすごい。
ディレクトリ対応までできるところがすごい。
Kat (2008年11月16日 12:10:42)
でしょ?masさんに感謝。
h1028 (2008年11月17日 06:17:30)
ふと思った事なんですが、例えば独自テーブルを持つプラグインの場合、コピー(クラスを継承)したプラグインをアンインストールすると、コピー元のテーブルは削除されないのでしょうか?
試してはないのですが・・・。
試してはないのですが・・・。
h1028 (2008年11月17日 06:54:34)
独自テーブルを持つプラグインで試してみました。
コピーしたプラグインをアンインストールするとコピー元のテーブルは削除されてしまいました(T_T)。
コピーしたプラグインをアンインストールするとコピー元のテーブルは削除されてしまいました(T_T)。
Kat (2008年11月17日 11:30:19)
あぁぁぁ。すみません。その件については触れて無かったです…。あとで、修正版を出します。テーブルの件での被害が大きくなかったら良いですが…。
h1028 (2008年11月17日 17:03:59)
いえいえ今プラグイン作成の勉強中なので、全てが勉強になります。
またひとつおりこうさんになりました(^○^)。
またひとつおりこうさんになりました(^○^)。
Kat (2008年11月18日 12:26:29)
修正しました。インストール時とアンインストール時に、何も実行しないようにしてあります。
mas (2008年11月20日 14:44:43)
Katさんありがとうございます。
放りっぱなしですみません...
こうまとめていただいてほんと良かったです。
試してみたところ、しっかり動いているようです :-)
放りっぱなしですみません...
こうまとめていただいてほんと良かったです。
試してみたところ、しっかり動いているようです :-)
Kat (2008年11月20日 15:51:40)
いえいえ、すみませんなんてとんでもないです。アイデア、どうも有り難うございました。