Nucleus

スキンを変更するプラグインのひな形

2005年10月27日

 event_PreParseSkinでスキンを変更する様なプラグインを考えてみた。NP_Cacheを参考にすると、コアのコードをプラグインに取り込むことで可能のようである。ただし、行儀の悪いプラグインが出来てしまうことになるのだが…。つまり、Nucleusのバージョンアップがあった場合に、プラグインまでバージョンアップをしないと新しい機能に対応できない、もしくはエラーが出る等の不具合が出ることは十分考えられる。そんな訳なので、今のところこういったプラグインを製作する予定はないが、今後の製作の可能性のためにメモを取っておくことにした。

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

コメント

コメントはありません

コメント送信