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時間ほど抜け出せなかった…。