テンプレート機能の動作を確認
2007年12月27日
スキン変数<%blog%>を作成して、テストしてみた。新たにblog.phpを作成したが、これは将来的にskin.phpに統合する可能性が高い。
jit::parse_templateメソッドを呼び出すときの4番目の引数、$rowがポイント。下は、更新されたjitクラスの2つのメソッド。
先の$rowは、最終的にjit::parse_compiledメソッドの2番目の引数、$dataに引き継がれる。ここで、$additional_data に指定した",'item'=>&\$data"が利いてくる。めぐりめぐって、最終的にはblog::templatevar_bodyメソッドの、$data['item']に引き継がれることになる。
今の状態で、記事が一つだけの状態で、非常に単純なスキンとテンプレートを用いたトータルのパース時間がおよそ20ミリ秒。チューニングすればもう少し早くなるかも。また、index.phpがコンパイルできればさらに早くなる可能性あり。一方で、Nucleusのデフォルトスキンで記事が一つのときのパース時間はおよそ120ミリ秒。デフォルトスキンの複雑さを考えても、Jeansの方がずいぶん早い(と思いたい)。
<?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ファイルを選択できるようにすれば良い。
例えば、compiled_template などの名のクラスを作成し、そこにテンプレート名でスタティックメソッドを作成する。例えば、compiled_template::default_index とか。テンプレートのパース時にcompiled_templateという名のクラスがあり、使用するテンプレート名のメソッドが存在すればそのまま呼び出せばよい。
同じ考え方は、スキンにも使える。
また、コアやプラグインのphpファイルもそのままindex.phpに挿入してしまえば、include()関数を全く使わずにすむので、かなりのスピードアップが見込める。管理画面のフルコンパイルのページで、挿入したいPHPファイルを選択できるようにすれば良い。