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

在问一个php的模版与程序分离的问题!大家一定要帮我!

本帖由 xledoo2006-06-01 发布。版面名称:后端开发

  1. xledoo

    xledoo New Member

    注册:
    2005-11-15
    帖子:
    109
    赞:
    0
    再次麻烦各位了~

    照别人的样子,自己写了一段程序与模版分离的code可是并没有多大效果,似乎和直接require_once 的效果差不多!贴出来请大家看看~

    主要问题:看别人的*.htm的模版里 $???? 有效果,比如在index.htm里的<title>$title</title>
    到index.php里require_once template('index');一下就可以把模版装进来,但进来以后
    我的IE头部显示的是“$title”,而不是$title的值!所以请大家帮一下看看!
    自学是比较痛苦的,知其然而不知其所以然,走了不少弯路,高手帮下吧!

    下面贴一下code:
    代码:
    function template($template,$EXT='htm'){
    	global $options;
    	if (!$template) {
    		$template = 'none';
    	}
    	$path = EDOO_ROOT."./templates/".$options['templatename']."/".$template.".".$EXT;
    	if (!file_exists($path)) {
    		$path = EDOO_ROOT.'./templates/default/'.$template.'.'.$EXT;
    	}
    	return $path;
    }
    
    请大家看一下哈~怎么实现我上面说的功能!让require_once 进来的静态模版里的函数显示其值!

    :lovely:
     
  2. arablc

    arablc New Member

    注册:
    2006-06-01
    帖子:
    1
    赞:
    0
    :lovely:
     
  3. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33
    没看出啥问题。。。不过看样式好像是phpwind的模板风格。
    PHP:
    <!--
    <?php print <<<EOT
    -->

    <title>
    $title</title>

    <!-- 
    EOT;
    ?>
    模板做成这个样子看看。
     
  4. xledoo

    xledoo New Member

    注册:
    2005-11-15
    帖子:
    109
    赞:
    0
    上面的是sablog里的!
    用print <<<EOT 似乎可以的吧~~
    sablog的模版也是用的print <<<EOT
    不过我不会!

    再请教一下哈!
    我从Discuz里抠出了它用于分离模版的部分!并放到了我的common.php里!可遇到了以下问题:
    代码:
    Warning: main(C:\Documents and Settings\XLEdoo\My Documents\wwwroot\./forumdata/templates/1_index.tpl.php): failed to open stream: No such file or directory in C:\Documents and Settings\XLEdoo\My Documents\wwwroot\index.php on line 14
    
    Fatal error: main(): Failed opening required 'C:\Documents and Settings\XLEdoo\My Documents\wwwroot\./forumdata/templates/1_index.tpl.php' (include_path='.;c:\php4\pear') in C:\Documents and Settings\XLEdoo\My Documents\wwwroot\index.php on line 14
    
    
    查了一下资料,据说是权限的问题!不过我用的是XP的系统FAT32的分区,应该不存在权限问题的啊!而且我马上安装了DZ进行测试,DZ就能成功生成*.tpl.php的文件!而我抠出来的就不行!
    而且我按照它的错误提示建立了./forumdata/templates/1_index.tpl.php 这个文件,建立以后错误没有了!可是文件还是空的,打开IE也是一片空白,模版根本没有写进去!不知道为什么!但估计不是权限的问题,因为DZ正常工作,难道我抠出来的东西还缺少什么?DZ里有没有设置写入权限的code呢?

    下面是我抠出来的code:
    代码:
    function language($file, $templateid = 0, $tpldir = '') {
    	$tpldir = $tpldir ? $tpldir : TPLDIR;
    	$templateid = $templateid ? $templateid : TEMPLATEID;
    
    	$languagepack = DISCUZ_ROOT.'./'.$tpldir.'/'.$file.'.lang.php';
    	if(file_exists($languagepack)) {
    		return $languagepack;
    	} elseif($templateid != 1 && $tpldir != './templates/default') {
    		return language($file, 1, './templates/default');
    	} else {
    		return FALSE;
    	}
    }
    function template($file, $templateid = 0, $tpldir = '') {
    	global $tplrefresh;
    
    	$tpldir = $tpldir ? $tpldir : TPLDIR;
    	$templateid = $templateid ? $templateid : TEMPLATEID;
    
    	$tplfile = DISCUZ_ROOT.'./'.$tpldir.'/'.$file.'.htm';
    	$objfile = DISCUZ_ROOT.'./forumdata/templates/'.$templateid.'_'.$file.'.tpl.php';
    	if(TEMPLATEID != 1 && $templateid != 1 && !file_exists($tplfile)) {
    		return template($file, 1, './templates/default/');
    	}
    	if($tplrefresh == 1 || ($tplrefresh > 1 && substr($GLOBALS['timestamp'], -1) > $tplrefresh)) {
    		if(@filemtime($tplfile) > @filemtime($objfile)) {
    			require_once DISCUZ_ROOT.'./include/template.func.php';
    			parse_template($file, $templateid, $tpldir);
    		}
    	}
    	return $objfile;
    }
    
    上面的code再加上template.func.php ,应该就是DZ的分离模版的系统了~还缺什么吗?
    大家请帮看一下!
     
    #4 xledoo, 2006-06-01
    最后编辑: 2006-06-01
  5. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33
    dz的好像不止那么简单吧,你直接将文件包含进来,
    dz的好像还有读取,正则分析,还有缓存。
     
  6. xledoo

    xledoo New Member

    注册:
    2005-11-15
    帖子:
    109
    赞:
    0
    生成的*.tpl.php文件也算是模版的缓存了吧~
    模版的分析就是template.func.php 了。。。
     
  7. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33
    不熟悉dz,建议去官方问问。。
     
  8. xledoo

    xledoo New Member

    注册:
    2005-11-15
    帖子:
    109
    赞:
    0
    唉~~官方?还是别提了!那没有小叶这样的超人的~~高手都回家去了~
     
  9. xledoo

    xledoo New Member

    注册:
    2005-11-15
    帖子:
    109
    赞:
    0
    有进展了!

    大家看一下

    index.html
    代码:
    <html>
    <head>
    <title>{title}</title>
    </head>
    <body>
    {main}
    </body>
    </html>
    index.php
    代码:
    <?php
    function template($skin){
            $data=file_get_contents($skin);
            $str = preg_replace('/{([a-zA-Z]+)}/','<?php echo $GLOBALS[\'\\1\']; ?>',"\r\n?>\r\n".$data."\r\n<?php\r\n");
        return eval($str);
    }
    $title='标题';
    $main='内容';
    template('index.html');
    ?>