resource.(type).php is a smarty plugin controlling:
- which template source is adopted
- how new is the template
Since default template resource of XOOPS is "db:", resource.db.php is the most important file.
Default resource.db.php of XCL2.1 has problems like:
(1) With "default" theme, DB templates will be broken easily
(2) Templates under theme will stay alive even after the theme is changed
(3) Paths of templates under theme should be flat because "db:" is flat.
(4) Directory name of "template under theme" is not unified. (templates or modules)
(5) A template file under theme is not recognized its deletion
(6) A template file under theme is not recognized its addition if the compile cache is newer than the file
I've made a new resource.db.php solving the problems (1),(2),(3), and (4).
Of course, it is not a hack.
Just using "XoopsTpl Hooking" by preload, we can put the file under XOOPS_TRUST_PATH/libs/smartyplugins/
You can test it right now.
Just try hodajuku distribution of nightly build (not a preview version).
The theme of "skel_flex" has many templates.
The tempaltes will be adopted with the theme, hence they will never adopted after switching the theme like "chic_black".
<?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];
}
?>
preload/HdXoopsTplHook.class.phpとresource.db.phpの2ファイルですけどね
今回のような1ファイル添付のみが良いです。
テンプレート配布に関してテストしておりますが、配布用のテーマ内テンプレートファイル保存時期が現在使用中のDBテンプレートより古いと反映されませんでした。
おそらくは、ローカルの編集環境の問題だと思いますよ。
今回のはX2がもともと持っていた機能の改善に過ぎないのですが、同じtrustdirname同士の共通テンプレートのクラス化、となれば、それなりに大規模な工事が必要です。
ローカルでX.C.Lを導入してテストをしましたが、theme内DBテンプレートファイルへ日本語を記入している場合は文字化けします。
また、当初の話なのですがroot内のd3forumを例えばQandAへ変えている場合と、同じd3モジュールを複数設置している場合はそれらを指定し処理を分ける事はできないものでしょうか?
先日ダウンロードしたhd_nightlyの中に入っていたskel_flexテーマを参考に疑問点をコメントさせていただきました。
skel_flex/templates/pico/ 以下にはinc_breadcrumbs.htmlが入っています。
skel_flex/ 以下にはpico_inc_breadcrumbs.htmlが入っています。
D3モジュールのtemplates/ 下にあるファイルはあくまで雛形です。
たまたま中身が書き換わっていないだけで、XOOPSのDBテンプレートそのものとは本来別物です。
逆に、テーマ下テンプレートとして置けるのはDBテンプレートと同じレベルのテンプレートです。
1) d3モジュールのテンプレートをテーマファイルへ入れる場合にテンプレート名はtrust側dirnameをxoops_trust_path側に入っているテンプレート名の前へつけるのでしょうか?
2) それともtrust側dirnameをxoops_trust_path側に入っているテンプレート名そのままで良いのでしょうか?
3) またroot側dirnameを変更している場合はroot側dirnameをxoops_trust_path側に入っているテンプレート名の前へつけるのですか?
後、使用していないモジュールのテンプレートを入れておいても特に問題は無いのでしょうか?