转 http://www.cnblogs.com/hsrzyn/articles/1612635.html
由于业务上的需要,最近先暂时把.net放一放,开始接触php,看了2天(主要参考书《php5+mysql5 web应用开发宝典》),感觉和asp有很多相似的地方,最明显的就是php代码和Html代码相互嵌套,貌似很乱啊,不仅不利于页面设计人员和程序开发人员之间的合作与分工,而且还有许许多多可能产生的问题,……
不过这个世界上高手太多了,有不少的PHP末班引擎,它的作用就是将页面显示和业务逻辑分开,将php代码和Html代码分离,使得php开发人员和页面设计人员专注于自己的工作。今天主要看了下SmartTemplate(这是看的第一个,因为书上有现成的代码,就先看看这个,别的因素未考虑),
特点:
小巧。一般情况下只需复制三个php文件到php可以访问的目录下即可;
语法简单,易于使用
工作原理
在Html模板文件中以特定的格式定义占位符,用于接收php代码处理得到的结果数据。在php文件中,通过引擎将php程序问价个html模板文件关联起来,并将php程序中的数据指定给模板文件中的占位符。这样就将php程序结果与html页面关联起来。
使用(我是在Windows下使用的)
下载SmartTemplate的压缩包(可以再这里下载http://smarttemplate.yi.org/www.smartphp.net/content/app/download.php),其中class.smarttemplate.php、class.smarttemplatedebugger.php、class.smarttemplateparser.php是引擎的核心文件,直接将他们放在php项目的根目录下,最好新建个文件夹。
新建Compiled文件夹和Temp文件夹
打开class.smarttemplate.php文件,修改$temp_dir(用于保存混合文件的目录,即刚建立的Complied文件夹) 和$cache_dir(刚已经建立Temp文件夹)
在程序中的使用步骤:
首先在HTML文件中定义占位符,用于接收PHP程序中得到的数据。用“{ **}”定义,**指占位符名称。占位符数目不受限制,且可以出现在Html代码中的任意位置。
在Php文件中包含class.smartTemplate.php文件
实例化SmartTemplate类的一个对象,并定义与当前Php文件关联的html文件
将数据域Html文件中的占位符关联
输出到模板文件
例1.
a.html,主要代码如下
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
< tr >
< td > 姓名 </ td >
< td > {name} </ td >
</ tr >
< tr >
< td > Email </ td >
< td > {Email} </ td >
</ tr >
</ table >
在a.html中定义了{name}{Email}占位符,分别用于接收姓名,Email数据
a.php
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
// 包含class.smarttemplate.php文件
require ( " ../comm/class.smarttemplate.php " );
// 实例化SmartTemplate的一个对象,并与a.html关联
$page = new SmartTemplate( " a.html " );
// 与Html中的占位符关联
$page -> assign( " name " , " 姓名张三 " );
$page -> assign( " Email " , " Email没有 " );
// 输出
$page -> output();
?>
运行a.php,看结果……
刚说的是最基本的使用方法,使用assign将数据和占位符关联。如果数据时多条的(比方说读取一个学校的学生信息),这样写就很局限性了,不过可以使用BEGIN……END块关联数据来实现 ,此时去刚建立的compiled文件夹下,会发现多了个a_html.php文件……
先看例子吧:
a.html
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
<!-- BEGIN INFO -->
< tr >
< td > 姓名 </ td >
< td > {name} </ td >
< td > Email </ td >
< td > {Email} </ td >
< td > Age </ td >
< td > {Age} </ td >
< td > QQ </ td >
< td > {QQ} </ td >
</ tr >
<!-- END INFO -->
</ table >
a.php
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
// 包含class.smarttemplate.php文件
require ( " ../comm/class.smarttemplate.php " );
// 实例化SmartTemplate的一个对象,并与a.html关联
$page = new SmartTemplate( " a.html " );
$INFOS = array (
array ( " name " => " 张三 " , " Email " => " 张三@qq.com " , " Age " => " 12 " , " QQ " => " 1111 " ) ,
array ( " name " => " 里斯 " , " Email " => " 里斯@qq.com " , " Age " => " 12 " , " QQ " => " 1111 " ) ,
array ( " name " => " 王五 " , " Email " => " 王五@qq.com " , " Age " => " 12 " , " QQ " => " 1111 " ) ,
array ( " name " => " 赵六 " , " Email " => " 赵六@qq.com " , " Age " => " 12 " , " QQ " => " 1111 " )
);
$page -> assign( " INFO " , $INFOS );
// 输出
$page -> output();
?>
运行下看到什么结果?
在html中只写了一行,在php中用个数组将数据组织起来,然后关联,得到的是多行。
再看两个扩展属性,ROWCNT和ROWBIT,ROWCNT表示当前BEGIN……END块内对应的行,从0开始,即0,1,2,……ROWBIT表示ROWCNT最低二进制的值,改值将以0,1,0,1,0,1……出现,这两个是引擎自动得到的,可以直接使用 看例子
a.html
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
body
{
font-size : 12px ;
}
.col0
{
background-color : #ffffff ;
}
.col1
{
background-color : #cccccc ;
}
</ style >
< table >
<!-- BEGIN INFO -->
< tr class ="col{ROWBIT}" >
< td > 第{ROWCNT}行 </ td >
< td > 姓名 </ td >
< td > {name} </ td >
< td > Email </ td >
< td > {Email} </ td >
< td > Age </ td >
< td > {Age} </ td >
< td > QQ </ td >
< td > {QQ} </ td >
</ tr >
<!-- END INFO -->
</ table >
还使用刚才的php文件,运行后看结果
在SmartTemplate中还有类似 if……else…… 的判断结构,主要用来对html文件进行控制。语法格式如下
<!-- IF condition-->
HTML code
<!-- ELSEIF condition -->
HTML code
<!-- ENDIF-->
其中condition是一个条件表达式(形式:"占位符"="值")或仅仅是一个占位符,占位符接收php传递的值,如果该值与条件表达式等号右边的值相等,则显示该分支下的Html code,否则不显示;如果条件表达式仅仅是一个占位符,则当占位符收到的值非空是,条件表达式成立,否则不成立。
在表达式中,等号右侧的值只支持字符串,且必须使用双引号,如<!-- IF class="0"-->.
看下面的例子
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
body
{
font-size : 12px ;
}
.col0
{
background-color : #ffffff ;
}
.col1
{
background-color : #cccccc ;
}
.col2
{
background-color : #ccc000 ;
}
</ style >
< table >
<!-- IF Test_IF -->
<!-- BEGIN INFO -->
<!-- IF col="0" -->
< tr class = "col0" >
<!-- ELSEIF col="1" -->
< tr class = "col1" >
<!-- ELSE -->
< tr class = "col2" >
<!-- ENDIF -->
< td > 第{ROWCNT}行 </ td >
< td > 姓名 </ td >
< td > {name} </ td >
< td > Email </ td >
< td > {Email} </ td >
< td > Age </ td >
< td > {Age} </ td >
< td > QQ </ td >
< td > {QQ} </ td >
</ tr >
<!-- END INFO -->
<!-- ENDIF -->
< tr >
< form name = "test" >
< td colspan ="9" align ="left" >
<!-- IF If_Check -->
< input type = "checkbox" value = "1" checked >
<!-- ELSE -->
< input type = "checkbox" value = "1" >
<!-- ENDIF -->
是否选择
</ td >
</ form >
</ tr >
</ table >
b.php代码
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
// 包含class.smarttemplate.php文件
require ( " ../comm/class.smarttemplate.php " );
// 实例化SmartTemplate的一个对象,并与a.html关联
$page = new SmartTemplate( " b.html " );
$INFOS = array (
array ( " col " => " 0 " , " name " => " 张三 " , " Email " => " 张三@qq.com " , " Age " => " 12 " , " QQ " => " 1111 " ) ,
array ( " col " => " 1 " , " name " => " 里斯 " , " Email " => " 里斯@qq.com " , " Age " => " 12 " , " QQ " => " 1111 " ) ,
array ( " col " => " 3 " , " name " => " 王五 " , " Email " => " 王五@qq.com " , " Age " => " 12 " , " QQ " => " 1111 " ) ,
array ( " col " => " 4 " , " name " => " 赵六 " , " Email " => " 赵六@qq.com " , " Age " => " 12 " , " QQ " => " 1111 " )
);
$Test_if = " 1 " ;
// 单独的占位符:正负数均可,空格也行,null也行、0为false,""false
$If_Check = " -1 " ;
$page -> assign( " INFO " , $INFOS );
$page -> assign( " Test_IF " , $Test_if );
$page -> assign( " If_Check " , $If_Check );
// 输出
$page -> output();
?>
运行自行查看结果
其中书写的时候要注意:
IF、ELSEIF、ENDIF全部大写,且ELSEIF可以写成ELSE IF(中间有空格),ENDIF不行,表达式中不能有空格,如上例中的 IF col="1" 不能写成 IF col = "1"(等号两侧有空格)。