免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2760 | 回复: 10
打印 上一主题 下一主题

我也发布一个模版! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-11 09:08 |只看该作者 |倒序浏览
啥都不说了,看代码吧!


  1. <?php
  2. /*
  3. *名称:     assets模版
  4. *版本:     1.16
  5. *作者:     achun
  6. *email:    achun.shx@gmail.com
  7. *版权:     BSD
  8. *简单介绍:
  9. *          根据axgle的assettemplate 改造的更精简的模版
  10. *          其实就是自动加上烦人的echo<<<EOT 和 EOT;
  11. *          吸取了assettemplate中$asset的技巧
  12. *          因为更简单所以命名为assets
  13. *
  14. */
  15. class assets {

  16.     /*
  17.      *模版所在目录
  18.      *加上..的目的很简单,../tpl在网站/目录的上层,这样用户就不能访问了.
  19.      */
  20.     var $tpl_dir = '../tpl';

  21.     /*
  22.      *道理和$tpl_dir一样,不过由于在我的设计里只有一个入口就是index.php
  23.      *所有可以这样安排目录,如果你的需求不是这样就要改改了
  24.      */
  25.     var $cpl_dir= '../tpl_c';
  26.     /*
  27.      *asset的路径了,这个的作用axgle说的很好
  28.      *不明白的还是找找axgle的文章吧.
  29.      */
  30.     var $asset_dir;
  31.     function assets($dir='asset') {
  32.         $this->asset_dir=$dir;
  33.     }
  34.     /*
  35.      *整个模版的编译就在这里,就是字符串替换了
  36.      *例子:
  37.             <!---begin--->
  38.             <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  39.             <html xmlns="http://www.w3.org/1999/xhtml">
  40.             <head>
  41.             <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  42.             <script type="text/javascript" src="$asset/js/prototype.js" />
  43.             <link rel="stylesheet" rev="stylesheet" href="/$asset/css/style.css" type="text/css" media="all" />
  44.             <!---if($_SERVER['REMOTE_ADDR']=='127.0.0.1'){--->
  45.             <title>本地访问</title>
  46.             <!---}else{--->
  47.             <title>远程访问</title>
  48.             <!---}--->
  49.             </head>
  50.             <body>
  51.             </body>
  52.             </html>
  53.             <!---end--->
  54.      *说明:
  55.      *      如果模版中有php的代码就必须用<!---begin--->和<!---end--->
  56.      *      把它们包起来,所有的php代码都用<!---code--->的形式写
  57.      *      注意{}的用法,switch也可以支持自己试试就知道具体的写法了.
  58.      */
  59.     function _compiled($tpl,&$cpl_file){
  60.         $tpl_file=$this->tpl_dir."/$tpl";
  61.         $cpl_file=$this->cpl_dir."/$tpl.htm";
  62.         if(!file_exists($tpl_file)) return false;
  63.         if(file_exists($cpl_file)){
  64.             if(filemtime($cpl_file) >= filemtime($tpl_file)) return true;
  65.         }
  66.         $data=$this->_read($tpl_file);
  67.         $data=str_replace('<!---begin--->','<?php'."\r\n".'echo<<<EOT',$data);
  68.         $data=str_replace('<!---end--->',"\r\n".'EOT;'."\r\n".'?>',$data);
  69.         $data=str_replace('<!---',"\r\n".'EOT;'."\r\n",$data);
  70.         $data=str_replace('--->',"\r\n".'echo<<<EOT',$data);
  71.         return $this->_write($cpl_file,$data);
  72.     }
  73.     function display($tpl){
  74.         $cpl_file='';
  75.         if(!$this->_compiled($tpl,$cpl_file)){
  76.             return false;
  77.         }
  78.         extract((array)$this);
  79.         $asset='$'.$this->asset_dir;
  80.         include $cpl_file;
  81.         return true;
  82.     }
  83.     function fetch($tpl) {
  84.         ob_start();
  85.         $this->display($tpl);
  86.         $data=ob_get_contents();
  87.         ob_end_clean();
  88.         return $data;
  89.     }
  90.     function _read($filename,$mode="rb") {
  91.         if($fp=@fopen($filename,$mode)) {
  92.             flock($fp,LOCK_SH);
  93.             $read_data=fread($fp,filesize($filename));
  94.             fclose($fp);
  95.         }
  96.         return $read_data;
  97.     }

  98.     function _write($filename,$data,$mode="wb") {
  99.         if($fp=@fopen($filename,$mode)) {
  100.             flock($fp,LOCK_EX);
  101.             fwrite($fp,$data);
  102.             fclose($fp);
  103.             return true;
  104.         }
  105.         return false;
  106.     }
  107. }
  108. ?>
