叶子网络bbs论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 12499|回复: 1
打印 上一主题 下一主题

php之smarty引擎

[复制链接]

0

主题

3

帖子

8

积分

超级版主

Rank: 8Rank: 8

积分
8
跳转到指定楼层
楼主
发表于 2014-11-19 14:59:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Smarty是一个php模板引擎,它分开了逻辑程序和外在的内容,提供了一种易于管理的方法. Smarty要求web服务器运行php4.0.6和以上版本. smarty安装需要smarty库文件。可以去官方网站http://smarty.php.net下载。网上讲了很多安装的教程,但是我都没有成功,所以直接把整个目录名改为smarty直接复制到了网站所在的目录下,然后打开http://网站路径/smarty/demo/index.php,显示正常,应该算是安装成功了。
基本语法  
所有的smarty标签都被加上了定界符.在smarty里,所有定界符以外的内容都是静态的,当smarty遇到了模板标签,将尝试解释他们,然后再以恰当的方式输出.  

默认情况下是 {和},但它们是可定制的.定制方法是:  
$smarty->left_delimiter = '<!--{';  
$smarty->right_delimiter = '}-->';  

1.注释

模板注释被*号包围,例如 {* this is a comment *}  
smarty注释将不被输出.它是模板内在的注释.  

2.变量  
模板变量以$开头,可以包含数字,字母和下划线。  
config_file变量是例外要用#变量名#的方法引用  

3.函数  
smarty标签输出一个变量或者调用某种函数.  
在定界符内函数和其属性将被处理和输出.例如:  
{funcname attr1="val" attr2="val"}.  
funcname为函数的名称比如:include等,attr1,attr2为属性名,val为属性相应的值。  

在模板里无论是内建函数还是自定义函数都有相同的语法.  
内建函数将在smarty内部工作,例如 {if}, {section} 和{strip}.他们不能被修改.  
自定义函数通过插件机制起作用,它们是附加函数,可以随意修改,自行添加.  
例如 {html_options} and {html_select_date}  

4.属性  
静态数值不需要加引号,布尔值(真或假)也不需要引号,可以是true,on,yes或者false,off,no. 但是字符串例外.变量同样被用到了,它们也不能加引号.  

5.在字符串中插入变量  
只能识别数字,字母,下划线和[]的组合,如果为复杂的形式需要用``将变量隔起来。比如{func var="test $foo.bar test"} 中只能识别变量$foo,要识别$foo.bar,需要写成{func var="test `$foo.bar` test"}的格式。  

6.一些保留字的显示方法  
在模板中如果要将smarty的一些保留字作为语言的内容显示出来,比如显示分隔符,默认为{}的方法是: {ldelim},{rdelim} 或者{$smarty.ldelim},{$smarty.rdelim} 或者可以把{}放在{literal} .. {/literal} 中间输出。  

smarty的保留变量  

{$smarty}保留变量可以被用于访问一些特殊的模板变量.  
以下是全部.  

页面请求变量  
以下是访问页面请求变量诸如get,post,cookies,server,enviroment和session变量的例子. 例如{$smarty.server.SERVER_NAME}取得服务器变量,{$smarty.env.PATH}取得系统环境变量path, {$smarty.request.username}取得get/post/cookies/server/env的复合变量。  

{$smarty.now}变量用于访问当前时间戳.  
可以用 date_format调节器格式化输出. 例如{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}  

{$smarty.const}  
你可以直接访问PHP常量. 例如{$smarty.const._MY_CONST_VAL}  

{$smarty.capture}  
可以通过 {capture}..{/capture}结构 截取的输出可以使用{$smarty} 变量访问.  

