General

テンプレート機能の動作を確認

2007年12月27日

スキン変数<%blog%>を作成して、テストしてみた。新たにblog.phpを作成したが、これは将来的にskin.phpに統合する可能性が高い。

<?php

/* begin xml
<?xml version='1.0'?>
<document>
  <skinvars>
    <class>blog</class>
    <type>normal</type>
    <skinvar><name>blog</name><method>skinvar_blog</method></skinvar>
    <templatevar><name>title</name><method>templatevar_body</method></templatevar>
    <templatevar><name>body</name><method>templatevar_body</method></templatevar>
    <templatevar><name>more</name><method>templatevar_body</method></templatevar>
  </skinvars>
</document>
/* end xml */

class blog {
    static private $id=CONF_DEFAULT_BLOG;
    static public function init(){
    }
    static public function setBlogID($id){
        self::$id=$id;
    }
    static public function skinvar_blog($data,$tempname,$num=10){
        $res=sql::query('SELECT i.inumber as itemid, i.ititle as title, i.ibody as body, i.imore as more '.
            'FROM jeans_item as i '.
            'WHERE iblog=<%1%> AND idraft=0 '.
            'ORDER BY itime DESC '.
            'LIMIT <%2%>, <%3%>',
            array((int)self::$id,(int)@$_GET['startpos'],(int)$num));
        while($row=sql::fetch_assoc($res)){
            jit::parse_template($tempname,'ITEM',",'item'=>&\$data",$row);
        }
    }
    static public function templatevar_body($data){
        $item=&$data['item'];
        jit::parse_item($item[$data['varname']]);
    }
}

jit::parse_templateメソッドを呼び出すときの4番目の引数、$rowがポイント。下は、更新されたjitクラスの2つのメソッド。

    static public function parse_compiled($code,&$data=null){
        $do_not_use_this=false;
        eval("\$do_not_use_this=false; ?>$code<?php \$do_not_use_this=true;");
        if (E_NOTICE && !$do_not_use_this) core::echohtml('<hr /><pre><%1%></pre><hr />',$code);
    }
    static public function parse_template($tempname,$type,$additional_data='',&$data=null){
        // Get the template string.
        $tempstr=self::rawTemplate($tempname,$type);
        // Compile and parse.
        self::parse_compiled(
            self::compile($tempstr,'templatevar',",'template'=>'$tempname'".$additional_data),
            $data);
    }

先の$rowは、最終的にjit::parse_compiledメソッドの2番目の引数、$dataに引き継がれる。ここで、$additional_data に指定した",'item'=>&\$data"が利いてくる。めぐりめぐって、最終的にはblog::templatevar_bodyメソッドの、$data['item']に引き継がれることになる。

今の状態で、記事が一つだけの状態で、非常に単純なスキンとテンプレートを用いたトータルのパース時間がおよそ20ミリ秒。チューニングすればもう少し早くなるかも。また、index.phpがコンパイルできればさらに早くなる可能性あり。一方で、Nucleusのデフォルトスキンで記事が一つのときのパース時間はおよそ120ミリ秒。デフォルトスキンの複雑さを考えても、Jeansの方がずいぶん早い(と思いたい)。

コメント

Kat (2007年12月28日 22:43:06)

テンプレートのフルコンパイル(index.phpの作成)で一つ思いついたので、メモ。
例えば、compiled_template などの名のクラスを作成し、そこにテンプレート名でスタティックメソッドを作成する。例えば、compiled_template::default_index とか。テンプレートのパース時にcompiled_templateという名のクラスがあり、使用するテンプレート名のメソッドが存在すればそのまま呼び出せばよい。

同じ考え方は、スキンにも使える。

また、コアやプラグインのphpファイルもそのままindex.phpに挿入してしまえば、include()関数を全く使わずにすむので、かなりのスピードアップが見込める。管理画面のフルコンパイルのページで、挿入したいPHPファイルを選択できるようにすれば良い。

コメント送信