cking
(cking)
新手上路

中级会员
UID 12254
精华
0
积分 26
帖子 26
金钱 26 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2002-1-16 来自 Singapore
状态 离线
|
Php 模板(2)
希望hkfuk 能够挂顶
欢迎大家访问 SRPBoard http://bbs.srpboard.org
5.2 模板设计
情况1:基本变量替换
变量替换也就是把模板中类似{xxx}的部分替换成对应的数据。
我们举一个很简单的例子来说明。
以下模板来源于template-1/blk_forum1,它用于显示分论坛信息。
<tr>
<td><a href=forum.php?forumid={forum_id} target=_blank><img src=icon/type{type}.gif></a></td>
<td>{forum_infor}</td>
<td>{moderators}</td>
<td>{topic_no}</td>
<td>{reply_no}</td>
<td>{newtopic}</td>
<td><span style="CURSOR: hand" onClick="window.external.AddFavorite
('{board_root}forum.php?forumid={forum_id}','{ctg_name}
- 『{forum_name}』')"><IMG SRC="icon/fav1.gif"
ALT="将『 {forum_name} 』添加到收藏夹"></span></td>
</tr>
PHP程序处理此段代码的时候,程序会从数据库中读取论坛信息。假定PHP从数据空中读取的信息如下:论坛ID 1,论坛名称 官方资讯,主题数 16, 回复数 158等等。PHP程序会将模板里所有的{forum_id}(2个)替换成1,所有的{forum_name}(2个)替换成"官方资讯",所有的{topic_no}替换为16,所有的{reply_no}替换为158。其它的变量同样处理
情况2:块处理
所有的块都有这样的结构
<!-- BEGIN xxx -->
……
<!-- END xxx -->
一点注释:作为HTML设计人员,应该了解 <!-- --> 这是HTML语言中的注释符。打开浏览器浏览时,是不会被显示的。
PHP程序处理块的时候,会把块从原来的模板中解析出来,原来的块在模板中会被替换成一个变量。需要说明的是,块中会包含别的变量。处理块的程序在写的时候,并不清楚即将会产生多少块的拷贝,这一切都是动态的。程序运行的时候,会根据数据库中的数据决定拷贝的数目,然后逐次解析每个拷贝 -- 替换块中的变量,所有这些拷贝将会被顺次连接在一起。最终解析完成的时候,这些被链接后的拷贝将会被用来替换上文中替换原模板中块的变量。
以上片段可能是比较复杂难懂。但是作为HTML设计者,勿须理解程序处理的过程,只需要知道什么地方改需要使用块,以及如何使用块就足够了。但是,当然如果懂得块的处理机制,对HTML设计会有很大帮助,以至使得HTML设计获得极大的灵活性。
以下模板来自于template-1/pm2,但这是其中的片断,对于理解如何使用块足够了。
<tr>
<td bgcolor=#c8e4ff align=center><b>发件人</b></td>
<td bgcolor=#c8e4ff align=center><b>主题</b></td>
<td bgcolor=#c8e4ff align=center><b>是否已读</b></td>
<td bgcolor=#c8e4ff align=center><b>删除标记</b></td>
</tr>
<!-- BEGIN msg -->
<tr>
<td bgcolor=#c8e4ff align=center>{friend}</td>
<td bgcolor=#c8e4ff><a href=pm.php?mode=read&type=inbox&id={id}>
{title}</a></td>
<td bgcolor=#c8e4ff align=center><img src=icon/{status}
border=0 width=16 height=12></td>
<td bgcolor=#c8e4ff align=center><b><input type=checkbox name=msg
{no} value={id}></b>
</td>
</tr>
<!-- END msg -->
这段模板用于显示短信的收件箱,以<!-- BEGIN msg -->开始,以<!-- END msg -->结束。对于某一个注册用户而言,任何一时刻短信数目是不可确定的,可以0个,或者大于0个。对于每一封短信而言,有些东西是可变的,比如说收信时间,信件主题等等。这些东西就构成了块中的变量。对于所有类似情况应该考虑使用块。
情况3:复杂情况下的块处理
诸多情况中最复杂的情况就是块的嵌套 - 块中嵌套块。
一个简单的例子
<!-- BEGIN xxx -->
……
<!-- BEGIN xyz -->
……
<!-- END xyz -->
……
<!-- END xxx -->
PHP程序处理机制与情况2基本相同。需要注意的是,这里的嵌套是由程序本身去完成的。所不同的是,程序首先提取出块xyz,然后用变量替换块xyz。程序用相同的方法解析出块xxx。
处理数据的时候,程序首先确定块xxx重复的次数,然后按照这个次数确定程序需要进行多少次循环。对于每重循环,PHP程序按照情况2中的方法处理块xyz,以及情况1中的方法处理块xxx中的其它变量。最终在本次循环结束的时候,得到块xxx的一个拷贝。当上述次数的循环结束的时候,也就得到了处理完毕的块xxx。
上述情况最简单的两层嵌套。外层的块可以包含几个同层且并列的内嵌块。比如:
<!-- BEGIN xxx -->
……
<!-- BEGIN xyz -->
……
<!-- END xyz -->
……
<!-- BEGIN abc -->
……
<!-- END abc -->
……
<!-- END xxx -->
在这里,块xxx内就同时包含了块xyz和abc。
模板本身当然也支持多重嵌套,但是需要处理此模板PHP的积极配合。鉴于多重嵌套的复杂,也就不便在此处敖述。
下面给出一个两重嵌套的具体例子。
<!-- BEGIN ctg -->
<tr><td colspan=7> ◇ {ctg_name} ◇</td></tr>
<!-- BEGIN forum -->
<tr>
<td><a href=forum.php?forumid={forum_id}>
<img src=icon/type{type}.gif></a></td>
<td>{forum_infor}</td>
<td>{moderators}</td>
<td>{topic_no}</td>
<td>{reply_no}</td>
<td>{newtopic}</td>
<td><span style="CURSOR: hand" onClick="window.external.AddFavorite
('{board_root}forum.php?forumid={forum_id}','{ctg_name} -
『{forum_name}』')"><IMG SRC="icon/fav1.gif" ALT="将『 {forum_name} 』
添加到收藏夹"></span></td>
</tr>
<!-- END forum -->
<!-- END ctg -->
这是论坛首页显示分类/论坛的一种方法。鉴于多方面的原因,SRPBoard并未采取这种方式。最外重的嵌套就是分类的块,分类块中包含了论坛块。分类块中可以包含其它变量,比如这里的分类名称变量。
(未完待续)
|
|