21.3 Smarty模板设计
视频讲解:光盘TMlx21Smarty模板设计.exe
Smarty的特点是将用户界面和过程分离,让美工和程序员各司其职,互不干扰。这样,Smarty类库也自然地被分成两部分来使用,即Smarty模板设计和Smarty程序设计。两部分内容既相互独立,也有一部分共通。本节首先来学习Smarty模板设计。
21.3.1 Smarty模板文件
Smarty模板文件是由一个页面中所有的静态元素,加上一些定界符“{…}”组成的。模板文件统一存放的位置是templates目录。模板中不允许出现PHP代码段。Smarty模板中的所有注释、变量、函数等都要包含在定界符内。
21.3.2 注释
Smarty中的注释和PHP注释类似,都不会显示在源代码中。注释包含在两个星号“*”中间,格式如下:
{* 这是注释 *}
21.3.3 变量
Smarty中的变量来自以下3个部分。
1.PHP页面中的变量
PHP页面中的变量也就是assign方法传过来的变量。使用方法和在PHP中是一样的,也需要使用“$”符号,略有不同的是对数组的读取。在Smarty中读取数组有两种方法:一种是通过索引获取,和PHP中相似,可以是一维,也可以是多维;另一种是通过键值获取数组元素,这种方法的格式和以前接触过的不太一样,其使用符号“.”作为连接符。例如,有一数组“$arr = array{'object' => 'book', 'type' =>'computer', 'unit' => ’本’}”,如果想得到type的值,则表达式的格式应为$arr.type。这个格式同样适用于二维数组。
【例21.2】本例将使用上述两种方法来读取数组值。实例代码如下:(实例位置:光盘TMsl212)
//templates/02/index.html文件 <html> <head> {* 页面的标题变量$title *} <title>{ $title }</title> </head> <body> 购书信息:<p> {* 使用索引取得数组的第一个元素值 *} 图书类别:{ $arr[0] }<br /> {* 使用键值取得第二个数组元素值 *} 图书名称:{ $arr.name }<br /> {* 使用键值取得二维数组的元素值 *} 图书单价:{ $arr.unit_price.price }/{ $arr.unit_price.unit } </body> </html> //index.php文件 <?php /* 载入配置文件 */ include '../config.php'; /* 声明数组 */ $arr = array('computerbook', 'name' => 'PHP从入门到精通’, 'unit_price' => array('price' => '¥65.00', 'unit' => ’本’)); /* 将标题和数组传递给模板 */ $smarty->assign('title', ’使用Smarty读取数组’); $smarty->assign('arr', $arr); /* 要显示的模板页面 */ $smarty->display('02/index.html'); ?>
运行结果如图21.3所示。
图21.3 使用Smarty读取数组
2.保留变量
保留变量相当于PHP中的预定义变量。在Smarty模板中使用保留变量时无须使用assign方法传值,而只需直接调用变量名即可。Smarty中常用的保留变量如表21.1所示。
表21.1 Smarty中常用的保留变量
【例21.3】本例在模板文件中输出一些保留变量的值。实例代码如下:(实例位置:光盘TMsl213)
//templates/03/index.html文件 {* 设置标题名称 *} <title>{ $title }</title> <body> {* 使用get变量获取url中的变量值(ex: http://localhost/tm/sl/21/3/index.php? type=computer) *} 变量type的值是:{ $smarty.get.type }<br /> 当前路径为:{ $smarty.server.PHP_SELF}<br /> 当前时间为:{$smarty.now} </body> //index.php文件 <?php include'../config.php'; //载入配置文件 $smarty->assign('title', 'Smarty保留变量’); //向模板中赋值 $smarty->display('03/index.html'); //显示指定模板 ?>
运行结果如图21.4所示。
图21.4 Smarty保留变量
3.从配置文件中读取数据
Smarty模板也可以通过配置文件来赋值。对于PHP开发人员来说,对配置文件的使用从安装服务器就开始了,对文件的格式也有了一个初步的了解。调用配置文件中变量的格式有以下两种:
使用“#”,将变量名置于两个“#”中间,即可像普通变量一样调用配置文件内容。
使用保留变量中的“$smarty_config.”来调用配置文件。
【例21.4】本例通过上面两种格式来调用配置文件04.conf的内容。实例代码如下:(实例位置:光盘TMsl214)
//configs/04/04.conf文件 title = "调用配置文件" bgcolor = "#f0f0f0" border = "5" type = "计算机类" name = "PHP从入门到精通" //templates/04/infex.html文件 { config_load file="04/04.conf" } <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>{#title#}</title> </head> <body bgcolor="{#bgcolor#}"> <table border="{#border#}"> <tr> <td>{$smarty.config.type}</td> <td>{$smarty.config.name}</td> </tr> </table> </body> </html> //index.php文件 <?php include_once '../config.php'; $smarty->display('04/index.html'); ?>
运行结果如图21.5所示。
图21.5 调用配置文件
21.3.4 修饰变量
在21.3.3节中学习了如何在Smarty模板中调用变量,但有时不仅要取得变量值,还要对变量进行处理。变量修饰的一般格式如下:
{variable_name|modifer_name: parameter1:…}
variable_name:变量名称。
modifer_name:修饰变量的方法名。变量和方法之间使用符号“|”分隔。
parameter1:参数值。如果有多个参数,则使用“:”分隔开。
Smarty提供了修饰变量的方法。常用方法和说明如表21.2所示。
表21.2 修饰变量的常用方法和说明
在对变量进行修饰时,不仅可以单独使用上面的方法,而且还可以同时使用多个。需要注意的是,在每种方法之间使用“|”分隔。
【例21.5】本例使用表21.2中的几种方法来修饰字符串。实例代码如下:(实例位置:光盘TMsl215)
//templates/05/index.html文件 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>{$title}</title> <link rel="stylesheet" href="../css/style.css" /> </head> <body> 原文:{$str} <p> 变量中的字符数(包括空格):{$str|count characters:true} <br /> 使用变量修饰方法后:{$str|nl2br|upper} </body> </html> //index.php文件 <?php include_once "../config.php"; $str1 = ’这是一个实例。'; $str2 = "n图书->计算机类->phpn书名:《PHP从入门到精通》"; $str3 = "n价格:¥59/本。"; $smarty->assign('title', ’使用变量修饰方法’); $smarty->assign('str', $str1.$str2.$str3); $smarty->display('05/index.html'); ?>
运行结果如图21.6所示。
图21.6 使用变量修饰方法
21.3.5 流程控制
Smarty模板中的流程控制语句包括if…elseif…else条件控制语句和foreach、section循环控制语句。
1.if…elseif…else语句
if条件控制语句的使用和PHP中的if语句大同小异。需要注意的是,if必须以“/if”为结束标志。下面来看if语句的格式。
{if 条件语句1} 语句1 {elseif 条件语句2} 语句2 {else} 语句3 {/if}
在上述条件语句中,除了使用PHP中的<、>、=、! =等常见运算符外,还可以使用eq、ne、neq、gt、lt、lte、le、gte、ge、is even、is odd、is not even、is not odd、not、mod、div by、even by、odd by等修饰词修饰。
【例21.6】本例使用条件控制语句选择不同的返回信息。实例代码如下:(实例位置:光盘TMsl216)
//templates/06/index.html文件 <html > <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>{$title}</title> <link rel='stylesheet' href="../css/style.css" /> </head> <body> <p> {if $smarty.get.type == 'tm'} 欢迎光临,{$smarty.get.type} {else} 对不起,您不是本站VIP,无权访问此栏目。 {/if} </body> </html> //index.php文件 <?php include_once "../config.php"; $smarty->assign("title", "if条件判断语句"); $smarty->display("06/index.html"); ?>
运行结果如图21.7所示。
图21.7 if条件判断语句
2.foreach循环控制
Smarty模板中的foreach语句可以循环输出数组。与另一个循环控制语句section相比,在使用格式上要简单得多,一般用于简单数组的处理。foreach语句的使用格式如下:
{foreach name=foreach_name key=key item=item from=arr_name} … {/foreach}
其中,name为该循环的名称;key为当前元素的键值;item是当前元素的变量名;from是该循环的数组。item和from是必要参数,不可省略。
【例21.7】本例使用foreach语句,循环输出数组infobook的全部内容。实例代码如下:(实例位置:光盘TMsl217)
//templates/07/index.html文件 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>{$title}</title> </head> <body> 使用foreach语句循环输出数组。<p> {foreach key=key item=item from=$infobook} {$key} => {$item}<br /> {/foreach} </body> </html> //index.php文件 <?php include_once '../config.php'; $infobook = array('object'=>'book', 'type'=>'computer', 'name'=>'PHP从入门到精通’, 'publishing'=>’清华大学 出版社’); $smarty->assign('title', ’使用foreach循环输出数组内容’); $smarty->assign('infobook', $infobook); $smarty->display('07/index.html'); ?>
运行结果如图21.8所示。
图21.8 使用foreach循环控制语句输出数组内容
3.section循环控制
Smarty模板中的另一个循环控制语句是section,该语句可用于比较复杂的数组。section的语法结构如下:
{section name="sec_name"loop=$arr_name start=num step=num}
其中,name是该循环的名称;loop为循环的数组;start表示循环的初始位置,例如start=2,说明循环是从loop数组的第二个元素开始的;step表示步长,例如step=2,那么循环一次后数组的指针将向下移动两位,依此类推。
【例21.8】本例使用section语句循环输出一个二维数组。实例代码如下:(实例位置:光盘TMsl218)
//templates/08/index.html文件 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>{$title}</title> <link rel="stylesheet" href="../css/style.css" /> </head> <body> <table width="100" border="0" align="left" cellpadding="0" cellspacing="0"> {section name=sec1 loop=$obj} <tr> <td colspan="2">{$obj[sec1].bigclass}</td> </tr> {section name=sec2 loop=$obj[sec1].smallclass} <tr> <td width="25"> </td> <td width="75">{$obj[sec1].smallclass[sec2].s_type}</td> </tr> {/section} {/section} </table> </body> </html> //index.php文件 <?php require "../config.php"; $obj=array(array("id"=>1, "bigclass"=>"计算机图书", "smallclass"=>array(array("s_id"=>1, "s_type"=>"PHP"))), array("id"=>2, "bigclass"=>"历史传记", "smallclass"=>array(array("s_id"=>2, "s_type"=>"中国历史"), array("s_id"=>3, "s_ type"=>"世界历史"))), array("id"=>3, "bigclass"=>"畅销小说", "smallclass"=>array(array("s_id"=>4, "s_type"=>"网络小 说"), array("s_id" => 5, "s_type" => "科幻小说")))); $smarty->assign('title', 'section循环控制’); $smarty->assign("obj", $obj); $smarty->display("08/index.html"); ?>
运行结果如图21.9所示。
图21.9 使用section循环控制输出数组
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。