PEAK XOOPS - resource.db.php をフックすることによるXoopsTpl動作改善 in englishin japanese

Archive | RSS |
XOOPS
XOOPS : resource.db.php をフックすることによるXoopsTpl動作改善
Poster : GIJOE on 2008-01-10 04:53:50 (16293 reads)

in englishin japanese
前回、resouce.db.php をフックできると操作性・開発性などで大きな改善が出来るよ、などと気を持たせておきながら、2ヶ月以上も放置してしまいました。

まず resource.db.php とは何か一応説明しておきます。これは、Smartyのリソースプラグインと呼ばれるものです。中身には「どこからテンプレートを持ってくるか」「更新状況をどうチェックするか」という処理が記述されています。
XOOPSの場合、特に指定しなければ、"db:"テンプレートが呼ばれるために、"db"リソースプラグインが重要なのです。

次に、標準のresource.db.phpによって実装されているDBテンプレートの問題点・要改善点を下に列挙してみます。

(1) テーマがdefaultだとDBテンプレートのリセット処理が入ってしまう
(2) テーマ下テンプレートによってコンパイルキャッシュが作成されるとテーマを切り替えてもそのまま残ってしまう
(3) テーマ下テンプレートのパス themes/(theme)/templates/(dirname)/(block/)? という階層構造は面倒なだけではないか? しかもDBテンプレートの実態を反映していないので余計な混乱を招く恐れがある
(4) テーマ下テンプレートの置き場所がバラバラ 本家だと themes/(theme)/modules/(dirname)/(block/)? だったりする
(5) テーマ下テンプレートが削除されても認識しない
(6) テーマ下テンプレートが追加されてもコンパイルキャッシュより古いと認識しない

このうち、(1)〜(4)について対応した resource.db.php を作ってみました(下リスト参照)。

もちろん、XoopsTplフックのおかげで、このresource.db.phpの置き場所は、XOOPS_TRUST_PATH/libs/smartyplugins/ で良く、Hackではなくなります。

残った(5)と(6)についても、なんとか対応したいと考えてます。


ホダ塾ディストリビューションでは、jidaikoboさんが、skel_flexテーマに対して積極的にテーマ下テンプレートを導入してくれていますが、このresource.db.phpによって、テーマとテンプレートがうまく連動することがお判りいただけるでしょう。(もちろん従来もテーマ下テンプレートは有効でしたが、連動はしなかった)

最新のNightlyアーカイブで試せるはずです。


<?php
/*
 * Smarty plugin
 * ------------------------------------------------------------- 
 * File:     resource.db.php
 * Type:     resource
 * Name:     db
 * Purpose:  Fetches templates from a database
 * -------------------------------------------------------------
 */

function smarty_resource_db_systemTpl($tpl_name)
{
    // Replace Legacy System Template name to Legacy Module Template name
    static $patterns = null;
    static $replacements = null;
    if (!$patterns) {
        $root=&XCube_Root::getSingleton();
        $systemTemplates = explode(',',$root->getSiteConfig('Legacy_RenderSystem','SystemTemplate',''));
        $prefix = $root->getSiteConfig('Legacy_RenderSystem','SystemTemplatePrefix','legacy');
        $patterns = preg_replace('/^\s*([^\s]*)\s*$/e', '"/".preg_quote("\1","/")."/"', $systemTemplates);
        $replacements = preg_replace('/^\s*system_([^\s]*)\s*/', $prefix.'_\1', $systemTemplates);
    }
    if ($patterns) {
        $tpl_name = preg_replace($patterns, $replacements,$tpl_name);
    }
    return $tpl_name;
}

function smarty_resource_db_source($tpl_name, &$tpl_source, &$smarty)
{
	$tpl_name = smarty_resource_db_systemTpl($tpl_name);
	if ( !$tpl = smarty_resource_db_tplinfo( $tpl_name ) ) {
		return false;
	}
	if ( is_object( $tpl ) ) {
		$tpl_source = $tpl->getVar( 'tpl_source', 'n' );
	} else {
		$tpl_source = file_get_contents( $tpl ) ;
	}
	return true;
}

function smarty_resource_db_timestamp($tpl_name, &$tpl_timestamp, &$smarty)
{
	$tpl_name = smarty_resource_db_systemTpl($tpl_name);
	if ( !$tpl = smarty_resource_db_tplinfo( $tpl_name ) ) {
		return false;
	}
	if ( is_object( $tpl ) ) {
		$tpl_timestamp = $tpl->getVar( 'tpl_lastmodified', 'n' );
	} else {
		$tpl_timestamp = filemtime( $tpl );
	}
	return true;
}

function smarty_resource_db_secure($tpl_name, &$smarty)
{
    // assume all templates are secure
    return true;
}

function smarty_resource_db_trusted($tpl_name, &$smarty)
{
    // not used for templates
}

