テンプレート機能の動作を確認
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ファイルを選択できるようにすれば良い。