1. 论坛系统升级为Xenforo,欢迎大家测试!
    排除公告

哪位大哥能说说Discuz的程序和摸版分离是如何实现的?

本帖由 xledoo2006-05-21 发布。版面名称:源码讨论

  1. xledoo

    xledoo New Member

    注册:
    2005-11-15
    帖子:
    109
    赞:
    0
    如题~想学习一下!可我初学,不太懂,怎么实现程序和摸版分离呀?

    PHP的程序是如何调用静态摸版的?

    请知道的大哥给说一下~感激!

    比较笨,尽量清楚一下~谢谢了!
     
  2. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33
    dz自己又独立的模版体系,去看看代码就知道。
     
  3. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33
    php调用模版最简单就用file函数读取进来,
    读取数据库替换模版的标签。
     
  4. zmnet

    zmnet Well-Known Member

    注册:
    2006-05-03
    帖子:
    7,809
    赞:
    62
    牛小叶
     
  5. xledoo

    xledoo New Member

    注册:
    2005-11-15
    帖子:
    109
    赞:
    0
    对高手而言可能很简单~~我初学PHP~在DZ的论坛上问这个问题问了几天都没人回答!唉~还是这里比较热情!

    请高手再帮个忙!简单的示范一下吧!
    比如列举几个要用到的函数~然后说说注意什么问题!

    我还以为摸版可以直接include进来,可试了以后include进来摸版里的函数都不能用!有点笨哈!自学是这样的!所以希望有人指点一下下!
     
  6. xledoo

    xledoo New Member

    注册:
    2005-11-15
    帖子:
    109
    赞:
    0
    从最初来到论坛开始对论坛的影象就是”小叶“。。。。
    总是不停的在回帖子。。。
    每个版块都有。。。
    小叶是超人???
     
  7. dwenlee

    dwenlee New Member

    注册:
    2005-09-07
    帖子:
    92
    赞:
    1
    小叶是超人中的超人:D
     
  8. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33
    偶也不太懂,只是发贴比较多,还是去官方混吧。。这里技术太菜鸟。
     
  9. web95

    web95 New Member

    注册:
    2006-05-23
    帖子:
    14
    赞:
    0
    应该是通过函数提取值
    .....................................................................................................................
    [​IMG]
     
  10. xledoo

    xledoo New Member

    注册:
    2005-11-15
    帖子:
    109
    赞:
    0
    官方的人不厚道!!!高手不愿意帮别人,菜鸟又不懂!哎!自己研究~

    有人提过MVC来实现,不过MVC不属于初学范围!!
     
  11. 著名混混

    著名混混 New Member

    注册:
    2006-03-22
    帖子:
    292
    赞:
    1
    asp里是写类,将标签生成写成类,大致也就是些替换了,比如

    aa=replace(aa,"<title>bb</title>","{bb}")

    ,以上是个比较简单得,替换页面标题得,这样就程序和代码分离了。。

    php也是如此
     
  12. yeshou

    yeshou New Member

    注册:
    2005-09-06
    帖子:
    7,067
    赞:
    34
    includes/template.func.php里的function parse_template
     
  13. tetra

    tetra New Member

    注册:
    2006-03-22
    帖子:
    50
    赞:
    0
    :lovely:
     
  14. xledoo

    xledoo New Member

    注册:
    2005-11-15
    帖子:
    109
    赞:
    0
    PHP:
    <?php

    /*
        [Discuz!] (C)2001-2006 Comsenz Inc.
        This is NOT a freeware, use is subject to license terms

        $RCSfile: template.func.php,v $
        $Revision: 1.3 $
        $Date: 2006/02/23 13:44:02 $
    */

    if(!defined('IN_DISCUZ')) {
        exit(
    'Access Denied');
    }

    function 
    parse_template($file$templateid$tpldir) {
        global 
    $language;

        
    $nest 5;
        
    $tplfile DISCUZ_ROOT."./$tpldir/$file.htm";
        
    $objfile DISCUZ_ROOT."./forumdata/templates/{$templateid}_$file.tpl.php";

        if(!@
    $fp fopen($tplfile'r')) {
            
    dexit("Current template file './$tpldir/$file.htm' not found or have no access!");
        } elseif(!include_once 
    language('templates'$templateid$tpldir)) {
            
    dexit("<br>Current template pack do not have a necessary language file 'templates.lang.php' or have syntax error!");
        }

        
    $template fread($fpfilesize($tplfile));
        
    fclose($fp);

        
    $var_regexp "((\\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(\[[a-zA-Z0-9_\-\.\"\'\[\]\$\x7f-\xff]+\])*)";
        
    $const_regexp "([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)";

        
    $template preg_replace("/([\n\r]+)\t+/s""\\1"$template);
        
    $template preg_replace("/\<\!\-\-\{(.+?)\}\-\-\>/s""{\\1}"$template);
        
    $template preg_replace("/\{lang\s+(.+?)\}/ies""languagevar('\\1')"$template);
        
    $template str_replace("{LF}""<?=\"\\n\"?>"$template);

        
    $template preg_replace("/\{(\\\$[a-zA-Z0-9_\[\]\'\"\$\.\x7f-\xff]+)\}/s""<?=\\1?>"$template);
        
    $template preg_replace("/$var_regexp/es""addquote('<?=\\1?>')"$template);
        
    $template preg_replace("/\<\?\=\<\?\=$var_regexp\?\>\?\>/es""addquote('<?=\\1?>')"$template);

        
    $template "<? if(!defined('IN_DISCUZ')) exit('Access Denied'); ?>\n\n$template";
        
    $template preg_replace("/[\n\r\t]*\{template\s+([a-z0-9_]+)\}[\n\r\t]*/is""\n<? include template('\\1'); ?>\n"$template);
        
    $template preg_replace("/[\n\r\t]*\{template\s+(.+?)\}[\n\r\t]*/is""\n<? include template(\\1); ?>\n"$template);
        
    $template preg_replace("/[\n\r\t]*\{eval\s+(.+?)\}[\n\r\t]*/ies""stripvtags('\n<? \\1 ?>\n','')"$template);
        
    $template preg_replace("/[\n\r\t]*\{echo\s+(.+?)\}[\n\r\t]*/ies""stripvtags('\n<? echo \\1; ?>\n','')"$template);
        
    $template preg_replace("/[\n\r\t]*\{elseif\s+(.+?)\}[\n\r\t]*/ies""stripvtags('\n<? } elseif(\\1) { ?>\n','')"$template);
        
    $template preg_replace("/[\n\r\t]*\{else\}[\n\r\t]*/is""\n<? } else { ?>\n"$template);

        for(
    $i 0$i $nest$i++) {
            
    $template preg_replace("/[\n\r\t]*\{loop\s+(\S+)\s+(\S+)\}[\n\r]*(.+?)[\n\r]*\{\/loop\}[\n\r\t]*/ies""stripvtags('\n<? if(is_array(\\1)) { foreach(\\1 as \\2) { ?>','\n\\3\n<? } } ?>\n')"$template);
            
    $template preg_replace("/[\n\r\t]*\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}[\n\r\t]*(.+?)[\n\r\t]*\{\/loop\}[\n\r\t]*/ies""stripvtags('\n<? if(is_array(\\1)) { foreach(\\1 as \\2 => \\3) { ?>','\n\\4\n<? } } ?>\n')"$template);
            
    $template preg_replace("/[\n\r\t]*\{if\s+(.+?)\}[\n\r]*(.+?)[\n\r]*\{\/if\}[\n\r\t]*/ies""stripvtags('\n<? if(\\1) { ?>','\n\\2\n<? } ?>\n')"$template);
        }

        
    $template preg_replace("/\{$const_regexp\}/s""<?=\\1?>"$template);
        
    $template preg_replace("/ \?\>[\n\r]*\<\? /s"" "$template);

        if(!@
    $fp fopen($objfile'w')) {
            
    dexit("Directory './forumdata/templates/' not found or have no access!");
        }

        
    flock($fp2);
        
    fwrite($fp$template);
        
    fclose($fp);
    }

    function 
    addquote($var) {
        return 
    str_replace("\\\"""\""preg_replace("/\[([a-zA-Z0-9_\-\.\x7f-\xff]+)\]/s""['\\1']"$var));
    }

    function 
    languagevar($var) {
        if(isset(
    $GLOBALS['language'][$var])) {
            return 
    $GLOBALS['language'][$var];
        } else {
            return 
    "!$var!";
        }
    }

    function 
    stripvtags($expr$statement) {
        
    //$expr = str_replace("\\\"", "\"", preg_replace("/\<\?\=(\\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\"\'\[\]\$\x7f-\xff]*)\?\>/s", "\\1", $expr));
        
    $expr str_replace("\\\"""\""preg_replace("/\<\?\=(\\\$.+?)\?\>/s""\\1"$expr));
        
    $statement str_replace("\\\"""\""$statement);
        return 
    $expr.$statement;
    }

    ?>

    高手能帮我注释一下吗?
     
  15. 小四

    小四 New Member

    注册:
    2005-09-08
    帖子:
    82
    赞:
    1
    你忽略了最重要的部分,sql那里....

    dz就是在程序里搞出数据,然后替换模版里的东东啊.
     
  16. xledoo

    xledoo New Member

    注册:
    2005-11-15
    帖子:
    109
    赞:
    0
    DZ的模版很特殊,虽然是htm,可里面全是php的!而且这些php写法也不同。
    估计 template.func.php 是一个翻译文件!翻译htm里的这些特殊的PHP!