在PHP中使用模板的方法


Posted in PHP onMay 24, 2008

好了,你可能想知道为什么你要使用FastTemplates。 

·可以在几秒钟改变你的整个站点的外观 
·抽象程序设计,没有垃圾HTML代码 
·设计人员不需要关心全部的"模糊"代码 
·令人惊讶地快 
·更容易重用旧的模版(对普通的表单而说)  

FastTemplate源于一个有同样名称的Perl软件包(可以在CPAN上找到)。你可以下载PHP 的版本从它的主页(本站下载地址为:http://www.phpe.net/downloads/1.shtml)。你只需要其中的一个类的文件(class.FastTemplate.php)。 

让我首先解释一下在使用模板生成一个页面与简单地通过echo或print 将页面输出之间有什么不同吧。 
简单地使用echo/print的方法很适合编写短的脚本,但是不能帮助你更好的组织和定制。模板在另一方面给 
了你创建多国语言站点的能力,只是通过改动一个参数。他们可以促使你更关心你要做的。 

在开始编码之前不要害怕思考。它可能会花费一些时间,但是这些花费会随着项目的发展对你有所回报。 

那么,如何应用FastTemplate呢?首先你需要先进行一个简单地调用: 

<?php $tpl=new FastTemplate ("path"); ?> 

传递给它一个路径,是所有你的模板文件存放的目录。它返回一个对象,你可以用它进行参 
数赋值,生成页面等等。  

FastTemplate是基于这样一种假设:一个很大的页面是由很多小的部分组成的。每一个部分有一个唯一 
的名字。最小的部分是赋值给这样有着唯一名字的一段正常的文本字符串。这个可以通过 
<?php 
$tpl->assign(NAME, "text"); 
?> 
来完成。现在,如果你的一个模板包含{NAME},FastTemplate 就知道你 
的意图了。 

另外,FastTemplate需要知道你想如何调用你的模板。你需要通过传递一个相关数组(associative 
array)给 <?php $tpl->define(); ?> 
来给它一个提示。 
以下为引用的内容:
<?php 
$tpl->define(array(foo => "foo.tpl", 
bar => "bar.tpl")); 
?>  

这些赋值将分别给foo和bar以不同的文件(名为foo.tpl和bar.tpl)。  

现在你想让FastTemplate替换在模板foo中的所有{MACROS}为相应的值。通过发出命令  

以下为引用的内容:
<?php 
$tpl->parse(PAGECONTENT, "foo"); 
?>  

来实现。 这个命令将把模板"foo"的内容赋给PAGECONTENT。 

当然,我们还没有做完,因为模板bar中为主要的页面定义,FastTemplate需要替换其中的 
{PAGECONTENT}宏。我们也需要给PAGETITLE赋值,如下所做: 
以下为引用的内容:  
<?php 
$tpl->assign(PAGETITLE, "FooBar test"); 
$tpl->parse(MAIN, "bar"); 
?> 

容易吧,不是吗?我们现在只需要把它输出: <?php 
$tpl->FastPrint(MAIN); 
?> 

下面三个文件显示了实际练习中的更多的细节描述。我不知道在现实生活了离了这个技术应如何生活 -- 
你的设计者会高兴,你的老板会微笑,因为你可以在更短的时间内做更多的事情。 

以下为引用的内容:
bar.tpl 
<!-- bar.tpl --> 
<HTML> 
<HEAD><TITLE>Feature world - {PAGETITLE}</TITLE></HEAD> 
<BODY BGCOLOR=BLACK TEXT=WHITE> 
<H1>{PAGETITLE}</H1> 
{PAGECONTENT} 
</BODY> 
</HTML> 
foo.tpl <!-- foo.tpl --> 

很明显示什么都没做。请看{NAME}. 
以下为引用的内容: 

demo.php3 
<?php 
include "class.FastTemplate.php3"; 
$tpl = new FastTemplate( "."); 
$tpl->define(array(foo => "foo.tpl", bar => "bar.tpl"));  

$tpl->assign(NAME, "me"); 
$tpl->assign(PAGETITLE, "Welcome!"); 

$tpl->parse(PAGECONTENT, "foo"); 
$tpl->parse(MAIN, "bar"); 

$tpl->FastPrint(MAIN); 
?>  

创建整个表格 

我也写了一个短的例子,用来演示如何通过单行模板来生成整个表格。它很有效,因为你仍然不需要直 
接修改HTML文档。 

我们增加一个模板的内容到一个已经定义过的唯一命名的后面来创建HTML表格。这个可以通过在调用 
$tpl->parse()时,在模板名前加上一个"."来实现。 <?php 
// 将模板foo的内容赋给TPL1 
$tpl->parse(TPL1, "foo");  

// 在TPL1后附上模板bar的内容 
$tpl->parse(TPL1, ".bar"); 
?>  

page.tpl 

以下为引用的内容:
<HTML> 
<HEAD><TITLE>Feature world - {PAGE_TITLE}</TITLE></HEAD> 
<BODY BGCOLOR=BLACK TEXT=WHITE> 
<H1>{PAGE_TITLE}</H1> 
{PAGE_CONTENT} 
</BODY> 
</HTML>  
table.tpl 

以下为引用的内容:
<TABLE> 
<TR> <TH>name</TH> <TH>size</TH> </TR> 
{TABLE_ROWS} 
</TABLE>  

table_row.tpl  

以下为引用的内容:
<TR> 
<TD>{FILENAME}</TD> 
<TD>{FILESIZE}</TD> 
</TR>  

yad.php3 

以下为引用的内容:
<?php 
include "class.FastTemplate.php3"; 
function InitializeTemplates() { 
global $tpl;  

$tpl = new FastTemplate( "."); 
$tpl->define( array( page => "page.tpl", 
table => "table.tpl", 
table_row => "table_row.tpl" ) ); 
}  

function ReadCurrentDirectory() { 
global $tpl;  

$handle = opendir( "."); 
while($filename = readdir($handle)) { 
$tpl->assign(FILENAME, $filename); 
$tpl->assign(FILESIZE, filesize($filename)); 
$tpl->parse(TABLE_ROWS, ".table_row"); 

closedir($handle); 
$tpl->parse(PAGE_CONTENT, "table"); 

function PrintPage($title) { 
global $tpl;  

$tpl->assign(PAGE_TITLE, $title); 
$tpl->parse(FINAL, "page"); 
$tpl->FastPrint(FINAL); 
}  

InitializeTemplates(); 
ReadCurrentDirectory(); 
Printpage( "Yet Another Demo"); 
?>  

速度讨论 

"Ok," 你可能会说,"一切都太好了。但是它不会影响我的网站的速度吗?" www~ 

不,你的网站可能变得更快。一个简单的原因就是:因为你作为一个编程人员关心的是设计你的应用和编写代码,你的代码将会更有效率,处理相同的任务更容易和更快速。所以,你可能会在上面列出的为什么考虑使用FastTemplate在你的项目中的原因列表中增加另一条理由。  

如果你只是想转换一个已经存在的web站点,性能上的成功可能不会被注意到。我建议在PHP中使用正则表达式缓冲,它将对这种情况有所帮助。因为FastTemplate对每一个宏都使用正则表达式,每一个正则表达式将被只编译一次并且速度上的影响可以忽略不计。

PHP 相关文章推荐
php录入页面中动态从数据库中提取数据的实现
Oct 09 PHP
PHP下用rmdir实现删除目录的三种方法小结
Apr 20 PHP
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
Nov 14 PHP
《PHP编程最快明白》第八讲:php启发和小结
Nov 01 PHP
网站用php实现paypal整合方法
Nov 28 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
Sep 25 PHP
php cURL和Rolling cURL并发方式比较
Oct 30 PHP
PHP中list()函数用法实例简析
Jan 08 PHP
PHP引用的调用方法分析
Apr 25 PHP
Laravel框架实现定时发布任务的方法
Aug 16 PHP
laravel-admin 在列表页添加自定义按钮的例子
Sep 30 PHP
layui数据表格自定义每页条数limit设置
Oct 26 PHP
php读取数据库信息的几种方法
May 24 #PHP
php循环输出数据库内容的代码
May 24 #PHP
开源SNS系统-ThinkSNS
May 18 #PHP
删除及到期域名的查看(抢域名必备哦)
May 14 #PHP
php adodb连接带密码access数据库实例,测试成功
May 14 #PHP
在同一窗体中使用PHP来处理多个提交任务
May 08 #PHP
用php+javascript实现二级级联菜单的制作
May 06 #PHP
You might like
for循环连续求和、九九乘法表代码
2012/02/20 PHP
php cli换行示例
2014/04/22 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
PHP观察者模式原理与简单实现方法示例
2017/08/25 PHP
Laravel用户授权系统的使用方法示例
2018/09/16 PHP
CentOS7编译安装php7.1的教程详解
2019/04/18 PHP
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
javascript 随机展示头像实现代码
2011/12/06 Javascript
面向对象的Javascript之二(接口实现介绍)
2012/01/27 Javascript
JavaScript在XHTML中的用法详解
2013/04/11 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
JavaScript学习笔记之Function对象
2015/01/22 Javascript
jQuery使用hide方法隐藏元素自身用法实例
2015/03/30 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
2016/06/16 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
Vue实现一个图片懒加载插件
2019/03/11 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
[02:06]DOTA2肉山黑名单魔法终结者 敌法师中文配音鉴赏
2013/06/17 DOTA
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
python使用KNN算法手写体识别
2018/02/01 Python
python分块读取大数据,避免内存不足的方法
2018/12/10 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
社区中秋节活动方案
2014/01/29 职场文书
银行贷款承诺书
2014/03/29 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
2016五一手机促销广告语
2016/01/28 职场文书
HTML+JS实现在线朗读器
2022/02/15 Javascript
动漫APP软件排行榜前十名,半次元上榜,第一款由腾讯公司推出
2022/03/18 杂记
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python