PHP-Web应用程序开发:使用模板(入门)

来源:互联网 发布:unity3d编程 编辑:程序博客网 时间:2024/05/17 02:59
PHP-Web应用程序开发:使用模板

  每个进行过较大型的PHP-Web应用程序设计的开发人员大概都有如下的经历:花大量的时间写超文本语句,为页面排版,兼作美工等;或在整合的程序代码在和HTML静态页面时花费大量的时间。的确,用脚本语言开发Web应用不容易将数据的处理和数据的显示分开,但在多人合作的情况下,如果无法将数据和显示分开,将大大影响开发的效率,专业分工的发挥。为了解决这个问题,PHP也提供了自己的解决方案,有多种,本文主要介绍PHPLIB中的Template类。

1 模板处理类的设计
    模板处理类主要需完成以下的任务:
    ·从模板文件中读取显示用的HTML代码。
    ·将模板文件和实际生成的数据结合,生成输出的结果。
    ·允许同时处理多个模板。
    ·允许模板的嵌套。
    ·允许对模板中的某个单独的部分进行处理。

    归纳上述任务,模板类的设计目标为:从多个模板文件中读入显示的HTML代码,将这些显示代码中需要动态数据的地方替换为PHP程序运算所得出的数据,然后按照一定的顺序输出。其中,替换的部分可以自由的设定。

    读取显示用的HTML代码采用读文件的方式
    模板文件和数据的结合采用正则替换
    处理多个模板用数组存储来实现。
    模板的嵌套的实现主要的想法是:将模板和输出(任何中间的分析结果)一视同仁,都可拿来做替换,即可实现。
    单独部分的处理的通过在模板文件中设定标注,然后在正则替换中结合标注来控制,实现部分替换。

2 模板处理类的实现
    请参看PHPLib中的Template.inc,总共345行代码,有详细的注释。以下列举一些主要的函数,供研读参考:
    1) function set_file($handle,$filename=” ”) line 77, 读取文件
    2) function set_var($varname, $value = "") line 119, 设置映射数据-替换变量
    3) function set_block($parent, $handle, $name = "") line 96, 设置标注
    4) function subst($handle) line 136, 执行数据替换
    5) function parse($target, $handle, $append = false) line 165, 执行模板文件与数据的结合 
    6) function p($varname) line 268, 输出处理结果
注:本人下载的php-lib7.2c的Template.inc文件中的第95行少了个“/”,加上后使用正常。

3 模板处理类的使用
    3.1 最基本的例子
    为了简单起见,这里假设模板文件、使用模板的PHP文件和模板处理类的文件都放在同一个目录下。PHPLIB中的习惯是使用ihtml后缀为模板文件的后缀。
    下面是要使用的模板文件:

<html>
<head>
<title>使用模板的测试</title>
</head>
<body>
<h2>这是一个使用模板的测试文件!</h2>
当前的时间是{currenttime}!
</body>
</html>
注:模板文件和通常的HTML文件差不多,唯一不同的是使用“{}”括起来的是可以被模板处理类替换的动态内容的变量。

接下来使用模板处理类来处理上面的模板:
<?
//引入Template类
include("template.inc");

//得到需要替换的数据
$timeNow=date("Y-m-d H:i:s",time());

//实例化一个Template类
$template= new Template();

//载入test.ihtml模板
$template->set_file("handle1","test.ihtml");

//使用$timeNow的值替换模板中的currenttime
$template->set_var("currenttime",$timeNow);

//进行实际的模板操作
$template->parse("output","handle1");

//输出最后结果
$template->p("output");
?>


注:如果只想用PHPLIB中的模板类,只需在文件头包含Template.inc类即可。
创建Template对象时,可以指定模板文件路径,如:new Template(“/htdocs/apps/templates/”),缺省为当前路径。

    3.2 模板嵌套与块设定
    下面这个例子来自与PHPLIB的参考手册,综合性较强,这里需说明的一点是设定块的目的与嵌套无关,但这个范例包含了两者。请仔细阅读,块设定是为了避免这种情况:原本可在一个模板文件(静态页面)里完成的内容,因需要部分循环,而将部分循环内容提取单独做成模板文件。请思考,如果不用块设定,这个例子是不是需要3个模板文件呢?
模板文件1,page.ihtml

<html>
<head><title>{PAGETITLE}</title></head>
<body bgcolor="#ffffff">
<table border=1 cellpadding=4 cellspacing=0 bgcolor="#eeeeee">
<tr>
<td colspan=2><h1>{PAGETITLE}</h1></td>
</tr>
<tr>
<td>{OUT}</td>
<td>Content</td>
</tr>
</table>
</body>
</html>

