XCL2.1でのXoopsTplフック方法

Date 2007-11-01 06:03:50 | Category: XOOPS

in englishin japanese
XCDM#1でも発表したネタなのですが、XCL2.1ではpreload一発で、レンダラーのかなり大きな部分をフックすることができます。
preloadでフックするべきデリゲート名は、おなじみ 'XoopsTpl.New' です。

まずはソースコードを見てください。

フック処理が来た直後に、
XOOPS_TRUST_PATH/libs/smartyplugins
を、Smartyプラグイン用ディレクトリとして挿入してます。

「これ、どこかで見たことあるな」と思った人は勘がいいです。まさに、
http://ryus.co.jp/modules/wordpress/index.php?p=57
と同じですから。

でも、ryusSmartyPluginsEx との違いは、追加ではなく挿入していることです。
ユーザディレクトリから先に探すことにより、デフォルトのSmartyプラグインを乗っ取ることができるのです。

そして、乗っ取って一番面白いのは、やはり resource.db.php でしょう。XOOPS_TRUST_PATH/libs/smartyplugins/resource.db.php にDBリソースの見つけ方を記述することで、テンプレートの動作を自由にコントロールできます。(その具体例は次回)

このpreloadにおける hook()メソッドでは、それ以外に、コンパイルIDの指定を行っています。これによって、テーマ毎に異なるコンパイルキャッシュを生成するようになり、テーマを切り替えたけどテンプレートは切替前のテーマ付属のテンプレートのまま、というトラブルを避けることができます。

このあたりは、本家版コアのパクリですが、コアの構成ファイルを一切おきかえずとも、このような重要な仕様改善ができるというのは、まさにXCL2.1の真骨頂でしょう。
preload/HdXoopsTplHook.class.php

<?php

class HdXoopsTplHook extends XCube_ActionFilter
{
	function preBlockFilter()
	{
		$this->mRoot->mDelegateManager->add( 'XoopsTpl.New' , array( $this , 'hook' ) ) ;
	}

	function hook( &$xoopsTpl )
	{
		global $xoopsConfig ;

		array_unshift( $xoopsTpl->plugins_dir , XOOPS_TRUST_PATH.'/libs/smartyplugins' ) ;
		$compile_id = $xoopsConfig['template_set'] . '-' . $xoopsConfig['theme_set'] ;
		$xoopsTpl->compile_id = $compile_id ;
		$xoopsTpl->_compile_id = $compile_id ;
	}
}

?>




You can read more news at PEAK XOOPS.
http://xoops.peak.ne.jp

The URL for this story is:
http://xoops.peak.ne.jp/md/news/index.php?page=article&storyid=448