赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 编程语言

常用的编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN


首页 > 专业技术 > 编程语言 > Smarty模板
Smarty模板

Smarty是PHP的一个模板引擎,基于MVC框架概念。应用程序中来完成认为的代码为模型层Model,与用户交互的界面称视图层View,负责处理视图和模型的对应关系的控制层Controller。其中,Model是应用程序的核心部分,是一个实体对象或一种业务逻辑,在程序中有比较好的重用性和扩展性;View提供应用程序与用户之间的交互界面;Controller用于对程序中的请求进行控制,选择调用哪些视图或模型。
Smarty模板拥有丰富的函数库,从统计字数到字符串截取、文字环绕以及正则表达式都可以之间使用,还具有很强的扩展能力。Smarty提供一种可选择的缓存技术,可以将客户端HTML文件缓存成一个静态页。在用户开启缓存后,在指定时间内,Web请求会直接调用这个缓存文件,即直接调用静态的HTML文件。

1.下载与安装:

压缩包压缩后,得到一个libs目录,其中包含了Smarty类库的核心文件,包括smarty.class. php、smarty_Compiler.class.php、config_File.class.php和debug.tpl四个文件,另外还有internals和plug-ins两个目录。复制libs目录到服务器根目录下,并为其重命名为smarty或class等。

2.Smarty配置:

Smarty类库是通用的,每一个项目都可能会使用,所以将其存储在根目录下。新建4个目录templates、templates_c、configs和cache,其中templates存储项目的模板文件,目录templates_c存储项目的编译文件,目录configs存储项目的配置文件,目录cache存储项目的缓存文件。这几个子目录按照需要放置合适位置,比如“\09\Smarty”目录下。
要应用Smarty模板,需要包含Smarty类库和相关信息。将配置信息写入一个文件中,使用时只要加载文件即可。代码为:
<?php
define('BASE_PATH',$_SERVER['DOCUMENT_ROOT']); //定义Smarty目录的绝对路径
define('SMARTY_PATH','\mr\09\Smarty\\'); //加载Smarty类库文件
require BASE_PATH.SMARTY_PATH.'Smarty.class.php'; //实例化一个Smarty对象
$smarty=new Smarty; //定义各个目录的路径
$smarty->template_dir=BASE_PATH.SMARTY_PATH.'templates/';
$smarty->compile_dir=BASE_PATH.SMARTY_PATH.'templates_c/';
$smarty->config_dir=BASE_PATH.SMARTY_PATH.'configs/';
$smarty->cache_dir=BASE_PATH.SMARTY_PATH.'cache/';
$smarty->left_delimiter='<{';
$smarty->right_delimiter='}>';
?>
其中,BASE_PATH指定服务器的绝对路径;SMARTY_PATH指定Smarty目录的绝对路径;require用于加载Smarty类库文件Smarty.class.php;$smarty实例化Smarty对象;template_dir定义模板目录的存储位置;compile_dir定义编译目录的存储位置;config_dir定义配置文件的存储位置;cache_dir定义模板缓存目录。left_delimiter定义开始定界符,right_delimiter定义结束定界符,开发者可以指定任意的定界符格式,也可以不指定而使用Smarty默认的定界符{}。

3.Smarty模板设计:

Smarty将用户界面和过程实现分开,让美工和程序员各司其职,互不干扰。Smarty类库也自然被分成两部分来使用,即Smarty模板设计和Smarty程序设计。
Smarty模板文件是由一个页面中所有的静态元素,加上一些定界符{}组成。模板文件统一存放的位置是template目录。模板中不允许出现PHP代码段。Smarty模板中的所有注释、变量、函数等都要包含在定界符内。

1)注释:

Smarty中的注释包含在两个*中间,格式为:
{*这是注释*}

2)变量:

Smarty中的变量来自3个部分:
①PHP页面中的变量:
也需要使用$符号,与PHP变量相同,但对数组读取不同。Smarty中读取数组有两种方法,一种是通过索引获取,与PHP中类似,可以是一维或多维;另一种是通过键值获取,使用点号“.”作为连接符。比如,对数组$arr=array{'object'=>'book', 'type'=>'computer', 'unit'=>'本'},如果要得到type的值,使用$arr.type的格式。同样适用于二维数组。
示例:Smarty/templates/2/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>
对应的php文件:
<?php
include_once '../config.php';
$smarty->cache_dir=BASE_PATH.SMARTY_PATH.' $arr=array('computerbook','name'=>'PHP开发','unit_price'=>array('price'=>'¥65.00','unit'=>'本'));
   $smarty->assign('title','使用Smarty读取数组');
   $smarty->assign('arr',$arr);
   $smarty->display('2/index.html');