// return object(XoopsTplfile) or string(filepath)
function smarty_resource_db_tplinfo( $tpl_name )
{
	static $cache = array();
	global $xoopsConfig;

	// First, check the cache
	if ( isset( $cache[$tpl_name] ) ) {
		return $cache[$tpl_name];
	}

	$tplset = isset( $xoopsConfig['template_set'] ) ? $xoopsConfig['template_set']: 'default' ;
	$theme = isset( $xoopsConfig['theme_set'] ) ? $xoopsConfig['theme_set'] : 'default';

	// Second, check templates under themes/(theme)/templates/ (file template)
	$filepath = XOOPS_THEME_PATH . '/' . $theme . '/templates/' . $tpl_name ;
	if ( file_exists( $filepath ) ) {
		return $cache[$tpl_name] = $filepath ;
	}

	// Third, find a DB template of the selected tplset
	$tplfile_handler =& xoops_gethandler('tplfile');
	$tplobj = $tplfile_handler->find( $tplset, null, null, null, $tpl_name, true);	if ( empty( $tplobj ) ) {
		// Forth, find a DB template in default tplset
		$tplobj = $tplfile_handler->find( 'default', null, null, null, $tpl_name, true);
		if( empty( $tplobj ) ) return false ;
	}
	return $cache[$tpl_name] = $tplobj[0];
}
?>


Related articles
Printer friendly page Send this story to a friend

Comments list

hi-debow  Posted on 2008/1/21 21:54
GIJOEさん、毎度ありがとうございます。

Quote:
preload/HdXoopsTplHook.class.phpとresource.db.phpの2ファイルですけどね

そうだったのですか? 前の記事をすっかり忘れてしまっておりました・・・

ちなみにpreload/HdXoopsTplHook.class.phpは入れてませんでした。

ですが無い時は無い時で面白い動作に気が付きましたので良かったです。
なんせテーマ内テンプレートを配布するには最適に近く、新しいものしか読み込まなくなりますから。(でもaltsys等で編集されるとだめですけど)
GIJOE  Posted on 2008/1/21 4:30
hi-debowさん、こんにちは。

Quote:

今回のような1ファイル添付のみが良いです。
preload/HdXoopsTplHook.class.phpとresource.db.phpの2ファイルですけどね

Quote:
テンプレート配布に関してテストしておりますが、配布用のテーマ内テンプレートファイル保存時期が現在使用中のDBテンプレートより古いと反映されませんでした。

それが、本記事の(6)ですね。
確かに(5)と(6)まで解決してナンボという部分はあるので、処理速度と使い勝手を両立できる、何かうまい方法がないか考え中です。
(常に強制コンパイルってのだけは避けたい)
hi-debow  Posted on 2008/1/17 14:53 | Last modified
GIJOEさん毎度ありがとうございます。

Quote:
おそらくは、ローカルの編集環境の問題だと思いますよ。
確認いたしましたら、デフォルトの保存形式がShift_JISへ変更したままになっておりました。
もちろん保存形式をEUCへ再設定して日本語を記入しても文字化けしませんでした。

こちらの確認不足でした、すみません。

Quote:
今回のはX2がもともと持っていた機能の改善に過ぎないのですが、同じtrustdirname同士の共通テンプレートのクラス化、となれば、それなりに大規模な工事が必要です。

そうですか・・・大規模なものはダメですね。色々なミスを招きそうですし。
今回のような1ファイル添付のみが良いです。
シンプルかつ効果絶大って所がインパクトありました。

テンプレート配布に関してテストしておりますが、配布用のテーマ内テンプレートファイル保存時期が現在使用中のDBテンプレートより古いと反映されませんでした。
GIJOE  Posted on 2008/1/17 5:22
hi-debow さん、こんにちは。

Quote:

ローカルでX.C.Lを導入してテストをしましたが、theme内DBテンプレートファイルへ日本語を記入している場合は文字化けします。
おそらくは、ローカルの編集環境の問題だと思いますよ。
登録時には、エンコーディング変換は一切かかりません。
オリジナルテンプレートには日本語がないので、デフォルトのShift_JISとして開かれて、そのままセーブされちゃっている、という流れが一番ありそうです。

Quote:
また、当初の話なのですがroot内のd3forumを例えばQandAへ変えている場合と、同じd3モジュールを複数設置している場合はそれらを指定し処理を分ける事はできないものでしょうか?
それはまた別の仕掛けが必要ですね。

今回のはX2がもともと持っていた機能の改善に過ぎないのですが、同じtrustdirname同士の共通テンプレートのクラス化、となれば、それなりに大規模な工事が必要です。
hi-debow  Posted on 2008/1/14 20:58 | Last modified
GIJOEさん、いつもありがとうございます。
コメントで何処までの説明をつけるかは本当に難しいですね。

さて本題なのですが

ローカルでX.C.Lを導入してテストをしましたが、theme内DBテンプレートファイルへ日本語を記入している場合は文字化けします。

altsysを使ってDBテンプレートカスタマイズした場合はモチロン大丈夫なのですが、これは仕方のない事なのでしょうか?

また、当初の話なのですがroot内のd3forumを例えばQandAへ変えている場合と、同じd3モジュールを複数設置している場合はそれらを指定し処理を分ける事はできないものでしょうか?

