Nucleus

NP_if

2007年6月4日

テンプレート(アイテム・コメント)で、if, else, endif, ifnot, elseif, elseifnot を使えるようにするプラグインを書いてみた。

コアの改造は、不必要。ただし、処理の重いテンプレート変数での表示を条件分岐するには向いていない。というのは、条件が false の場合でも<%if%>と<%endif%>の間のパースを行ってしまうため(表示はされない)。

このプラグインの最新情報は、公式Wikiに。

ソースコード:
<?php 
class NP_else extends NucleusPlugin{
    var $handler=false;
    function doSkinVar() {
        $args=func_get_args();
        $skinType=array_shift($args);
        $name=substr(get_class($this),3);
        call_user_func_array(array(&$this->handler,'parse_'.$name),$args);
    }
}

class NP_if extends NP_else {
    function getName() { return 'NP_if'; }
    function getMinNucleusVersion() { return 220; }
    function getAuthor()  { return 'Katsumi'; }
    function getVersion() { return '0.1'; }
    function getURL() {return 'http://www.recfor.net/nucleus/?itemid=322';}
    function getDescription() { return $this->getName().' plugin'; } 
    function supportsFeature($what) { return ($what=='SqlTablePrefix')?1:0; }
    function getEventList() { return array('InitSkinParse'); }
    var $handler=false;
    function event_InitSkinParse(&$data){
        global $manager;
        $this->handler=new ACTIONS($data['type']);
        $commands=array('ifnot','else','endif','elseif','elseifnot');
        foreach($commands as $name) {
            $name='NP_'.$name;
            $manager->cachedInfo['installedPlugins'][]=$name;
            $manager->plugins[$name]=new $name;
            $manager->plugins[$name]->handler=&$this->handler;
        }
    }
}

class NP_ifnot extends NP_else {}
class NP_endif extends NP_else {}
class NP_elseif extends NP_else {}
class NP_elseifnot extends NP_else {}
?>
#8行目の『$this->handler』の前に『&』を入れないといけない罠にはまり、2時間ほど抜け出せなかった…。

コメント

コメントはありません

コメント送信