?>
②保留变量:
相当于PHP的预定义变量。在Smarty模板中使用保留变量时,无需使用assign()方法传值,直接使用变量名即可。Smarty中常用的保留变量见下表:


变量变量名

说明

get、post、server、session、cookie、request

等价于PHP中的$_GET()、$_POST()、$_SERVER()、$_COOKIE()、$_REQUEST()

now

当前的时间戳,等价于PHP中的time()

const

用const包含修饰的为常量

config

配置文件内容变量

示例:
<body>
{* 使用get变量获取url中的变量值(ex:http://localhost/tm/23/23.3/index.php?type=computer) *}
变量type的值是:{$smarty.get.type}<br />
当前路径为:{$smarty.server.PHP_SELF}<br />
当前时间:{$smarty.now}
</body>
对应的php文件:
<?php
   include_once '../config.php';
   $smarty->assign('title','使用Smarty变量变量');
   $smarty->assign('arr',$arr);
   $smarty->display('3/index.html');
?>
③从配置文件中读取数据:
Smarty模板也可以通过配置文件来赋值。对配置文件的使用从安装服务器就开始了。调用配置文件中变量的格式有两种:
·使用#号,将变量名置于两个#号中间,即可像普通变量一样调用配置文件内容。
·使用保留变量中的$smarty_config来调用配置文件。
示例:Smarty/configs/4/4.conf文件
title="调用配置文件"
bgcolor="#f0f0f0"
border="5"
type="计算机类"
name="PHP开发"
模板文件templates/4/index.html
{config_load file="4/4.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>
对应的PHP文件:
<?php
   include_once '../config.php';
   $smarty->display('4/index.html');
?>

3)修饰变量:

有时候不仅要调用变量,还需要对变量进行处理。格式为:
{variable_name|modifer_name:parameter1:...}
其中,variable_name为变量名,modifer_name为修饰变量的方法名,parameter1是参数值。
Smarty提供的修饰变量方法见下表:


方法名

说明

capitalize

首字母大写

count_characters:true/false

变量中的字符个数。如果参数true,空格也计算,否则忽略空格

count_paragraphs

计算变量中的段落数量

count_sentences

计算变量中的句子数量

count_words

计算变量中的词数

cat:"characters"

将cat中的字符串添加到指定字符串的后面

date_format:"%Y-%M-%D"

格式化日期时间,等同于PHP中的strftime()函数

default:"characters"

设置默认值。当变量为空时,将使用default后面的默认值

escape:"value"

用于字符串转码。value值可以为html、htmlall、url、quotes、hex、hexentity和javascript,默认为html

indent:"param1":"param2"

每行缩进的字符,默认4个字符。param1指定缩进字符数,param2指定缩进替代字符。html使用缩进需要用“ ”。

lower

将字符串改为小写

upper

将变量改为大写

nl2br

所有的换行符将被替换成<br />,功能同PHP中的nl2br()函数一样

regex_replace:"parameter1":"value2"

正则替换。用value2替换所有符合parameter1标准的字串

replace:"value1":"value2"

替换。使用value2替换掉所有value1

string_format:"value"

使用value1来格式化字符串。如果value为%d,则字符串被格式化为十进制数

spacify:"param1"

插空,在字符串的每个字符之间插入空格或者其他的字符,参数指定将插入两个字符之间的字符(串)

strip

用一个空格或一个给定字符替换所有的重复空格、换行和制表符

strip_tags

去掉所有的html标签

truncate:"param1":"param2":"param3"

从字符串开始处截取指定长度的字符,默认80个字节。param1设置截取字符的数量,param2设置截取后追加到截取词后面的字符串,param3设置是截取到词的边界(false)还是精确到字符(true)

wordwrap:"param1":"param2":"param3"

控制段落的宽度,即一行的字符数,默认80字节。param1设置段落的宽度,param2设置约束的字符(默认\n),param3设置是约束到词的边界(false)还是精确到字符(true)

示例:{$content|lower|spacify|truncate:10:"..."}
在对变量进行修饰时,不仅可以单独使用上面的方法,还可以同时使用多个,在每个方法之间使用“|”分隔。示例:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312 /">
<title>{$title}</title>
</head>
<body>
原文:{$str}
<p>
变量中的字符数(包括空格):{$str|count_characters:true}<br />
    使用变量修饰方法后:{$str|nl2br|upper}
</body>
</html>
对应的PHP文件:
<?php
   include_once '../config.php';
   $str1='这是一个实例。';
   $str2="\n图书->计算机类->php\n书名:《PHP开发》";
   $str3="\n价格:¥86/本。";
   $smarty->assign('title','使用变量修饰方法');
   $smarty->assign('str',$str1.$str2.$str3.$str4);
   $smarty->display('5/index.html');
?>

4)流程控制:

Smarty模板中的流程控制语句包括if...elseif...else条件控制语句和foreach、section循环控制语句。
①if...elseif...else条件控制语句:
格式为:
{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等修饰词修饰。示例:
<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'}
欢迎光临,{$smart.get.type}
{else}
对不起,你不是本站VIP,无权访问此栏目。
{/if}
</body>
</html>
对应的PHP文件:
<?php
   include_once '../config.php';
   $smarty->assign('title','if条件判断语句');
   $smarty->display('6/index.html');
?>
②foreach循环控制:
Smarty模板中的foreach语句可以循环输出数组,格式上比较简单,为:
{foreach name=foreach_name key=key item=item from=arr_name}
...
{/foreach}
其中,name为该循环的名称,key为当前元素的键值,item为当前元素的变量名,from为该循环的数组。item和from为必选参数。示例:
<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>
对应的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('7/index.html');
?>
③section循环:
section循环可用于比较复杂的数组。格式为:
{section name="sec_name" loop=$arr_name start=num step=num max= show=}
其中,name为循环名称,loop为循环的数组,start为表示循环的初始值,step表示步长,max设定循环的最大次数,show设定是否显示该循环。示例:
<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语句循环输出数组。<p>
{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}
</body>
</html>
对应的PHP文件:
<?php
   require_once '../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('8/index.html');
?>

5)Smarty内建函数:

①config_load函数:加载配置文件。语法:
{config_load file="file_name" section="add_attribute" scope="" global=""}
其中,file用于指定包含的配置文件的名称;section为附加属性,当配置文件中包含多个部分时,用于指定具体从哪一部分中取得变量;scope用于加载数据的作用域,取值为local、parent或global;global用于说明加载的变量是否全局可见,等同于scope=parent。
②include函数:在模板中包含子模板。语法:
{include file="file_name" assign="" var=""}
其中,file用于指定包含模板文件的名称,为必须参数;assign用于指定一个变量保存包含模板的输出;var用于传递给待包含模板的本地参数,只在待包含模板中有效。
③include_php函数:在模板中包含PHP脚本。语法:
{include_php file="file_name" once="" assign=""}
其中,参数file用于指定被包含PHP文件的路径,必选参数;once用于设置每次调用都重新包含该文件,如果设为false,每次调用该文件都将被重新包含;assign用于指定待包含PHP文件的变量名,这样待包含的PHP文件就不会直接显示,需要调用这个变量名来输出。

6)输出大括号:

