由于业务上的需要,最近先暂时把.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,主要代码如下
<tr>
<td>姓名</td>
<td>{name}</td>
</tr>
<tr>
<td>Email</td>
<td>{Email}</td>
</tr>
</table>
在a.html中定义了{name}{Email}占位符,分别用于接收姓名,Email数据
a.php
//包含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
<!-- 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
//包含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
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"-->.
看下面的例子
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代码
//包含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"(等号两侧有空格)