Nucleus

Nucleus の PostPluginOptionsUpdate にバグ

2007年3月30日

PostPluginOptionsUpdate イベントにバグを見つけた。これは、プラグインオプションを変更したあとに起こるイベントである。このイベントを単独で使用するときにはバグは発生しないが、このイベントより前に起こる別のイベント(PostAuthenticationなど)とともに使用すると、変更されたプラグインオプションの値が、getOption() の戻り値として反映されない。

このバグは、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 で解消されます。

コメント

コメントはありません

コメント送信