スキンを変更するプラグインのひな形
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イベントがすでに済んだプラグイン(自分自身を含めて)をリストから削除することが必要だと思われる。