Nucleus の PostPluginOptionsUpdate にバグ
2007年3月30日
PostPluginOptionsUpdate イベントにバグを見つけた。これは、プラグインオプションを変更したあとに起こるイベントである。このイベントを単独で使用するときにはバグは発生しないが、このイベントより前に起こる別のイベント(PostAuthenticationなど)とともに使用すると、変更されたプラグインオプションの値が、getOption() の戻り値として反映されない。
このバグは、Nucleus 3.24 でも、3月30日現在の CVS 最新版(3.3 ベータ 3)でも同等に見られる。
検証コード:
この検証コードでは、getOption() の別のバグを修正するための記述(最後の3行)も入っている。プラグインオプションを変更しても、PostPluginOptionsUpdateでは反映されないことが分かる。このバグを回避するには、PostPluginOptionsUpdateの冒頭で
を実行すればよい。コアの ADMIN.php をざっと見てみたが、このバグ修正はちょっと複雑かもしれない。3.3 のリリースに間に合うかどうかは、分からない。
追記:
このバグは、Nucleus 3.3 で解消されます。
このバグは、Nucleus 3.24 でも、3月30日現在の CVS 最新版(3.3 ベータ 3)でも同等に見られる。
検証コード:
<?php class NP_ppOptionsUpdate extends NucleusPlugin { function getName() { return quickQuery('SELECT pfile as result FROM '.sql_table('plugin').' WHERE pid='.(int)$this->getID()); } function getMinNucleusVersion() { return 220; } function getAuthor() { return 'Katsumi'; } function getVersion() { return '0.1'; } function getURL() {return 'http://hp.vector.co.jp/authors/VA016157/';} function getDescription() { return $this->getName().' plugin'; } function supportsFeature($what) { return (int)($what=='SqlTablePrefix'); } function getEventList() { return array('PostPluginOptionsUpdate','PostAuthentication'); } function install() { $this->createOption('test','test','yesno','yes'); } function event_PostPluginOptionsUpdate(&$data) { if ($data['plugid']==$this->getId() && $data['context']=='global') { //$this->_aOptionValues = array(); echo ' <script type="text/javascript"> /*<![CDATA[*/ alert("'.htmlspecialchars($this->getOption('test')).'"); /*]]>*/ </script>'; } } function event_PostAuthentication(&$data){ $this->getOption('test'); } function getOption($name){ return $this->_getOption('global', 0, $name); } } ?>
この検証コードでは、getOption() の別のバグを修正するための記述(最後の3行)も入っている。プラグインオプションを変更しても、PostPluginOptionsUpdateでは反映されないことが分かる。このバグを回避するには、PostPluginOptionsUpdateの冒頭で
$this->_aOptionValues = array();
を実行すればよい。コアの ADMIN.php をざっと見てみたが、このバグ修正はちょっと複雑かもしれない。3.3 のリリースに間に合うかどうかは、分からない。
追記:
このバグは、Nucleus 3.3 で解消されます。