因为模板引擎总是尝试解释大括号内的内容,如果需要输出大括号就要使用ldelim和rdelim。例如模板中包含JavaScript脚本,因为其中会涉及大括号,要使用ldelim和rdelim。示例:
<script language=javascript>
function check_form() {ldelim}
  if (user.value=='') {ldelim}
alert('请输入用户名');
return false;
  {rdelim}
{rdelim}
</script>
上述代码也可以使用literal标记,将整个区域内的数据当做文本来处理。示例:
{literal}
<script language=javascript>
function check_form() {
  if (user.value=='') {
alert('请输入用户名');
return false;
  }
}
</script>
{/literal}

7)Smarty自定义函数:

Smarty包含很多自定义函数,通过这些自定义函数可以实现很多功能。见下表:


函数

说明

assign

用于在模板执行时为模板变量赋值

counter

用于输出一个记数过程,保存了每次记数时的当前记数值

cycle

用于轮换使用一组值,比如表格中交替输出颜色或轮转使用数组中的值

debug

将调试信息输出到页面上

eval

按处理模板的方式获取变量的值

fetch

用于从本地文件系统、HTTP或FTP上取得文件并显示文件的内容

html_checkboxes

根据给定的数据创建复选按钮

html_image

创建一幅图像的HTML标记

html_options

根据给定的数据创建选项组

html_radios

根据给定的数据创建单选按钮组

html_select_date

创建日期下拉列表,可以显示任意年月日

html_select_time

创建时间下拉列表,可以显示任意时分秒

html_table

将数组中的数据填充到HTML表格中

math

允许模板设计者在模板中进行数学表达式运算

mailto

自动生成电子邮件超链接,并根据选项决定是否对地址信息编码

popup

用于创建JavaScript弹出窗口

textformat

用于格式化文本,主要用于清理空格和特殊字符

示例:模板中的下拉列表
{$title}
{literal}
<style type="text/css">
body,td,th{
   font-size:12px;
}
body{
   margin-left:0px;
   margin-top:0px;
   margin-right:0px;
   margin-bottom:0px;
}
</style>
{/literal}
<select name=customer_id>
   {html_options values=$cust_ids selected=$customer_id output=$cust_names}
