NP_if
2007年6月4日
テンプレート(アイテム・コメント)で、if, else, endif, ifnot, elseif, elseifnot を使えるようにするプラグインを書いてみた。
コアの改造は、不必要。ただし、処理の重いテンプレート変数での表示を条件分岐するには向いていない。というのは、条件が false の場合でも<%if%>と<%endif%>の間のパースを行ってしまうため(表示はされない)。
(このプラグインの最新情報は、公式Wikiに。)
ソースコード:
コアの改造は、不必要。ただし、処理の重いテンプレート変数での表示を条件分岐するには向いていない。というのは、条件が 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.rad51.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時間ほど抜け出せなかった…。