自分のサイトでのカスタマイズなら今のままで十分すごいものですが、テンプレート作成&配布をするという事を考えると(私だけかもしれませんが・・・)、非常に自由なものになるのではないかと思いました。
GIJOE  Posted on 2008/1/13 5:08
hi-debowさん、こんにちは。

Quote:

先日ダウンロードしたhd_nightlyの中に入っていたskel_flexテーマを参考に疑問点をコメントさせていただきました。

skel_flex/templates/pico/ 以下にはinc_breadcrumbs.htmlが入っています。
skel_flex/ 以下にはpico_inc_breadcrumbs.htmlが入っています。

おお、よく見てますね!
そこまで見た上での質問に対する回答としては、確かに失礼でした。

ただこれは、チェックアウトしたタイミングによる、Nightlyならではの問題です。
すでに修正されています。

もちろん、
skel_flex/templates/pico_inc_bredcrumbs.html
が正しいオーバーライドテンプレートです。


そしてこれは、

- altsysからダウンロードしたアーカイブをそのまま展開したもの
- altsysのテーマ内テンプレートのDB自動取り込み機能のパス
- altsysへアップロードするテンプレートのアーカイブ

これらの既存機能のいずれとも統一されています。
hi-debow  Posted on 2008/1/12 12:02
GIJOEさん、うまく説明できずにすみませんでした。
Quote:
D3モジュールのtemplates/ 下にあるファイルはあくまで雛形です。
たまたま中身が書き換わっていないだけで、XOOPSのDBテンプレートそのものとは本来別物です。

逆に、テーマ下テンプレートとして置けるのはDBテンプレートと同じレベルのテンプレートです。
ありがとうございます。
これは理解していました。

先日ダウンロードしたhd_nightlyの中に入っていたskel_flexテーマを参考に疑問点をコメントさせていただきました。

skel_flex/templates/pico/ 以下にはinc_breadcrumbs.htmlが入っています。
skel_flex/ 以下にはpico_inc_breadcrumbs.htmlが入っています。

inc_breadcrumbs.htmlでしたらtrust側に入っているテンプレートの雛形ファイル名と同じであり、
pico_inc_breadcrumbs.htmlでしたら、root側のモジュールファイル名をpicoとした場合のDBテンプレート名であると思いました。

従って、テーマファイル以下に入れるテンプレートファイル名はどちらを付けた物を入れるのか知りたかったのです。
GIJOE  Posted on 2008/1/12 4:50
hi-debowさん、こんにちは。

Quote:

1) d3モジュールのテンプレートをテーマファイルへ入れる場合にテンプレート名はtrust側dirnameをxoops_trust_path側に入っているテンプレート名の前へつけるのでしょうか?

2) それともtrust側dirnameをxoops_trust_path側に入っているテンプレート名そのままで良いのでしょうか?

3) またroot側dirnameを変更している場合はroot側dirnameをxoops_trust_path側に入っているテンプレート名の前へつけるのですか?
う〜ん。XOOPSテンプレートの基本的な部分で勘違いしているように見えます。
D3モジュールのtemplates/ 下にあるファイルはあくまで雛形です。
たまたま中身が書き換わっていないだけで、XOOPSのDBテンプレートそのものとは本来別物です。

逆に、テーマ下テンプレートとして置けるのはDBテンプレートと同じレベルのテンプレートです。
そしてそれらは、altsysからダウンロードします。(ダウンロードそのものは、X2やLegacyRenderにもあります)

altsysからダウンロードする以上、テンプレートの前にdirnameをつける云々、という議論は存在しません。

Quote:
後、使用していないモジュールのテンプレートを入れておいても特に問題は無いのでしょうか?
問題ありません。単に使われないだけです。
ファイル数が1,000単位になってくると、さすがにファイルシステムのオーバーヘッドも出てくるでしょうけど。
hi-debow  Posted on 2008/1/10 19:15
GIJOEさん、こんにちは。

すごく興味のある内容でしたので早速参考の為にhd_nightly.zipをダウンロードしました。
私のローカル環境はXOOPS2.0.16a JPですので実際のテストは出来ていませんが、付属のテーマファイルを拝見しました。

そこで質問があります。

1) d3モジュールのテンプレートをテーマファイルへ入れる場合にテンプレート名はtrust側dirnameをxoops_trust_path側に入っているテンプレート名の前へつけるのでしょうか?

2) それともtrust側dirnameをxoops_trust_path側に入っているテンプレート名そのままで良いのでしょうか?

3) またroot側dirnameを変更している場合はroot側dirnameをxoops_trust_path側に入っているテンプレート名の前へつけるのですか?

3) の場合はテーマユーザにテンプレート名を変更してもらわないといけませんのでちょっと面倒になるかなと。


後、使用していないモジュールのテンプレートを入れておいても特に問題は無いのでしょうか?
Login
Username or e-mail:

Password:

Remember Me

Lost Password?

Register now!