模板文件2,box.ihtml
<!-- start box.ihtml -->
<table border=1 bgcolor="#cccccc" cellpadding=4 cellspacing=0>
<tr>
<td colspan=2><b>{TITLE}</b></td>
</tr>
<!-- BEGIN row -->
<tr>
<td>{NUM}</td>
<td>{BIGNUM}
</tr>
<!-- END row -->
</table>
<!-- end box.ihtml -->

模板处理文件,test.php
<?php
//引入Template类
include("template.inc");

#实例化一个Template类,名字叫$t 
$t = new Template();

# 建立包含模板文件的数组
$t->set_file(array(
"page" => "page.ihtml",
"box" => "box.ihtml"));

# 载入模板文件box中的一个块row,引用名称为rows
$t->set_block("box", "row", "rows");

# 设置替换
$t->set_var(array("TITLE" => "Testpage",
"PAGETITLE" => "hugo"));

# 生成数据NUM,BIGNUM 
for ($i=1; $i<=3; $i++) {
$n = $i;
$nn = $i*10;
#设置替换
$t->set_var(array("NUM" => $n, "BIGNUM" => $nn));
#进行分析,分析的结果添加到rows的后面
$t->parse("rows", "row", true);
}

# 生成box,再生成page
$t->parse("OUT", array("box", "page"));

# 输出最后结果
$t->p("OUT");
?>


注:这里page.ihtml模板文件中变量的命名与最后的输出句柄都用了“OUT”。
循环取值部分采用数据库类,即可将数据的生成与数据库应用结合起来。
执行结果如下图:


点击查看原图


模板嵌套与块设定执行结果图


4 小结
    本文主要简要介绍了PHPLIB中Template类的设计、实现及使用方法。当然,还有许多其他的PHP模板方案,如由Perl中演化而来的FastTemplates。目前Internet小组采用的是另一种方案,主要的实现方式是模板文件入库,采用eval来实现数据与模板文件的结合等,相对来说模板文件的管理与模板处理的使用比较简洁,但缺少文件存放的模式。本人目前在做的一些尝试是将两者结合起来,并想在PHPLIB的Template类的基础上进行改进。初步的目标任务有两个:1、在读取模板文件时扩展其对数据库的支持,这样可以在必要时增强灵活性与使用数据库管理工具 2、化简模板文件与数据的结合,因为在实际使用中大多数情况下无需将模板文件中的变量在处理程序中再设置(数据变量映射)一遍。
    在此也希望读者、PHP程序爱好者一起参与进来,多提宝贵意见,祝好运!

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝店铺收藏图片怎么点不了怎么办 手机淘宝显示用户被限制登录怎么办 淘宝设置登录密码原密码忘了怎么办 斑马智行淘宝号换没法登录了怎么办 淘宝卖家手机版显示宝贝不全怎么办 在电脑上登的淘宝账号退不了怎么办 淘宝买家退款不退货写假货怎么办 淘宝卖家已发布商品没货了怎么办 京东换货附近没有京东自提点怎么办 一直显示手机淘宝已停止运行怎么办 唯品会买了不可以退货的衣服怎么办 淘宝店卖东西邮费太贵怎么办 支付宝登录上去必须手机验证怎么办 支付宝里的钱被盗了怎么办 淘宝绑定的支付宝账号忘记了怎么办 支付宝绑定的微博账号忘记了怎么办 怎么知道自己的淘宝密码忘了怎么办 更换扣扣头像图片太大放不下怎么办 每次登入淘宝都要手机验证码怎么办 手机停机收不到唯品会验证码怎么办 魅蓝手机账户密码忘了怎么办 支付宝登录失败请稍后再试怎么办 万王之王3d限制注册了怎么办 绑定手机号无法登陆以前微信怎么办 手机号注册了淘宝如果不用了怎么办 淘宝网登陆要手机验证码怎么办 手机清理了微信图片打不开了怎么办 到淘宝网买东西卖家拒绝退货怎么办 淘宝店铺检测出他人认证图片怎么办 文件过大无法复制到u盘怎么办 淘宝账号上不去总说网络不好怎么办 手机上登录微信一直闪退怎么办 京东账号手机号换了登陆不了怎么办 对方账号停止收款我们汇了款怎么办 淘宝店铺严重违规被扣12分怎么办 中国网银登陆不会自动弹出怎么办 高考报考的时候页面无法显示怎么办 如果卖家收到货不退款怎么办 淘宝退货卖家收到货不退款怎么办 手机号码淘宝被注册跟换绑定怎么办 微信发送ppt显示文件太大怎么办