FS#66 - PostPluginOptionsUpdate で getOption() の戻り値が変更されない
割り当てられたプロジェクト:
オープン者 Katsumi (katsumi) - Saturday, 31 March 2007, 07:38 GMT+9
最終修正者 Katsumi (katsumi) - Wednesday, 31 October 2007, 04:13 GMT+9
オープン者 Katsumi (katsumi) - Saturday, 31 March 2007, 07:38 GMT+9
最終修正者 Katsumi (katsumi) - Wednesday, 31 October 2007, 04:13 GMT+9
|
詳細このイベントより前に起こる別のイベント(PostAuthenticationなど)とともに使用すると、変更されたプラグインオプションの値が、getOption() の戻り値として反映されない。
詳しくは、 http://kandk.cafe.coocan.jp/nucleus/index.php?itemid=268 を参照してください。 |
このタスクが依存しているタスク
$this->_loadPlugin($listener);
の直後に、
if ($eventName==\'PostPluginOptionsUpdate\') $this->plugins[$listener]->_aOptionValues = array();
を入れることなのですが、notify() で PostPluginOptionsUpdate イベントを特別扱いしていることと、PLUGIN クラスのプロパティ、_aOptionValues に直接アクセスしていることで、美しくないコードになっています。将来的なバージョンアップの際のバグの温床になりかねません。
1)MANAGER クラスに次の関数を追加
function &pidLoaded($pid) {
$plugin=false;
reset($this->plugins);
while (list($name) = each($this->plugins)) {
if ($pid==$this->plugins[$name]->getId()) $plugin= & $this->plugins[$name];
}
return $plugin;
}
2)PLUGIN クラスに次の関数を追加
function _delCachedOptionValues(){
$this->_aOptionValues = array();
}
3)PLUGIN::_applyPluginOptions() に次のコードを最後の部分に追加
if (is_object($o)) {
$plugin=& $manager->pidLoaded($o->opid);
if ($plugin) $plugin->_delCachedOptionValues();
}