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 ;
}
}
?>