设为首页收藏本站

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 388|回复: 0

Discuz! x2更新DIY模板分析

[复制链接]
发表于 2012-4-4 13:17:20 | 显示全部楼层 |阅读模式
碰到一个DIY模板更新的问题,顺便分析了下更新的机制,整理记录下来了就。
哪些是DIY模板呢?
DIY模板加载的代码比较特殊,具体格式类似下面
  1. include template('diy:***');
复制代码
**为其他内容,不限。
如加载论坛首页的代码:
  1. include template('diy:forum/discuz:'.$gid);
复制代码
模板是如何加载的呢?
这里不对x2默认的模板加载方式进行分析,只针对DIY部分的更新加以说明。
找到source/function/function_core.php文件,找到template函数,在函数里可找到如下代码:
  1. if($tpldir == 'data/diy' && ($tplrefresh ==1 || ($tplrefresh > 1 && !($_G['timestamp'] % $tplrefresh))) && filemtime($diypath.$file.'.htm') < filemtime(DISCUZ_ROOT.TPLDIR.'/'.($primaltpl ? $primaltpl : $oldfile).'.htm')) {
  2.         if (!updatediytemplate($file)) {
  3.                 unlink($diypath.$file.'.htm');
  4.                 $tpldir = '';
  5.         }
  6. }
复制代码
这段就是判断如果是DIY模板,同时满足更新条件,则更新相应的DIY模板。
更新的操作为updatediytemplate($file)。
还是在function_core.php文件里,找到updatediytemplate函数,代码如下:
  1. function updatediytemplate($targettplname = '') {
  2.         global $_G;
  3.         $r = false;
  4.         $where = empty($targettplname) ? '' : " WHERE targettplname='$targettplname'";
  5.         $query = DB::query("SELECT * FROM ".DB::table('common_diy_data')."$where");
  6.         require_once libfile('function/portalcp');
  7.         while($value = DB::fetch($query)) {
  8.                 $r = save_diy_data($value['primaltplname'], $value['targettplname'], unserialize($value['diycontent']));
  9.         }
  10.         return $r;
  11. }
复制代码

common_diy_data表里存放的就是DIY数据,数据格式类似如下:

这里会从common_diy_data中查出更新的源文件和目前文件。
找到source/function/function_portalcp.php,找到save_diy_data函数,有如下代码:

  1. function save_diy_data($primaltplname, $targettplname, $data, $database = false, $optype = '') {
  2.         global $_G;
  3.         if (empty($data) || !is_array($data)) return false;
  4.         checksecurity($data['spacecss']);
  5.         $file = ($_G['cache']['style_default']['tpldir'] ? $_G['cache']['style_default']['tpldir'] : './template/default').'/'.$primaltplname.'.htm';
  6.         if (!file_exists($file)) {
  7.                 $file = './template/default/'.$primaltplname.'.htm';
  8.         }
  9.         if(!file_exists($file)) return false;
  10.         ......(中间的部分省略)
  11.         return $r;
  12. }
复制代码
注意里面的这句代码
  1. $file = ($_G['cache']['style_default']['tpldir'] ? $_G['cache']['style_default']['tpldir'] : './template/default').'/'.$primaltplname.'.htm';
复制代码
这里会以你当前使用的风格路径下的相应文件$primailtplname.htm为源文件进行更新。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|BC Morning Website ( Best Deal Inc. 001 )  

GMT-8, 2025-12-12 22:30 , Processed in 0.017248 second(s), 16 queries .

Supported by Best Deal Online X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表