スキンを変更するプラグインのひな形
2005年10月27日
event_PreParseSkinでスキンを変更する様なプラグインを考えてみた。NP_Cacheを参考にすると、コアのコードをプラグインに取り込むことで可能のようである。ただし、行儀の悪いプラグインが出来てしまうことになるのだが…。つまり、Nucleusのバージョンアップがあった場合に、プラグインまでバージョンアップをしないと新しい機能に対応できない、もしくはエラーが出る等の不具合が出ることは十分考えられる。そんな訳なので、今のところこういったプラグインを製作する予定はないが、今後の製作の可能性のためにメモを取っておくことにした。
テスト用のプラグインはNP_preSkinParseという名で製作し、ソースコードは以下の通り。
myEncode()の部分を色々と変えれば、スキンをパース前に変更することが出来る。ただし、この段階では<%parseinclude()%>処理はまだ行われていないので、.incファイルの内容を含めてスキンを調整したい場合は、<%parseinclude()%>処理を行う必要がある。
あと、他のプラグインのPreSkinParseイベントを拾うためには、このプラグインの順位を最下位にするか、もしくはdoParse()関数の最初の所に
を追加する必要がある。ただし、この場合はこの $manager->subscriptions['PreSkinParse']アレイの内容を書き換えて、PreSkinParseイベントがすでに済んだプラグイン(自分自身を含めて)をリストから削除することが必要だと思われる。
テスト用のプラグインはNP_preSkinParseという名で製作し、ソースコードは以下の通り。
<?php class NP_preSkinParse extends NucleusPlugin { function getName() { return 'NP_preSkinParse'; } function getAuthor() { return 'NP_preSkinParse'; } function getURL() { return 'NP_preSkinParse'; } function getVersion() { return '0.1.0a'; } function getDescription() {return 'NP_preSkinParse';} function getEventList() { return array('PreSkinParse','PostSkinParse'); } function myEncode($org){ $skin=$org.'<!--NP_preSkinParse OK 2-->'; return $skin; } function doParse($contents,$skinType,$skinId) { global $manager; // read skin name/description/content type (copied from SKIN class) $res = sql_query('SELECT * FROM '.sql_table('skin_desc').' WHERE sdnumber=' . $skinId); $obj = mysql_fetch_object($res); $IncludeMode = $obj->sdincmode; $IncludePrefix = $obj->sdincpref; /*Following lines were copied from SKIN class. PARSER::setProperty('IncludeMode',$this->getIncludeMode()); PARSER::setProperty('IncludePrefix',$this->getIncludePrefix()); $handler =& new ACTIONS($type, $this); $parser =& new PARSER($actions, $handler); $handler->setParser($parser); $handler->setSkin($this); $parser->parse($contents); $manager->notify('PostSkinParse',array('skin' => &$this, 'type' => $type)); */ PARSER::setProperty('IncludeMode',$IncludeMode); PARSER::setProperty('IncludePrefix',$IncludePrefix); $handler =& new ACTIONS($skinType);//, $mySkin); $parser =& new PARSER(SKIN::getAllowedActionsForType($skinType), $handler); $handler->setParser($parser); $handler->setSkin($skinType); $parser->parse($contents); $manager->notify('PostSkinParse',array('skin' => &$mySkin, 'type' => $skinType)); } function mySkinParse($skinType,$skinId){ $skinId=strval($skinId); $query=mysql_query("select scontent from ".sql_table('skin')." where sdesc=$skinId and stype='$skinType'"); if (!$row=mysql_fetch_object($query)) return false; $skin=stripslashes($row->scontent); $skin=$this->myEncode($skin); $this->doParse($skin,$skinType,$skinId); return true; } function event_PreSkinParse(&$data) { $this->skintypes = array('index','item','archive','archivelist','member'); if (in_array($data['type'],$this->skintypes)) { if ( $this->mySkinParse($data['type'],$data['skin']->id ) ) exit; } } function event_PostSkinParse(&$data) { $type=$data['type']; $id=$data['skin']->id; echo "<!--PostSkinParse OK $type $id -->"; } } ?>
myEncode()の部分を色々と変えれば、スキンをパース前に変更することが出来る。ただし、この段階では<%parseinclude()%>処理はまだ行われていないので、.incファイルの内容を含めてスキンを調整したい場合は、<%parseinclude()%>処理を行う必要がある。
あと、他のプラグインのPreSkinParseイベントを拾うためには、このプラグインの順位を最下位にするか、もしくはdoParse()関数の最初の所に
$manager->notify('PreSkinParse',array('skin' => &$this, 'type' => $type));
を追加する必要がある。ただし、この場合はこの $manager->subscriptions['PreSkinParse']アレイの内容を書き換えて、PreSkinParseイベントがすでに済んだプラグイン(自分自身を含めて)をリストから削除することが必要だと思われる。