SmartTemplate初体验

来源:互联网 发布:python sha1 编辑:程序博客网 时间:2024/05/06 04:53

转 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,主要代码如下

复制代码
例1
<table>
    
<tr>
        
<td>姓名</td>
        
<td>{name}</td>
    
</tr>
    
<tr>
        
<td>Email</td>
        
<td>{Email}</td>
    
</tr>
</table>
复制代码

  

a.html中定义了{name}{Email}占位符,分别用于接收姓名,Email数据

a.php

 

复制代码
例1
<?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

 

复制代码
例2
<table>
    
<!-- 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

 

例2
<?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


复制代码
例3
<style>
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"-->.

看下面的例子

 

例四
<style>
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代码

 

代码
<?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"(等号两侧有空格)。

 

原创粉丝点击