{$smarty.config}  
{$smarty}变量 可以访问已经加载的config变量.  
例如 {$smarty.config.foo}就可以表示 {#foo#}.  

{$smarty.section}, {$smarty.foreach}  
{$smarty} 变量可以访问'section'和'foreach'循环的属性.  

{$smarty.template}  
显示当前被处理的模板的名字.  

{$smarty.version}  
显示smarty模板的版本  

{$smarty.ldelim}  
显示左分隔符  

{$smarty.rdelim}  
显示右分隔符

变量调节器  
变量调节器用于变量,自定义函数和字符串.  
可以使用'|'符号和调节器名称应用调节器.  
变量调节器由赋予的参数值决定其行为.  
参数由':'符号分开.  
如果你用变量调节器调节数组变量,结果是数组的每个值都被调节.如果你想要调节器调节整个数组,你必须在调节器名字前加上@符号.  
例如: {$articleTitle|@count}(这将会在输出 $articleTitle 数组里的数目)  

capitalize  
将变量里的所有单词首字大写. 参数值boolean型决定带数字的词是否首字大写。默认不大写  

count_characters  
计算变量值里的字符数.参数值boolean型决定是否计算空格数。默认不计算空格  

cat  
将cat里的参数值连接到给定的变量后面.默认为空。  

count_paragraphs  
计算变量里的段落数量  

count_sentences  
计算变量里句子的数量  

count_words  
计算变量里的词数  

date_format  
日期格式  

第一个参数控制日期格式.  
如果传给date_format的数据是空的,将使用第二个参数作为默认时间  

%a - 星期几的简写  

%A - 星期几的全写  

%b - 月份的简写  

%B - 月份的全写  

%c - 日期时间06/12/05 11:15:10  

%C - 世纪时间  

%d - 一个月的第几号(从 01 到 31)  

%D - 同 %m/%d/%y  

%e - 一个月的第几号,号为单数则前面加一空格 (从 1 到 31)  

%g - 世纪  

%G - 世纪 [0000,9999]  

%h - 同%b  

%H - 24小时形式的小时(从00到23)  

%I - 12小时形式的小时(从01到 12)  

%j - 一年中的第几天(从 001 到 366)  

%k - 24小时形式的小时,单数字前面加空格. (从 0 到 23)  

%l - 12小时形式的小时,单数字前面加空格.(range 1 to 12)  

%m - 月份 (range 01 to 12)  

%M - 分  

%n - 换行符  

%p - 显示早上还是下午`am' 或 `pm'  

%r - a.m. 或 p.m.形式的时间  

%R - 24小时形式的时间  

%S - 秒  

%t - tab符号  

%T - 同%H:%M:%S  

%u - 用 [1,7],表示星期几  

%U - 计算是该年的第几个星期,从该年的第一个星期天开始计算  

%V - 计算是该年的第几个星期, 从 01 到 53, 第一个星期必须至少有4天在这一年, 星期天作为这个星期的第一天  

%w - 用数字的形式表示是星期的第几天, 星期天 为 0  

%W - 用数字的形式是该年的第几个星期,从该年的第一个星期一开始计算  

%x - 显示日期:月/日/年  

%X - 显示时间:小时:分钟:秒  

%y - 不包括世纪的年份  

%Y - 包括世纪的年份  

%Z - 时区  

%% - 输出%  

其中有些有时不能正常输出。  

default  
默认  
为空变量设置一个默认值.  
当变量为空或者未分配的时候,将由给定的默认值替代输出.  

escape  
转码  
参数值为html,htmlall,url,quotes,hex,hexentity,javascrīpt。默认是html转码  

indent  
缩进  
在每行缩进字符串,第一个参数指定缩进多少个字符,默认是4个字符.第二个参数,指定缩进用什么字符代替。  

lower  
小写  
This is used to lowercase a variable.  
将变量字符串小写  

nl2br  
换行符替换成<br />  

regex_replace  
正则替换  
寻找和替换正则表达式.必须有两个参数,参数1是替换正则表达式. 参数2使用什么文本字串来替换  

replace  
替换  
简单的搜索和替换字符串必须有两个参数,参数1是将被替换的字符串. 参数2是用来替换的文本  

spacify  
spacify是在字符串的每个字符之间插入空格或者其他的字符串. 参数表示将在两个字符之间插入的字符串,默认为一个空格。  

string_format 字符串格式化  
是一种格式化浮点数的方法.例如十进制数.使用sprintf语法格式化。参数是必须的,规定使用的格式化方式。%d表示显示整数,%.2f表示截取两个浮点数。  

strip 去除(多余空格)  
替换所有重复的空格,换行和tab为单个或者指定的字符串. 如果有参数则是指定的字符串。  

strip_tags 去除所有html标签  

truncate 截取  
参数1,规定截取的字符数.默认是80个.  
第二个参数指定在截取的那段字符串后加上什么字符.默认为...  
第三个参数决定是否精确截取,默认情况下为false,则smarty不会分割单词。  

upper 将变量改为大写  

wordwrap 行宽约束  
第一个参数指定段落的宽度(也就是多少个字符一行,超过这个字符数换行).默认80.  
第二个参数指定在约束点使用什么字符(默认是换行符\n).  
第三个参数决定是否精确截取字符,默认情况下是不精确截取,就是截取时不能分开单词。
内建函数  
内建函数不能擅自修改。  
capture  
capture函数的作用是收集模板输出的数据到一个变量里,而不是把它们输出到页面.例如任何在 {capture name="foo"}和{/capture}之间的数据都被收到了由函数的名称属性指定的变量{$foo}里,或者{$smarty.capture.foo}里。如果函数没有名字属性,将使用"default".每个{capture}都必须对应{/capture},也不能嵌套使用capture函数。  

config_load  
引用配置文件  
file是必须的,说明要包含进来的配置文件名称,section说明要加载的部分的名称,scope被处理的变量的作用域.必须是local,parent或者global.  
local的意思是变量将在本模板里被加载.  
parent 的意思是变量将在本模板和上级模板被加载.  
global的意思是变量将应用到所有的模板.默认为local。变量是否在上级模板可视,默认为no。如果scope属性已经有了,这个值将被忽略.  

foreach,foreachelse  
foreach循环是选择性的section循环.用于遍历关联数组.foreach的语法比section简单的多,但是作为一个折中它只能用于简单数组.  
foreach必须的参数是from和item. from变量表示需要循环的数组的名称,item表示当前元素的变量名,key表示当前关键字的变量名,name表示访问foreach属性的foreach循环名。循环可以互相嵌套,被嵌套的循环之间的名字必须是独立的.foreachelse 在from变量没有值的时候被执行  

include  
用来引用其他的模板。  
file属性是必须的用来表示所引用模板的名字,assign表示include文件将要分配的输出的变量。你可以自行用属性名="属性值"的方式定义任意个局部变量。  

include_php  
用来在模板中引入php脚本。file是必须的用来表示php脚本的路径,once确定如果在模板中引用了php脚本多次,是否只装载一次。默认为true。  

insert  
用来包含php脚本中的函数,name是必须的,表示所插入的脚本的名称,注意如果名称是name,则包含的函数则是insert_name(),所以所有要插入的函数要有前缀insert_ 。如果用了assign属性,则insert的输出将会分配给模板变量而不会显示。 scrīpt表示要引用的脚本路径。这个程序产生的内容将不会被缓存,在每次调用该页时重新执行,适用于广告,投票,查询结果等互动的地方。


if,elseif,else  
if语句和和条件同php差不多,但每个词之间必须用空格分割开。也有一些新的条件语句,列举如下:eq相等,ne、neq不相等,gt大于,lt小于,gte、ge大于等于,lte、le 小于等于,not非,mod求模。is [not] div by是否能被某数整除,is [not] even是否为偶数,$a is [not] even by $b即($a / $b) % 2 == 0,is [not] odd是否为奇,$a is not odd by $b即($a / $b) % 2 != 0  

php  
php标记可以让模板中能直接使用php语言。  

section,sectionelse  
section用来循环显示数组的数据,name和loop是必须的参数。name表示嵌套名. section 可以嵌套使用,但是名字必须各不相同。loop表示循环的次数. sectionelse在loop参数为空的输出。start用来规定循环开始的指针,如果值为负则从数组尾部计算开始的指针,默认为0.step表示循环的步数,为负则反向循环,默认为1.max设定循环的最大步数.show决定是否显示section.  
section也有自己的变量处理section属性,用{$smarty.section.sectionname.varname} 来显示.  

index  
index用来显示当前循环的指针,从0开始.  

index_prev  
用来显示前一次循环的指针,从-1开始  

index_next  
用来显示后一次循环的指针.  

iteration  
显示当前循环的次数,从1开始.  

first  
如果当前循环为第一个循环,则值为true.  

last  
如果当前循环为最后一个循环,则值为true.  

rownum  
同iteration.  

loop  
显示最后一次循环的指针,可以用在section中间的任何地方,也可以用在section之后.  

show  
show 决定是否显示section.  

total  
显示总共循环的次数,可以用在section中间的任何地方,也可以用在section之后.  

strip  
去掉多余的空格
常规函数  
assign  
assign用来在执行模板时分配变量值.var,value是必须的参数.var为要分配值的变量名,value为分配的值.  

counter  
counter用来输出一个计数. 可以用多个计数,但是名字必须各不相同.name表示计数器名,默认为default.start表示计数的初始值,默认为1.skip计数的间隔,默认为1.direction表示计数方向,up或down,默认为up.print表示是否打印该值,默认为true.assign定义模板变量,计数器的输出将被分配到assign定义的变量中.  

cycle  
Cycle用来循环显示一组数值.name表示cycle名,values("值1","值2",...)表示循环显示的一组数值.print表示是否显示.advance决定是否显示下一个数值. delimiter决定value的分隔符,默认为逗号. assign定义模板变量,cycle的输出将被分配到assign定义的变量中.  

debug  
debug可以显示所有分配了值的变量,但是不显示模板内容,output属性决定显示的格式html或javascrīpt,默认是html.  

eval  
eval用来在变量里插入变量。var是插入的变量名,assign把输出分配给一个变量。  

fetch  
用来取得文件内容,并输出文件内容,可以取得本地文件,http文件和ftp文件,file是取得文件的路径, assign把输出分配给一个变量。  

html_checkboxes  
html_checkbox用来用给定的数据创建checkbox。name表示checkbox的名称,values表示checkbox的值,output表示checkbox的显示,selected表示被选选项的值,options表示一组checkbox的值和显示,separator表示分割每个checkbox的符号,labels表示给输出添加标签,默认为true。  

html_image  
html_image用来为一个图片创建html标签,如果height和width不分配值将会自动生成。file是图片的路径,height,width,alt同html标签,basedir是图片相对路径开始的目录的路径,默认为服务器根目录。href定义图片的链接。  

html_options  
输出下拉列表,参数有name,values,output,selected,options。  

html_radios  
输出单选框,参数同复选框。  

html_select_date  
prefix定义各个下拉列表名字的前缀,默认为Date_。time决定使用的时间,默认是当前时间。start_year决定下拉列表开始的年份,可以用年份表示,也可以用与当前年份的相对年数来表示。默认是当前年份。end_year决定下拉列表结束的年份,可以用年份表示,也可以用与当前年份的相对年数来表示。默认是当前年份。display_days决定是否显示日期。display_months决定是否显示月份。display_years决定是否显示年份。month_format决定显示月份的格式,默认为%B。day_format决定显示日期的格式,默认为%02d。day_value_format决定日期值的格式,默认为%d。month_value_format决定月份值的格式,默认为%m。year_as_text决定是否将年份按文本格式输出。reverse_years决定是否反向输出各年份。field_array用来取得一组变量,可以用name[Day],name[Month],name[Year]的方式从form取得获得的值。day_size,month_size,year_size添加大小标签。all_extra,day_extra,month_extra,year_extra添加额外的属性到select或input标签。field_order决定年月日下拉列表的顺序,默认为MDY。field_separator不同下拉列表之间的分隔符,默认是\n。year_empty,month_empty,day_empty是在各下拉列表第一栏显示的内容。  

html_select_time  
prefix定义各个下拉列表名字的前缀,默认为Time_。time决定使用的时间,默认是当前时间。display_hours决定是否显示小时。display_minutes决定是否显示分钟。display_seconds决定是否显示秒数。display_meridian 决定是否显示上午或下午,即显示am/pm。use_24_hours 决定是否24小时制。minute_interval 决定分钟之间的间隔。second_interval 决定秒数之间的间隔。field_array用来取得一组变量,可以用name[Hour],name[Minute],name[Second]的方式从form取得获得的值。all_extra,hour_extra,minute_extra,second_extra ,meridian_extra添加额外的属性到select或input标签。  

html_table  
loop定义用于循环的一组数据。cols决定列的数目,rows决定行的数目,如果其中一个为空,另一个有值,则根据元素个数和有值的属性来计算另一个的值,两者的默认值为3。inner决定元素的列举方向cols则列跟着列排列,rows则行跟着行排列,默认为cols。table_attr,tr_attr,td_attr分别为table,tr,td增加标签,如果tr_attr,td_attr是数组,将会循环增加标签。trailpad用来填充最后一行没有值的单元格,默认是 。hdir决定每行元素的排列方向,从左到右right或从右到左left,默认为right。vdir决定每列的排列方向,从上到下down或从下到上up,默认为down。  

math  
进行数字运算操作。equation和var是必须的。equation定义运算式,可以使用的运算符有+, -, /, *, abs, ceil, cos, exp, floor, log, log10, max, min, pi, pow, rand, round, sin, sqrt, srans and tan。var给运算变量赋值。format确定结果的格式。assign将输出赋给一个参数。  

mailto  
使用mailto函数能使网络蜘蛛很难获取你的email地址,但是能在网页上正常显示,因为他把email地址进行了加密处理。address是必须的,定义email地址。text是显示在页面上的文本内容,默认是email地址。encode是加密email地址的方式,可以是none,hex或javascrīpt,默认是none。如果要把邮件发给其他的邮箱,可以用cc抄送,email地址之间用,分割。bcc则为密件抄送。subject是邮件主题。newsgroups是发表内容的新闻组,新闻组之间用,隔开。extra添加附加标签。followupto意思不知。  

textformat  
textformat用来格式化文本,他会去掉空格和特殊字符,和规定行宽和缩进。style规定当前的格式,indent规定缩进的位数。indent_first规定第一行的缩进。indent_char用来缩进的字符,默认是一个空格。wrap规定行宽,即一行的字符数,默认是80。wrap_char规定每行的分隔符,默认是\n。wrap_cut决定是否分割单词。assign将输出分配给变量。
常量  
SMARTY_DIR  
是到smarty类目录的完全路径,必须以/结束。如果没有定义,将会自动决定路径.  

SMARTY_CORE_DIR  
是到smarty类core文件目录的完全路径,必须以/结束。如果没有定义,将会自动定义为smarty_dir路径下面的子目录.  


变量  

$template_dir  
默认的模板目录名,默认为"./templates".  
$compile_dir  
默认的编译模板目录名,默认为"./templates_c"  
$config_dir  
默认的config文件目录名,默认为"./configs".  
$plugins_dir  
默认的插件目录名,默认为"plugins".  
$debugging  
debugging控制台。即一个显示变量的窗口.  
$debug_tpl  
debug窗口的模板  
$debugging_ctrl  
另一种控制debugging的方法。  
$autoload_filters  
对所有的模板使用过滤程序,这个变量是一个数组,其中关键字是过滤的类型,值是过滤的名字。  
$compile_check  
每次php执行将是否查看模板的内容是否改变。  

$caching  
决定是否缓存文件执行生成的文件。  
$cache_dir  
默认的模板缓存目录名,默认为"./cache".  
$cache_lifetime  
缓存的模板的过期时间,以秒计算. $caching值为-1则缓存的模板永不过期.
最后我放个我用的例子.大家仅做一个参考吧

<?php
error_reporting(7);
$TurnDot  =  substr(PHP_OS, 0, 3) == 'WIN'  ?  ";"  :  ":"  ;
$doc_root=$_SERVER['DOCUMENT_ROOT'];   //默认获取根路径
//$doc_root="E:/Myweb/an-cool.com/Web" ; //这里是指定路径
$lib_root=".".$TurnDot.$doc_root."/shopadmin".$TurnDot.$doc_root."/shopadmin/inc".$TurnDot.$doc_root."/".$TurnDot.$doc_root."/jpgraph/src/".$TurnDot.$doc_root."/Smarty/libs/".$TurnDot.$doc_root."/Smarty";
ini_set("include_path",$lib_root);
include("conf.global.php");  //这里是装载一个全局配置文件.
$Templates_root = $doc_root."/templates";  //定义摸版根目录
define("Templates",$Templates_root);
$templates  = isset($INFO['templates'])  ?  $INFO['templates']  :  'default'  ;
include_once('Smarty.class.php');
$tpl = new Smarty();                                                                   //建立smarty实例对象$tpl  
$tpl->debugging = false;
$tpl->template_dir   = Templates."/".$templates  ;                             //设置模板目录
tpl->compile_dir    = Templates."/".$templates  ."/templates_c";     //设置编译目录
$tpl->cache_dir      = $doc_root."/cache";                                //设置缓存目录
$tpl->cache_lifetime = 60 * 60 * 24;                                         //设置缓存时间
$tpl->cache_lifetime = 0;                                                          //设置缓存时间
$tpl->caching        = false;                                                        //这里是调试时设为false,发布时请使用true
$tpl->left_delimiter = '<{';
$tpl->right_delimiter= '}>';
$tpl->assign("template_dir",  $INFO['site_url']."/templates/".$templates ); //摸板路径
$tpl->assign("Site_Url",      $INFO['site_url']); //主站URL
$tpl->assign("LanguageIs",    $INFO['IS']); //语言包类型
$tpl->assign("HtmlTitle", $INFO['site_title']);     //TITLE内容
$tpl->assign("HtmlMeta",  $INFO['meta_keyword']);  //META内容
?>



如何在smarty中开始我们程
序设计。
PHP代码:--------------------------------------------------------------------------------
    首先来介绍一下在上一节中我们使用的过的.php文件中的一些元素。同样,我们拿上一节中最开始的那个index.php文件来说明一下:
   
   ================================================
     index.php
   ================================================
  
<?php
     /*********************************************
      *
      * 文件名: index.php
      * 作  用: 显示实例程序
      *
      * 作  者: 大师兄
      * Email:  teacherli@163.com
      *
      *********************************************/
      include_once("./comm/Smarty.class.php"); //包含smarty类文件
      $smarty = new Smarty();  //建立smarty实例对象$smarty
      $smarty->templates("./templates"); //设置模板目录
      $smarty->templates_c("./templates_c"); //设置编译目录
      //****大家注意,这里我是我新加入的****//
      $smarty->cache("./cache"); //设置缓存目录
      $smarty->cache_lifetime = 60 * 60 * 24;  //设置缓存时间
      $smarty->caching = true;      //设置缓存方式
      
      //----------------------------------------------------
      //左右边界符,默认为{},但实际应用当中容易与JavaScript
      //相冲突,所以建议设成<{}>或其它。
      //----------------------------------------------------
      $smarty->left_delimiter = "<{";
      $smarty->right_delimiter = "}>";
      $smarty->assign("name", "李晓军"); //进行模板变量替换
      
      //编译并显示位于./templates下的index.tpl模板
      $smarty->display("index.tpl");
   ?>
      
       我们可以看到,smarty的程序部分实际就是符合php语言规范的一组代码,我们依次来解释一下:
         1。/**/语句:
            包含的部分为程序篇头注释。主要的内容应该为对程序的作用,版权与作者及编写时间做一个简单的介绍,这在smarty中不是必
需的,但从程序的风格来讲,这是一个好的风格。
     
     2。include_once语句:
        它将安装到网站的smarty文件包含到当前文件中,注意包含的路径一定要写正确。
     3。$smarty = new Smarty():
        这一句新建一个Smarty对象$smarty,简单的一个对象的实例化。
     4。$smarty->templates(""):
            这一句指明$smarty对象使用tpl模板时的路径,它是一个目录,在没有这一句时,Smarty默认的模板路径为当前目录的templates
目录,实际在写程序时,我们要将这一句写明,这也是一种好的程序风格。
     5。$smarty->templates_c(""):
        这一句指明$smarty对象进行编译时的目录。在模板设计篇我们已经知道Smarty是一种编译型模板语言,而这个目录,就是它编译
模板的目录,这里要注意,如果站点位于*nix服务器上,请确保teamplates_c里定义的这个目录具有可写可读权限,默认情况下它的编译目录
是当前目录下的templates_c,出于同样的理由我们将其明确的写出来。
   
         6。$smarty->left_delimiter与$smarty->right_delimiter:
        指明在查找模板变量时的左右分割符。默认情况下为"{"与"}",但在实际中因为我们要在模板中使用<script>,Script中的函数定
义难免会使用{},虽然它有自己的解决办法,但习惯上我们将它重新定义为"<{"与"}>"或是"<!--{"与"}-->"或其它标志符,注意,如果在这里
定义了左右分割符后,在模板文件中相应的要使每一个变量使用与定义相同的符号,例如在这里指定为"<{"与"}>",tpl模板中也要相应的将
{$name}变成<{$name}>,这样程序才可以正确的找到模板变量。
     
     7。$smarty->cache("./cache"):
        告诉Smarty输出的模板文件缓存的位置。上一篇我们知道Smarty最大的优点在于它可以缓存,这里就是设置缓存的目录。默认情
况下为当前目录下的cache目录,与templates_c目录相当,在*nix系统中我们要确保它的可读可写性。
     
     8. $smarty->cache_lifetime = 60 * 60 * 24:
        
        这里将以秒为单位进行计算缓存有效的时间。第一次缓存时间到期时当Smarty的caching变量设置为true时缓存将被重建。当它的
取值为-1时表示建立起的缓存从不过期,为0时表示在程序每次执行时缓存总是被重新建立。上面的设置表示将cache_lifetime设置为一天。
     9. $smarty->caching = 1:
        这个属性告诉Smarty是否要进行缓存以及缓存的方式。它可以取3个值,0:Smarty默认值,表示不对模板进行缓存;1:表示
Smarty将使用当前定义的cache_lifetime来决定是否结束cache;2:表示Smarty将使用在cache被建立时使用cache_lifetime这个值。习惯上使
用true与false来表示是否进行缓存。
     10. $smarty->assign("name", "李晓军"):
        该数的原型为assign(string varname, mixed var),varname为模板中使用的模板变量,var指出要将模板变量替换的变量名;其
第二种原形为assign(mixed var),我们要在后面的例子详细的讲解这个成员函数的使用方法,assign是Smarty的核心函数之一,所有对模板变
量的替换都要使用它。
     11. $smarty->display("index.tpl"):
         该函数原形为display(string varname),作用为显示一个模板。简单的讲,它将分析处理过的模板显示出来,这里的模板文件不
用加路径,只要使用一个文件名就可以了,它路径我们已经在$smarty->templates(string path)中定义过了。
       程序执行完后我们可以打开当前目录下的templates_c与cache目录,就会发现在下边多出一些%%的目录,这些目录就是Smarty的编译与
缓存目录,它由程序自动生成,不要直接对这些生成的文件进行修改。
       以上我简单的把Smarty程序中的一些常用的基本元素介绍了一下,在后边的例子中你可以看到将它们将被多次的使用。
   
   
    接下来介绍一个section循环块与foreach循环块,本来它应该属于模板部分,但是由于它们是smarty的精华所在,而且与smarty程序设计
部分联系非常紧密,所以就在本节单独拿出来讲一下。
   1. foreach:用于循环简单数组,它是一个选择性的section循环,它的定义格式为:
   
    {foreach from=$array item=array_id}
    {foreachelse}
    {/foreach}
    其中,from 指出要循环的数组变量,item为要循环的变量名称,循环次数由from所指定的数组变量的个数所决定。{foreachelse}用来当
程序中传递过来的数组为空时的处理,下面是一个简单的例子:
  ===========================================
    example6.tpl
  ===========================================
  <html>
    <head><title>这是一个foreach使用的例子</title></head>
    <body>
       这里将输出一个数组:<br>
       {foreach from=$newsArray item=newsID}
         新闻编号:{$newsID}<br>
     新闻内容:{$newsTitle}<br><hr>
       {foreachelse}
         对不起,数据库中没有新闻输出!
       {/foreach}
    </body>
  </html>
  ==========================================
  example6.php
  ==========================================
  
<?php
     /*********************************************
      *
      * 文件名: example6.php
      * 作  用: 显示实例程序2
      *
      * 作  者: 大师兄
      * Email:  teacherli@163.com
      *
      *********************************************/
      include_once("./comm/Smarty.class.php");
      $smarty = new Smarty();  
      $smarty->templates("./templates");
      $smarty->templates_c("./templates_c");
      $smarty->cache("./cache");
      $smarty->cache_lifetime  = 0;
      $smarty->caching         = true;
      $smarty->left_delimiter  = "{";
      $smarty->right_delimiter = "}";
      
      $array[] = array("newsID"=>1, "newsTitle"=>"第1条新闻");
      $array[] = array("newsID"=>2, "newsTitle"=>"第2条新闻");
      $array[] = array("newsID"=>3, "newsTitle"=>"第3条新闻");
      $array[] = array("newsID"=>4, "newsTitle"=>"第4条新闻");
      $array[] = array("newsID"=>5, "newsTitle"=>"第5条新闻");
      $array[] = array("newsID"=>6, "newsTitle"=>"第6条新闻");
      $smarty->assign("newsArray", $array);
      //编译并显示位于./templates下的index.tpl模板
      $smarty->display("example6.tpl");
   ?>
   =================================================
   example6.php 输出文件
   =================================================
   <html>
     <head><title>foreach使用的例子</title></head>
     <body>
        这里将输出一个数组:<br>
    新闻编号:1<br>
    新闻内容:第1条新闻<br><hr>
    新闻编号:2<br>
    新闻内容:第2条新闻<br><hr>
    新闻编号:3<br>
    新闻内容:第3条新闻<br><hr>
    新闻编号:4<br>
    新闻内容:第4条新闻<br><hr>
    新闻编号:5<br>
    新闻内容:第5条新闻<br><hr>
    新闻编号:6<br>
    新闻内容:第6条新闻<br><hr>
     </body>
   </html>
   foreach还可以用foreachelse来匹配,用foreachelse来表示当传递给foreach的数组为空值时程序要执行的操作,具体的使用方法,请参考
手册的说明。
   2. section:
     section的产生是为解决foreach的不足的,与foreach一样,它用于设计模板内的循环块,它较为复杂,可极大程序上满足程序需要,所
以在程序中我习惯使用它而不使用foreach,基本原形为:
     {section name = name loop = $varName[, start = $start, step = $step, max = $max, show = true]}
     name: section的名称,不用加$
     $loop: 要循环的变量,在程序中要使用assign对这个变量进行操作。
     $start: 开始循环的下标,循环下标默认由0开始
     $step:  每次循环时下标的增数
     $max:   最大循环下标
     $show:  boolean类型,决定是否对这个块进行显示,默认为true
     这里有个名词需要说明:
         循环下标:实际它的英文名称为index,是索引的意思,这里我将它译成"下标",主要是为了好理解。它表示在显示这个循环块时当
前的循环索引,默认从0开始,受$start的影响,如果将$start设为5,它也将从5开始计数,在模板设计部分我们使用过它,这是当前
{section}的一个属性,调用方式为Smarty.section.sectionName.index,这里的sectionName指的是函数原型中的name属性。
    {section}块具有的属性值,分别为:
      1. index:      上边我们介绍的"循环下标",默认为0
      2. index_prev: 当前下标的前一个值,默认为-1
      3. index_next: 当前下标的下一个值,默认为1
      4. first:      是否为第一下循环
      5. last:       是否为最后一个循环
      6. iteration:  循环次数
      7. rownum:     当前的行号,iteration的另一个别名
      8. loop:       最后一个循环号,可用在section块后统计section的循环次数
      9. total: 循环次数,可用在section块后统计循环次数
      10. show: 在函数的声明中有它,用于判断section是否显示
      它们的具体属性大家可以参考手册,在程序中可灵活使用它的这些属性,模板部分我就使用过index属性,大家可以回过头去看看。
      同样,{section}也可以配合使用{sectionelse},用来表示传入的数组变量为空时对模板进行的处理。
      我们把上边的那个例子使用{section}来替代{foreach}来实现现样的功能,注意,在这个例子中我只将tpl模板中的{foreach}用
{section}来实现,php程序文件中没有任何改动,同时加了{sectionelse}处理块:
  ===========================================
    example7.tpl
  ===========================================
  <html>
    <head><title>这是一个foreach使用的例子</title></head>
    <body>
       这里将输出一个数组:<br>
       {section name=loop loop=$News}
         新闻编号:{$News[loop].newsID}<br>
         新闻标题:{$News[loop].newsTitle}<br><hr>
       {sectionelse}
         对不起,没有任何新闻输入!
       {/section}
    </body>
  </html>
  
  ==========================================
  example6.php
  ==========================================
  
<?php
     /*********************************************
      *
      * 文件名: example7.php
      * 作  用: 显示实例程序2
      *
      * 作  者: 大师兄
      * Email:  teacherli@163.com
      *
      *********************************************/
      include_once("./comm/Smarty.class.php");
      $smarty = new Smarty();  
      $smarty->templates("./templates");
      $smarty->templates_c("./templates_c");
      $smarty->cache("./cache");
      $smarty->cache_lifetime  = 0;
      $smarty->caching         = true;
      $smarty->left_delimiter  = "{";
      $smarty->right_delimiter = "}";
      
      $array[] = array("newsID"=>1, "newsTitle"=>"第1条新闻");
      $array[] = array("newsID"=>2, "newsTitle"=>"第2条新闻");
      $array[] = array("newsID"=>3, "newsTitle"=>"第3条新闻");
      $array[] = array("newsID"=>4, "newsTitle"=>"第4条新闻");
      $array[] = array("newsID"=>5, "newsTitle"=>"第5条新闻");
      $array[] = array("newsID"=>6, "newsTitle"=>"第6条新闻");
      $smarty->assign("newsArray", $array);
      //编译并显示位于./templates下的index.tpl模板
      $smarty->display("example6.tpl");
   ?>
   =================================================
   example7.php 输出文件
   =================================================
   <html>
     <head><title>foreach使用的例子</title></head>
     <body>
        这里将输出一个数组:<br>
    新闻编号:1<br>
    新闻内容:第1条新闻<br><hr>
    新闻编号:2<br>
    新闻内容:第2条新闻<br><hr>
    新闻编号:3<br>
    新闻内容:第3条新闻<br><hr>
    新闻编号:4<br>
    新闻内容:第4条新闻<br><hr>
    新闻编号:5<br>
    新闻内容:第5条新闻<br><hr>
    新闻编号:6<br>
    新闻内容:第6条新闻<br><hr>
     </body>
   </html>
   这里的{section}块的对于变量的命名方式感觉有些别扭,不过没关系,你只要记住模板变量使用:
   $loopName[name].var这种模式就行了,loopName为loop处赋予的变量名,[name]为name处赋予的字符串,.后为为你要在程序数组中设定要
与值相对应的下标名称就行了。
回复

使用道具 举报

0

主题

3

帖子

8

积分

超级版主

Rank: 8Rank: 8

积分
8
沙发
 楼主| 发表于 2014-12-13 11:49:46 | 只看该作者
本帖最后由 rain 于 2014-12-13 13:56 编辑

Smarty是一个使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目的就是要使PHP程序员同前端人员分离,使程序员改变程序的逻辑内容不会影响到前端人员的页面设计,前端人员重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。
学习资源一:易百
学习资源二:站长之家
学习资源三:脚本之家
学习资源四:后盾网
回复

使用道具 举报

手机版|Archiver|叶子官网|杭州轩翼网络科技有限公司 ( 浙ICP备17027999号

GMT+8, 2024-12-22 20:28 , Processed in 0.167738 second(s), 23 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表