复制代码

论坛徽章:
0
2 [报告]
发表于 2006-12-15 00:07 |只看该作者
今天发现这个设计有一个特性就是你可以在模版文件中直接写php代码
而编译后的代码将和你写的一模一样,
这个特性可是很有用的呀!
什么用处,哈如果你要在模版中操作session,cookie的话不用担心
类似其它模版会出现先有输出的问题
例如你可以这样写

  1. <?php
  2. session_xxxxxx_code
  3. .........
  4. ?>
  5. <!---begin--->
  6. xxxxxxx
  7. <!---end--->
复制代码

哈!开心!

论坛徽章:
0
3 [报告]
发表于 2006-12-15 10:32 |只看该作者
弱弱的问一下,html中的<!--- --->是注释符,那么里面的php代码解析,是php的功能吗?我算新手了,没用过模板,但在php手册中没找到这种引用php代码的方式。请教一下啊。

论坛徽章:
0
4 [报告]
发表于 2006-12-15 10:50 |只看该作者
顶一下。

论坛徽章:
0
5 [报告]
发表于 2006-12-17 21:52 |只看该作者
原帖由 lzhome 于 2006-12-15 10:32 发表
弱弱的问一下,html中的<!--- --->是注释符,那么里面的php代码解析,是php的功能吗?我算新手了,没用过模板,但在php手册中没找到这种引用php代码的方式。请教一下啊。

简单说,
模版的作用有2个:
   1.让php 和 html 混合的代码可以直接在浏览器下正常显示,所以多数php模版都利用<!---->是html注释的定义,
   把php代码写在<!---->中,然后在执行的时候通过字符串替换,转换成php可以正确执行的php 和 html 混合的代码,
   当然最常见的混合方式就是

  1. <?php
  2. phpcode
  3. echo<<<EOT
  4. htmlcode
  5. EOT;
  6. ?>
复制代码

了.
  2.另一个作用我觉得更重要,就是模版实现了数据和表现的封装,这才是他真正的价值所在。如果单单是为了php 和 html 混合的话
根本就不需要模版了,因为php本身就是一个php 和 html 混合的模版.
关于模版作用的很不错的文章建议你看看axgle的文章,写的很好,本bbs就有搜一下就知道了.

论坛徽章:
0
6 [报告]
发表于 2006-12-18 13:24 |只看该作者
有个缺点就是:
模版会输出多余\n的符号,在某些输出严格的场合会有问题,这是用<<<的通病

论坛徽章:
0
7 [报告]
发表于 2006-12-18 14:04 |只看该作者
原帖由 crazysoul 于 2006-12-18 13:24 发表
有个缺点就是:
模版会输出多余\n的符号,在某些输出严格的场合会有问题,这是用<<<的通病

哦,能举个具体的例子么?

论坛徽章:
0
8 [报告]
发表于 2006-12-18 14:19 |只看该作者
如做安装脚本模版,生成php文件头会有空行输出。

如做配置信息模版,而读取时是按行映射的。

如输出写入到文本,再用file()导入,不同的操作系统环境会造成有多余空行元素。

...
一句话,谁用谁知道了

论坛徽章:
0
9 [报告]
发表于 2006-12-18 14:30 |只看该作者
原帖由 crazysoul 于 2006-12-18 14:19 发表
如做安装脚本模版,生成php文件头会有空行输出。

如做配置信息模版,而读取时是按行映射的。

如输出写入到文本,再用file()导入,不同的操作系统环境会造成有多余空行元素。

...
一句话,谁用谁知道了

哈,有这个可能,这是具体问题了,不过我没有这个经验,好在我的模版太过简单,
如果遇到了你说的这个问题,我想改造起来应该很容易,因为这个模版的核心其实就是一个
函数str_replace

论坛徽章:
0
10 [报告]
发表于 2006-12-18 15:12 |只看该作者
file_get_contens

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP