Longe 发表于 2012-2-14 16:11:29

Phplib Template 简明应用教程

Phplib Template 简明应用教程


第一章 如何进行安装配置

PHP世界中比较流行的模板处理工具有PHPLIB Template和FastTemplate两种。据笔者看有关资料介绍,PHPLIB Template的技术易用性和速度较为理想,所以俺就学习使用了PHPLIB Template。

phplib template 的安装其实非常简单。现在说简单,呵呵,其实刚开始上手的时候竟然花了好几天的功夫才知道大概是怎么一回事儿。那我们首先来认识一下phplib吧。

随着php的应用和推广,众多开发人员和很多爱好者在php的基础上开发了很多php的程序库,这些程序库大大简化了程序设计和提高了代码的可重用性。其中phplib就是这些库中相当优秀的产品。phplib有五大功能:将数据库驱动和对数据库操作完全分离;支持session;权限许可;模板;购物车。我们要用的模板功能只是phplib这个库的诸多功能中的一种。笔者刚开始看phplib 的网方官站 ,就看得一头雾水,怎么还有数据库、session等等,最后才明白原来俺需要的只是template。

要说安装,其实就是下载phplib库文件。你可以到phplib的官方网站下载最新的版本:http://phplib.sourceforge.net 这是一个 tar.gz 压缩包,下载完之后就是解压了。打开解压后的文件夹,里边有一个php文件夹,将该php文件夹复制到任何你想要的其它位置,但不要放在网页 服务器的目录下。比如:我的网页服务器根目录是:/var/www,我可以将php文件夹放在/ var下,与www文件夹平行。然后打开php的配置文件php.ini进行编辑。更改include_path,使其指向刚刚复制的php文件夹的位置。比如:include_path = ".:/var/www/php"。phplib的官方站quick guide to installation讲了十个步骤,我们只用phplib template这一项功能的话,其它的安装步骤其实根本不用理会。保存退出,重启 apache2服务。然后就可以尝试编写你的第一个模板页了。



第二章 第一个简单的模板页

我理解,所谓"模板",就是将界面和实现代码分离开来,这样做的目的一是将美工和程序员的工作分离开来,提高工作效率,二是方便维护。下面我们就开始尝试写一个简单的模板了,文件名first.htm。

<HTML>
<HEAD>
<TITLE> 我的第一个模板文件 </TITLE>
</HEAD>
<BODY>
你知道吗? {man}真是一个好人。
<font color="#0000FF"> 作者:{author}</font>
</BODY>
</HTML>

first.html模板中的{man}{author}{date}可以称为"模板变量",用花括号({})括起来。

上面我们定义三个变量的原因是我们想随时改变它们的值,下面我们就来做这个工作。新建first.php文件,内容如下:

<?php
include ('template.inc'); //包含进模板类 template.inc
$tpl = new Template; //创建一个新模板
$tpl->set_file('main', 'first.html'); //把模板文件加载进来
$tpl->set_var('man', 'fuyatao'); // //给文件中的模板变量赋值
$tpl->set_var('author', 'fuyatao');
$tpl->parse('mains', 'main'); // //完成替换
$tpl->p('mains'); // //输出替换的结果
?>

你也可以一次完成给变量赋值,这样
$tpl->set_var(
array('man'=>'fuyatao', 'author'=>'fuyatao')
);

浏览器中浏览这个文件,你就会发现输出:你知道吗?fuyatao真是一个好人。作者:fuyatao.

初次尝试还算顺利吧?如果没有如你所愿地看到上述文字,那一定是你哪里弄错了。浏览器会有提示。还有如果你将这些代码复制到本机不能正确执行,有可能是标点符号的问题,必须用英文的标点符号,程序中用中文的引号或分号都会引起程序不能正常运行,本人就曾经吃过这个亏,反复检查程序没有错,可就是执行不了,后来才发现是一个地方用错了标点。


第三章 稍复杂点的应用

现在我们设想稍微复杂一点的情况,新建一个second.htm模板文件,内容为:
<HTML>
<HEAD>
<TITLE>第二个模板文件</TITLE>
</HEAD> <BODY>
下面是一个列表
<UL>
<li>谷军涛 的身高是 170cm
<li>武剑 的身高是 171cm
<li>青竹 的身高是 180cm
<li>王聪聪 的身高是 172cm
</UL>
</BODY>
</HTML>

以上页面是纯静态的,假设要使用数据库,用PHP代码嵌入HTML的话,是这样写的:
<HTML>
<HEAD>
<TITLE>第二个模板文件</TITLE>
</HEAD> <BODY>
下面是一个列表
<?php
$link=mysql_connect('localhost','fuyatao',' passwd');
$result=mysql_db_query('gfs','select name,tall from my_table');
echo "<UL>";
while ($a = mysql_fetch_array($result)){
echo "<li>$a的身高是$a";
}
?>
</UL>
</BODY>
</HTML>


PHP新手一般都这样写,但你很快发现:你或者美工改这个列表样式的时候需要多么的小心翼翼,特别是美工,如果他不懂PHP代码,那么他会终日在恐惧之中!因为稍微的不小心,可能就会带来程序的运行错误。对于页面的维护来说,非常不方便。即便是你自己写的代码,过一段时间你也可能有所遗忘,修改起来一样要备加小心。

现在有了模板,你可以把PHP代码抽取出来。 我们可以这样修改second.htm文件。

<HTML>
<HEAD>
<TITLE>第二个模板文件</TITLE>
</HEAD> <BODY>
下面是一个列表
<UL>
<li>{ name1} 的身高是 {tall1}
<li>{name2} 的身高是 {tall2}
<li>{name3} 的身高是 {tall3}
<li>{name4} 的身高是 {tall4}
</UL>
</BODY>
</HTML>


建立second.php:

<?php
include ('template.inc');
$tpl = new Template;
$tpl->set_file('main', 'second.htm');
$link=mysql_connect('localhost','fuyatao','passwd');
$result=mysql_db_query('fyt','select name,tall from my_table');
$i=0;
while ( $a = mysql_fetch_array($result))
{
$i++;
$tpl->set_var('name' . $i, $a);
$tpl->set_var('tall' . $i, $a);
}
$tpl->parse('mains', 'main');
$tpl->p('mains', 'main');
?>


在浏览器里执行 second.php 一样会得到正确的结果。这样以后不管是你还是美工修改页面的时候,再也不用胆颤心惊、担心会把程序弄坏了。



第四章 block的应用

我们知道模板元素的一种:模板变量,并知道如何在程序中给它赋值,使之呈现我们想要的东西.这对一般的简单网页来说,或许就已经够用了.现在我们设想一稍微复杂的一种情况,在template目录下新建一个second.html模板文件,内容为:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> 我的第二个模板文件 </TITLE>
</HEAD> <BODY>
下面是一个列表
<UL>
<li>张三 的成绩是 82
<li>李四 的成绩是 90
<li>王儿 的成绩是 60
<li>王小五 的成绩是 77
</UL>
</BODY>
</HTML>
上面的列表中列出了"张三","李四","王二","王小五"四人的成绩.假设要用PHP代码嵌入HTML的方式输出的话,你可能是这样写的:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> 我的第二个模板文件 </TITLE>
</HEAD>
<BODY>
下面是一个列表
<?php
$result = mysql_query("SELECT username,score FROM my_tbl");
?>
<UL>
<?php
while ($row = mysql_fetch_array($result))
{
?>
<li><?=$row["username"]?> 的成绩是 <?=$row["score"]?>
<?php
}
?>
</UL>
</BODY>
</HTML>
这样写很适合PHP新手,但你很快发现你或者美工改这个列表样式的时候需要多么的小心翼翼,特别是美工,如果他不懂你写得PHP代码,那么他会终日生在恐惧之中!因为稍微的不小心,可能就会带来程序的运行错误.而且如果他想把这个列表从一个地方移到另一个地方,也是相当不容易的.于是作为程序员的你不得不把美工(虽然你做的可能性更大)修饰过的页面重新审查一次,无形中就造成费时费力。
现在好了,有了Template模板类,你可以把你的代码从模板中抽取出来了.你可能会这样修改second.html模板:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> 我的第二个模板文件 </TITLE>
</HEAD>
<BODY>
下面是一个列表
<UL>
<li>{username1} 的成绩是 {score1}
<li>{username2} 的成绩是 {score2}
<li>{username3} 的成绩是 {score3}
<li>{username4} 的成绩是 {score4}
</UL>
</BODY>
</HTML>
显然,你采取了一个良好的命名方式,用1,2,3..来表示每一行数据,然后你在你的程序里循环给这些变量赋值,也是不难的,比如:(second.php)
<?php
//包含进模板类 template.inc
require "inc/template.inc";
//创建一个实例
$tpl = new Template("template");
//将整个文件读进来
$tpl->set_file("main", "first.html");
//连接数据库,选择数据库略
省略.....
//查询结果
$result = mysql_query("SELECT username,score FROM my_tbl");
//给文件中的模板变量赋值
$i=0;
while ($row = $idb->fetch_array($result))
{
$i++;
$tpl->set_var("username" . $i, $row["username"]);
$tpl->set_var("score" . $i, $row["score"]);
}
//完成替换
$tpl->parse("mains", "main");
//输出
$tpl->pparse("mains", "main");
?>
这样你也能得到正确结果.在特殊情况下你或许需要这样做.但Template提供了一个更方便的"大的模板变量",那就是块.我之所以称之为"大的模板变量",是因为它也可以视为可以包含其他模板变量的变量.形式如
<UL>
<!-- BEGIN list -->
<li>{username} 的成绩是 {score}
<!-- END list -->
</UL>
即用<!-- BEGIN 块名称 -->和<!-- END 块名称 -->定义了一个名为list的块,(注意:我在这里为了方便理解,只称之为块名称).这个块里面又包含一些HTML代码(<li>等等)以及模板变量({username},{score}).
在讲述如何用块输出列表之前,我们先谈一下块的定义格式.
首先<!-- BEGIN list -->和<!-- END list --> 都要各自为一行,亦即下面的块的定义是错误的
1,
同行的 <!-- BEGIN list -->
<li>{username} 的成绩是 {score}
<!-- END list -->
2,
<!-- BEGIN list -->
<li>{username} 的成绩是 {score}
<!-- END list --> 同行的
<!--和-->都是固定的,也就是说只能是两个中划线("-"),且它们与BEGIN list之间都至少有一个空(空格或tab),看下面的例子
<!--BEGIN list -->
<!-- BEGIN list-->
它们都是错误的块的定义方法,因为第一个<!--与BEGIN之间至少应该有一个空,第二个-->与list之间至少有一个空.
BEGIN/END和list之间也应该有一个空格,注意是有且仅有一个空格,不能多也不能少.
块的名称建议你只使用字符,数字,下划线以及它们的组合.
BEGIN和END两个词语都应该是大写的。
好了,下面开始探讨如何是这个块变成一个列表.我们可以这样
<?php
//包含进模板类 template.inc
require "inc/template.inc";
//创建一个实例
$tpl = new Template("template");
//将整个文件读进来
$tpl->set_file("main", "second.html");
//加载块list
$tpl->set_block("main", "list", "lists");
//连接数据库,选择数据库略
省略.....
//查询结果
$result = mysql_query("SELECT username,score FROM my_tbl");
//给文件中的模板变量赋值
while ($row = $idb->fetch_array($result))
{
$tpl->set_var("username", $row["username"]);
$tpl->set_var("score", $row["score"]);
$tpl->parse("lists", "list", true);
}
//完成替换
$tpl->parse("mains", "main");
//输出
$tpl->pparse("mains", "main");
?>
记住把你的数据库连接写在我省略的部分,就可以打印正确的结果,一如
下面是一个列表
张三 的成绩是 82
李四 的成绩是 90
王儿 的成绩是 60
王小五 的成绩是 77

可以看到在PHP代码里有两个东西
$tpl->set_block("main", "list", "lists"); //代码1
$tpl->parse("lists", "list", true);
就不可思议的将整个块循环输出了.代码1用来加载模板main中的块list,并给其一个名字lists,list就是模板中的一个大变量,它的内容就是<li>{username} 的成绩是 {score}即:
"list" = "<li>{username} 的成绩是 {score}"
之所以用lists命名,是为了程序的可读性,也就是说我很容易就知道XXXs是XXX块的名称.
使用set_block后,模板中的块内容
<!-- BEGIN list -->
<li>{username} 的成绩是 {score}
<!-- END list -->
就被lists代替了.于是我们的模板就变成了
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> 我的第二个模板文件 </TITLE>
</HEAD>
<BODY>
下面是一个列表
<UL>
{lists}
</UL>
</BODY>
</HTML>
块变成了一个变量(lists)!下面只要将lists变量替换成我们想要的就行了.
代码二所处的循环
while ($row = $idb->fetch_array($result))
{
$tpl->set_var("username", $row["username"]);
$tpl->set_var("score", $row["score"]);
$tpl->parse("lists", "list", true); //代码2
}
每一次循环,两个set_var分别给username,score赋值,然后"list"就变成了
"list" = "<li>具体的名字 的成绩是 具体的分数"
代码2就是将list分析后的内容赋给lists,这样就完成了整个块的分析.
parse第三个参数可以设置list中的值是直接存在lists里面,还是附加在原有值之后.我们这里设置为true,说明是附加在原有值之后,才得以每个list的值都会显示出来.反之设为false的话,后面的值会覆盖掉以前的值.最终的结果会是

下面是一个列表
王小五 的成绩是 77

综上所述,Template模板类的替换方式是:
1,用set_block将模板中的list块(或者你命名的其他块)替换成变量lists.
2,用set_var给list块中的变量赋值
3,把赋值并执行替换后的list内容依次给lists
4,完成分析




第五章 模板嵌套

在PHP程序里,我们常常会把"公用代码"或"公用部分"写进一个文件里,前者象我们的系统配置文件,比如config.php,或者公共函数都写入一个functions.php文件里;后者象一个站点都需要用到的页面头部,尾部.这样做的好处是可以很方便的维护站点,而如果这个公用部分要有所改动,无需再去改每一个页面,大大减少了我们的工作量.
以前你或许用require,include(require_once,include_once)引进一个公用的页面头部,确实方便而有效,现在我们用Template模板类也可以实现了,并且可以很方便的把一个页面随意插入另一个模板的任意地方.如果你想也把要插进的页面做成含有变量的模板的话,那么你会发现模板类会把这个工作处理的很好.

在template目录下新建三个文件third.html,header.html,footer.html.内容分为如下
third.html
<!-- 这是页面头部 -->
{header}
<BODY>
下面是一个列表
<UL>
<!-- BEGIN list -->
<li>{username} 的成绩是 {score}
<!-- END list -->
</UL>
<!-- 这是页面脚部 -->
{footer}
</BODY>
</HTML>

header.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> {title} </TITLE>
</HEAD>

footer.html
<P>author ? iwind

你也看到了,我们前几节的例子中都是用
$tpl->set_file("main", "模板文件名");
来加载模板文件的。只所以命名为"main",是因为我们想给它一个意义:主模板。这里的third.html就可以称之为“主模板”,而欲嵌入主模板third.html的{header}变量所在位置的模板文件header.html,则可以称为"子模板".同样footer.html也是一个"子模板",我们想把它放到主模板里的{footer}位置.一个主模板内可以随意嵌入不限内容,尺寸大小,格式等的任何多个子模板.

下面我们开始我们的PHP程序.

先是创建一个类的实例对象
//包含进模板类 template.inc
require "inc/template.inc";

//创建一个实例
$tpl = new Template("template");

//读进三个模板文件的内容,分别给变量"main", "my_header", "my_footer"
$tpl->set_file("main", "third.html");
$tpl->set_file("my_header", "header.html");
$tpl->set_file("my_footer", "footer.html");

//执行my_header,my_footer里的模板变量替换,并把最终结果分别赋给主模板中的header,footer
$tpl->parse("header", "my_header");
$tpl->parse("footer", "my_footer");

//然后完成主模板内变量的替换,并输出主模板分析后的内容
$tpl->parse("mains", "main");

//输出
$tpl->p("mains");

于是,我们便可以通过查看源文件确信header.html,footer.html两个子模板文件的内容已经被加进主模板里了.

<!-- 这是页面头部 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> </TITLE>
</HEAD>
<BODY>
下面是一个列表
<UL>
<!-- BEGIN list -->
<li> 的成绩是
<!-- END list -->
</UL>
<!-- 这是页面脚部 -->
<P>author ? iwind
</BODY>
</HTML>

你会发现,所有的变量都没了,包括我们未赋值的{title},{username},{score}.这是因为我们在创建对象时,第二个参数未设置,而自动采用了"remove"
$tpl = new Template("template");

$tpl = new Template("template", "remove");
的效果是一样的.

如果我们想给这些变量也赋值,那么方法和单个模板里变量的分析方法是一样的.
//读模板内容进变量
$tpl->set_file("main", "third.html");
$tpl->set_file("my_header", "header.html");
$tpl->set_file("my_footer", "footer.html");

//设置子模板header.html里的变量title的值
$tpl->set_var("title", "这个是网页标题");

//以下分析主模板里的块的内容
//设置块
$tpl->set_block("main", "list", "lists");
$array = array("张三" => 82, "李四" => 90, "王二" => 60, "麻子" => 77);
foreach ($array as $username=>$score)
{
$tpl->set_var("username", $username);
$tpl->set_var("score", $score);
$tpl->parse("lists", "list", true);
}

所有程序为
<?php
//包含进模板类 template.inc
require "inc/template.inc";

//创建一个实例
$tpl = new Template("template");

//将整个文件读进来
$tpl->set_file("main", "third.html");
$tpl->set_file("my_header", "header.html");
$tpl->set_file("my_footer", "footer.html");

//设置header.html里的变量title的值
$tpl->set_var("title", "这个是网页标题");

//设置块
$tpl->set_block("main", "list", "lists");
$array = array("张三" => 82, "李四" => 90, "王二" => 60, "麻子" => 77);
foreach ($array as $username=>$score)
{
$tpl->set_var("username", $username);
$tpl->set_var("score", $score);
$tpl->parse("lists", "list", true);
}

//执行my_header,my_footer里的模板变量替换,并把最终结果分别赋给主模板中的header,footer
$tpl->parse("header", "my_header");
$tpl->parse("footer", "my_footer");

//完成主模板内变量的替换
$tpl->parse("mains", "main");

//输出
$tpl->p("mains");

?>

输出的结果为
<!-- 这是页面头部 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> 这个是网页标题 </TITLE>
</HEAD>
<BODY>
下面是一个列表
<UL>

<li>张三 的成绩是 82
<li>李四 的成绩是 90
<li>王二 的成绩是 60
<li>麻子 的成绩是 77
</UL>
<!-- 这是页面脚部 -->
<P>author ? iwind
</BODY>
</HTML>

一切都是我们所期望的.

在这个程序里,我们用
$tpl->set_block("main", "list", "lists");
加载一个块.其实它的第一个参数为该块所在父变量,如果这个块在header.html里,那么恐怕要这样写了
$tpl->set_block("my_header", "list", "lists");
但分析方法还是一样的.

从以往和这节中的例子,我们可以看出来,定义一个模板变量{var}值的方法是用
$tpl->set_var("var_name", "var_value");
但把一个变量的值给另一个变量就需要用parse.
$tpl->parse("target_name", "from_name", true);
或者
$tpl->parse("target_name", "from_name", false);
使用parse就先执行from_name大变量的模板变量的替换,然后再把所得结果赋给target_name.

一个变量{varname}无论在模板的何处(块里面,子模板里),定义的方法都是一样的.

子模板里还可以嵌入新的子模板,称之为"多重嵌套",分析的方法都是一样的,只是一般用不到.块也可以多重嵌套,而且非常有用,使得模板可以设计的可以很清晰,这就是我们下一节的内容了.
页: [1]
查看完整版本: Phplib Template 简明应用教程

免 责 声 明 :本网站刊载相关信息仅出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性、正确性或可靠性;本网站信息仅代表作者本人的观点,不代表本站的观点和看法,与本站立场无关,文责作者自负;若访问者因接受并承认信赖该信息所生的风险,则由其自行承担。

常年法律顾问:广东瑞霆律师事务所 温丰台律师