</select>
对应的PHP文件为:
<?php
   require_once("../config.php");
   $smarty->assign('cust_ids',array('ASP','PHP','JSP','.NET','VB','VC'));
   $smarty->assign('cust_names',array('ASP','PHP','JSP','.NET','VB','VC'));
   $smarty->assign('customer_id','请选择类别');
   $smarty->assign('title','应用html_options方法向下拉列表中添加列表项');
   $smarty->display('15/index.html');
?>

4.程序设计:

在Smarty模板中是不能有PHP代码的,所有的PHP程序都要另写成文件。Smarty程序的功能主要分为两种:一种功能是和Smarty模板之间的交互,如assign()、display()方法;另一种功能就是配置Smarty函数,如变量template_dir、$config_dir等。

1)Smarty模板中常用的两种方法:

①assign()方法:用于在模板被执行时为模板变量赋值。语法为:
{assign var="" value=""}
参数var是被赋值的变量名,参数value是赋给变量的值。
②display()方法:用于显示模板。
需要指定一个合法的模板资源的类型和路径,还可以通过第2个可选参数指定一个缓存号,相关信息可以查看缓存。
void display(string template[, string cache_id[, string compile_id]])
参数template指定一个合法的模板资源的类型和路径;参数cache_id为可选参数,指定一个缓存号;参数compile_id为可选参数,用于指定一个编译号。编译号可以将一个模板编译成不同版本使用,如针对不同语言的语言编译模板。

2)其他比较常见的方法:


方法

说明

void append(string varname, mixed var[, boolean merge])

该方法向数组中追加元素

void clear_all_assign()

清除所有模板中的赋值

void clear_assign(string var)

清除一个指定的赋值

void config_load(string file[, string section])

加载配置文件,如果有参数section,说明只加载配置文件中相对应的一段数据

string fetch(string template)

返回模板的输出内容,但不直接显示出来

array get_config_vars([string varname])

获取指定配置变量的值,如果没有参数,则返回一个所有配置变量的数组

array get_template_vars([string varname])

获取指定模板变量的值,如果没有参数,则返回一个所有模板变量的数组

bool template_exists([string template])

检测指定的模板是否存在

3)Smarty的配置变量:

Smarty中只有一个常量SMARTY_DIR,用来保存Smarty类库的完整路径,其他的所有配置资源信息都保存到相应的变量中。
·$template_dir:模板目录,用来存放Smarty模板,模板的后缀一般定义为tpl或html。
·$compile_dir:编译目录。编译后的模板和PHP程序所生成文件所存放的目录,默认路径为当前执行文件所在的目录下的templates_c目录。实际上Smarty将模板和PHP程序重新组合成一个混编页面,文件名类似“%%...%%index.html.php”。
·$cache_dir:缓存目录,用来存放缓存文件。cache目录下可以看到生成的html文件,如果caching变量开启,那么Smarty将直接从这里读取文件。
·$config_dir:配置目录,用来存放配置文件。
·$debugging:调试变量,可以打开调试控制台。只要在配置文件(config.php)中将$smarty->debugging设为true即可使用。
·$caching:缓存变量,可以开启缓存。只要当前模板文件和配置文件未被改动,Smarty就直接从缓存目录中读取缓存文件而不重新编译模板。

5.配置文件:

配置文件有利于设计者管理文件中的模板全局变量,比如模板颜色变量。配置文件存储在$config_dir属性指定。如果存在不只在一个区域内使用的变量,可以使用三引号封装起来。配置文件中使用#加一些注释信息,便于阅读更新。
在配置文件中可以声明全局变量或局部变量,局部变量用中括号括起来,中括号外的变量是全局变量。示例:
#global variables
title="引用配置文件"
[table]
border="1"
cellpadding="1"
cellspacing="1"
bordercolor="#FFFFFF"
table_bgcolor="#333333"
[td]
bgcolor="#FFFFFF"
如果某个变量名既是全局变量又是局部变量,局部变量将被优先赋予值来使用。如果在一个局部中有两个变量名相同,则最后一个将被赋值使用。配置文件使用config_load加载,加载成功后就可以在模板中引用配置文件中声明的变量了。引用配置文件中的变量应用#或者Smarty的保留变量$smarty.config。
示例:上述配置文件的加载
{config_load file="15/15.conf"}
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312 /">
<title>{$title}</title>
{literal}
<style type="text/css">
style1 {
   font-size:12px;
}
</style>
{/literal}
</head>
<body>
<table border="{#border#}" cellpadding="{#cellpadding#}" cellspacing="{#cellspacing#}" bodercolor="{#bordercolor#}" bgcolor="{#table_bgcolor#}">
<tr>
<td colspan="2" bgcolor="{$smarty.config.bgcolor}" class="style1">{$content}</td>
</tr>
</body>
</html>
对应的PHP文件:
<?php
   require_once '../config.php';
   $smarty->assign('content','使用配置文件');
   $smarty->display('15/index.html');
?>

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659