PHP Smarty模版基础知识

来源:互联网 发布:编程小游戏用什么软件 编辑:程序博客网 时间:2024/05/01 21:45
      Smarty是一个使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目的就是要使PHP程序员同前端人员分离,使程序员改变程序的逻辑内容不会影响到前端人员的页面设计,前端人员重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。
 

一、Smarty的优点
1.速度

采用Smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的。比PHP内嵌到HTML中的做法要有效率的多。


2.编译型

采用Smarty编写的程序在运行时要编译成一个非模板技术的PHP文件,这个文件采用了PHP与HTML混合的方式,在下一次访问模板时将WEB请求直接转换到这个文件中,而不再进行模板重新编译。无模板解析的开销,只编译一次。仅当模板文件被修改后才会重新编译。


3.缓存技术

Smarty选用的一种缓存技术,它可以将用户最终看到的HTML文件缓存成一个静态的HTML页,当设定Smarty的cache属性为true时,在Smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来,这相当于调用一个静态的HTML文件。


4.插件技术

Smarty可以自定义插件。你可以很容易创建自己的函数和变量修饰器,非常具有可扩展性。可配置的模板定界符语法{delimiter}, 你可以使用{$foo}, {{$foo}}, <!--{$foo}-->等等。模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。支持无限的 sections, if等的嵌套。


二、基本语法

2.1 注释
模板中的注释是星号开头,然后外面包含着 定界符,Smarty的注释在不会在最终的页面输出里显示,就像这样:

{* 我是一个Smarty的注释, 显示输出时我不会存在  *}<html><head><title>{$title}</title></head><body>{* 另一个单行的注释例子  *}<!-- HTML 注释会发送到浏览器 -->{*    Smarty的多行   注释   不会发送到浏览器*}{*********************************************************多行注释的说明栏  @ author:         bg@example.com  @ maintainer:     support@example.com  @ para:           var that sets block style  @ css:            the style output**********************************************************}{* 头部文件包括LOGO和其他东西  *}{include file='header.tpl'}{* 开发说明:  $includeFile是通过foo.php赋值的  *}<!-- 显示 main content 块 -->{include file=$includeFile}{* 这里的 <select> 块是多余的 *}{*<select name="company">  {html_options options=$vals selected=$selected_id}</select>*}<!-- 变量被注释了 -->{* $affiliate|upper *}{* 注释不能嵌套 *}{*<select name="company">  {* <option value="0">-- none -- </option> *}  {html_options options=$vals selected=$selected_id}</select>*}</body></html>

2.2 变量

2.2.1 PHP页面变量
模板变量以美元符号$开头,由字母、数组和下划线组成,和 PHP variable相似。 变量可以引用数字索引或非数字索引的数组,对象的属性和方法等。

{$foo}        <-- 显示简单的变量 (非数组/对象){$foo[4]}     <-- 在0开始索引的数组中显示第五个元素{$foo.bar}    <-- 显示"bar"下标指向的数组值,等同于PHP的$foo['bar']{$foo.$bar}   <-- 显示以变量$bar值作为下标指向的数组值,等同于PHP的$foo[$bar]{$foo->bar}   <-- 显示对象属性 "bar"{$foo->bar()} <-- 显示对象成员方法"bar"的返回{#foo#}       <-- 显示变量配置文件内的变量"foo"{$smarty.config.foo} <-- 等同于{#foo#}{$foo[bar]}   <-- 仅在循环的语法内可用,见{section}{assign var=foo value='baa'}{$foo} <--  显示"baa", 见{assign}更多合成变量的方式:{$foo.bar.baz}{$foo.$bar.$baz}{$foo[4].baz}{$foo[4].$baz}{$foo.bar.baz[4]}{$foo->bar($baz,2,$bar)} <-- 传递参数{"foo"}       <-- 静态值{* 显示服务器的环境变量"SERVER_NAME" ($_SERVER['SERVER_NAME'])*}{$smarty.server.SERVER_NAME}数学运算和嵌入标签:{$x+$y}                             // 显示x加y的和{assign var=foo value=$x+$y}        // 和用于赋值{$foo[$x+3]}                        // 作为下标使用{$foo={counter}+3}                  // 标签内的标签{$foo="this is message {counter}"}  // 在双引号内的标签定义数组:{assign var=foo value=[1,2,3]}{assign var=foo value=['y'=>'yellow','b'=>'blue']}{assign var=foo value=[1,[9,8],3]}   // 可嵌套缩写方式:{$foo=$bar+2}{$foo = strlen($bar)}               // 函数赋值{$foo = myfunct( ($x+$y)*3 )}       // 函数参数{$foo.bar=1}                        // 赋值给特定的数组元素{$foo.bar.baz=1}                    {$foo[]=1}                          // 附加到数组Smarty 点号语法:{$foo.a.b.c}        =>  $foo['a']['b']['c'] {$foo.a.$b.c}       =>  $foo['a'][$b]['c']         // 变量下标{$foo.a.{$b+4}.c}   =>  $foo['a'][$b+4]['c']       // 表达式下标{$foo.a.{$b.c}}     =>  $foo['a'][$b['c']]         // 嵌套下标类似PHP的语法,另一种点号的语法:{$foo[1]}             // 一般的{$foo['bar']}{$foo['bar'][1]}{$foo[$x+$x]}         // 下标可以是各种表达式{$foo[$bar[1]]}       // 嵌套下标{$foo[section_name]}  // smarty {section} 存取, 非数组存取!变量构造变量:$foo                     // 一般的变量$foo_{$bar}              // 变量名包含了其他变量$foo_{$x+$y}             // 变量名包含了表达式$foo_{$bar}_buh_{$blar}  // 更复杂的{$foo_{$x}}              // 如$x = 1,那么将显示$foo_1的值对象链:{$object->method1($x)->method2($y)}PHP函数直接使用:{time()}

2.2.2 双引号中嵌入变量

Smarty可以识别出在双引号中嵌套的 变量值,这些变量名称必须只包括 字母、数字和下划线。 参见命名规则。
另外,带有其他字符的,如点号(.)或者 $object->reference形式的变量, 必须用`单引号`括起来。
Smarty3中允许在双引号中嵌入Smarty的标签并运行。 如果你需要在双引号的变量上使用修饰器、插件或者PHP函数等,这是非常有用的。

{func var="test $foo test"}              // 识别变量 $foo{func var="test $foo_bar test"}          // 识别变量 $foo_bar{func var="test `$foo[0]` test"}         // 识别变量 $foo[0]{func var="test `$foo[bar]` test"}       // 识别变量 $foo[bar]{func var="test $foo.bar test"}          // 识别变量 $foo (不是 $foo.bar){func var="test `$foo.bar` test"}        // 识别变量 $foo.bar{func var="test `$foo.bar` test"|escape} // 引号外的修饰器!{func var="test {$foo|escape} test"}     // 引号内的修饰器!{func var="test {time()} test"}          // PHP函数结果{func var="test {counter} test"}         // 插件的结果{func var="variable foo is {if !$foo}not {/if} defined"} // Smarty区块函数{* 将使用$tpl_name的值 *}{include file="subdir/$tpl_name.tpl"}{* 不使用$tpl_name的值 *}{include file='subdir/$tpl_name.tpl'} // 必须用双引号才能用变量值!{* 当变量包含了点号“.”,必须用单引号括起来 *}{cycle values="one,two,`$smarty.config.myval`"}{* 当变量包含了点号“.”,必须用单引号括起来 *}{include file="`$module.contact`.tpl"}{* 点号后面跟着变量 *}{include file="`$module.$view`.tpl"}

2.2.3 {$smarty} 保留变量

可以通过PHP的保留变量 {$smarty}来访问一些环境变量。 下面是这些变量的列表:


页面请求变量
页面请求变量 如$_GET, $_POST, $_COOKIE, $_SERVER, $_ENV 和 $_SESSION 可以通过下面的方式来使用:

{* display value of page from URL ($_GET) http://www.example.com/index.php?page=foo *}{$smarty.get.page}{* display the variable "page" from a form ($_POST['page']) *}{$smarty.post.page}{* display the value of the cookie "username" ($_COOKIE['username']) *}{$smarty.cookies.username}{* display the server variable "SERVER_NAME" ($_SERVER['SERVER_NAME'])*}{$smarty.server.SERVER_NAME}{* display the system environment variable "PATH" *}{$smarty.env.PATH}{* display the php session variable "id" ($_SESSION['id']) *}{$smarty.session.id}{* display the variable "username" from merged get/post/cookies/server/env *}{$smarty.request.username}

{$smarty.now}

当前的时间戳 可以通过{$smarty.now}来获取。 时间戳是从1970年1月1日开始计算到当前的秒数。 当前时间戳可以被date_format 修饰器使用并显示。 注意:在每次使用该变量时都会调用time()函数。 比如说一个程序花了三秒来执行,在开头和结束时都调用了$smarty.now,那么这两个数值将差三秒。

{* use the date_format modifier to show current date and time *}{$smarty.now|date_format:'%Y-%m-%d %H:%M:%S'}
{$smarty.const}
直接访问PHP的常量。

{$smarty.capture}
Smarty内置函数 {capture}..{/capture}可以捕获其中的代码输出。 通过{$smarty.capture}变量可以使用这些输出的代码。

{$smarty.config}

{$smarty.config}变量可以获取 配置变量。 {$smarty.config.foo}可获取设置变量的 {#foo#}。

配置文件foo.conf例子:

pageTitle = "This is mine"bodyBgColor = '#eeeeee'tableBorderSize = 3tableBgColor = "#bbbbbb"rowBgColor = "#cccccc"
示范使用 $smarty.config方式的模板:

{config_load file='foo.conf'}<html><title>{$smarty.config.pageTitle}</title><body bgcolor="{$smarty.config.bodyBgColor}"><table border="{$smarty.config.tableBorderSize}" bgcolor="{$smarty.config.tableBgColor}"><tr bgcolor="{$smarty.config.rowBgColor}">    <td>First</td>    <td>Last</td>    <td>Address</td></tr></table></body></html>
上面的例子都可以输出:

<html><title>This is mine</title><body bgcolor="#eeeeee"><table border="3" bgcolor="#bbbbbb"><tr bgcolor="#cccccc"><td>First</td><td>Last</td><td>Address</td></tr></table></body></html>

{$smarty.section}
{$smarty.section}变量是{section} 循环中的属性。 它提供了一些很有用的值,如 .first, .index等等。

{$smarty.template}
返回当前的模板名称(不带目录名)。

{$smarty.template_object}
返回当前模板对象。

{$smarty.current_dir}
返回当前模板的目录名称。

{$smarty.version}
返回编译当前模板的Smarty版本。

{$smarty.block.child}
返回子模板提供的区块代码。 

{$smarty.block.parent}
返回父模板提供的区块代码。 

{$smarty.ldelim}, {$smarty.rdelim}
用于显示左定界符和右定界符。等同于 {ldelim},{rdelim}。


2.3 变量修饰器
变量修饰器可以用于变量, 自定义函数或者字符串。 使用修饰器,需要在变量的后面加上|(竖线)并且跟着修饰器名称。 修饰器可能还会有附加的参数以便达到效果。 参数会跟着修饰器名称,用:(冒号)分开。 同时,默认全部PHP函数都可以作为修饰器来使用 (不止下面的),而且修饰器可以被 联合使用。

capitalize -- 使变量内容里的每个单词的第一个字母大写cat -- 连接多个变量                 count_characters -- 计算变量内容里有多少个字符count_paragraphs -- 计算变量内容有多少个段落count_sentences -- 计算变量内容有多少个句子。 每个句子必须以点号、问号或者感叹号结尾。(.?!)count_words -- 用于计算变量内容有多少个单词date_format -- 将日期和时间格式化成strftime()的格式。 时间可以是unix的 时间戳, DateTime 对象, mysql时间戳,或者月日年格式的字符串,与PHP函数strtotime()类似。模板设计者可以对date_format的格式有完全的控制。 如果传递到date_format的时间为空, 而第二个参数传递了值,那么第二个参数将作为需要格式化的时间。default -- 为变量设置默认值。 当变量是unset或者empty的字符串时,默认值将显示。 必须要有一个参数escape -- escape可用于将变量编码或转换成 html, url, 单引号, 十六进制, 十六进制实体, javascript 和 电邮地址。 默认是:html。from_charset -- from_charset转换变量到内置字符集。 与to_charset 修饰器刚好相反indent -- 缩进每一行的字符串,默认是缩进4个空格。 可选的参数可以设置缩进的空格数量。 可选的第二个参数设置缩进使用的字符,如用 "\t" 来代替空格缩进lower -- 将变量值转成小写字母。 等同于PHP的 strtolower()函数nl2br -- 将变量值中的"\n"回车全部转换成HTML的 <br />。 等同于PHP的 nl2br()函数regex_replace -- 用正则表达式搜索和替换变量值。 使用PHP的 preg_replace()函数进行replace -- 对变量进行简单的搜索和替换。 等同于PHP函数的 str_replace()spacify -- spacify会在变量的字符串中插入空格。 你可以设置插入的是空格或者别的字符string_format -- 格式化字符串,如浮点数等。 使用 sprintf()的PHP函数来进行strip -- 转换连续空格,回车和tab到单个空格或是指定字符串strip_tags -- 去除标记等任何包含在< 和 >中间的字符to_charset -- to_charset可将变量值由当前内置字符集转换到指定字符集。 它是from_charset 修饰器的相反操作truncate -- 截取字符串到指定长度,默认长度是80. 第二个参数可选,指定了截取后代替显示的字符。 截取后的字符长度是截取规定的长度加上第二个参数的字符长度 默认truncate会尝试按单词进行截取。 如果你希望按字符截取(单词可能会被截断),需要设置第三个参数TRUEunescape -- unescape可以解码entity, html 和 htmlall等的编码。 它与escape 修饰器的效果刚好相反upper -- 将变量值转成大写字母。 等同于PHP的 strtoupper()函数wordwrap -- 限制一行字符的长度(自动换行),默认是80个字符长度。 可选的第二个参数,可自定义换行字符,默认换行字符是 "\n"。 默认情况下,是根据单词来换行的,也就是按英文语法的自动换行。 如果你希望按照字符来换行(边界的单词将拆开),那么可以设置 可选的第三个参数为TRUE,效果与PHP函数wordwrap()一样

{* apply modifier to a variable *}{$title|upper}{* modifier with parameters *}{$title|truncate:40:"..."}{* apply modifier to a function parameter *}{html_table loop=$myvar|upper}{* with parameters *}{html_table loop=$myvar|truncate:40:"..."}{* apply modifier to literal string *}{"foobar"|upper}{* using date_format to format the current date *}{$smarty.now|date_format:"%Y/%m/%d"}{* apply modifier to a custom function *}{mailto|upper address="smarty@example.com"}{* using  php's str_repeat *}{"="|str_repeat:80}{* php's count *}{$myArray|@count}{* this will uppercase and truncate the whole array *}<select name="name_id">{html_options output=$my_array|upper|truncate:20}</select>


2.4 内置函数

Smarty自带了一些内置函数。这些内置函数是Smarty模板引擎的组成部分。它们会被编译到PHP代码中,以取得最高的性能。你不能建立相同名称的自定义函数;同时你也不需要修改这些内置函数。少数的内置函数有assign属性,可以将函数的结果赋值给模板变量,而不是输出;效果如同 {assign}函数。

{$var=...}{append}{assign}{block}{call}{capture}{config_load}{debug}{extends}{for}{foreach},{foreachelse}@index@iteration@first@last@show@total{break}{continue}{function}{if},{elseif},{else}{include}{include_php}{insert}{ldelim},{rdelim}{literal}{nocache}{php}{section},{sectionelse}.index.index_prev.index_next.iteration.first.last.rownum.loop.show.total{setfilter}{strip}{while}
{if},{elseif},{else}

Smarty的{if}条件判断和PHP的if非常相似,只是增加了一些特性。每个{if}必须有一个配对的{/if}.也可以使用{else}和{elseif}.全部的PHP条件表达式和函数都可以在if内使用,如||,or,&&,and,is_array(),等等.如果开启了安全机制,那么只有在$php_functions设置允许的PHP函数才能使用。

运算符别名语法示例含义对应PHP语法==eq$a eq $b等于==!=ne, neq$a neq $b不等于!=>gt$a gt $b大于><lt$a lt $b小于<>=gte, ge$a ge $b大于等于>=<=lte, le$a le $b小于等于<====
$a === 0绝对等于===!notnot $a非 (一元运算)!%mod$a mod $b取模%is [not] div by
$a is not div by 4取模为0$a % $b == 0is [not] even
$a is not even[非] 取模为0 (一元运算)$a % 2 == 0is [not] even by
$a is not even by $b水平分组 [非] 平均($a / $b) % 2 == 0is [not] odd
$a is not odd[非] 奇数 (一元运算)$a % 2 != 0is [not] odd by
$a is not odd by $b[非] 奇数分组($a / $b) % 2 != 0

{if $name eq 'Fred'}    Welcome Sir.{elseif $name eq 'Wilma'}    Welcome Ma'am.{else}    Welcome, whatever you are.{/if}{* an example with "or" logic *}{if $name eq 'Fred' or $name eq 'Wilma'}   ...{/if}{* same as above *}{if $name == 'Fred' || $name == 'Wilma'}   ...{/if}{* parenthesis are allowed *}{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}   ...{/if}{* you can also embed php function calls *}{if count($var) gt 0}   ...{/if}{* check for array. *}{if is_array($foo) }   .....{/if}{* check for not null. *}{if isset($foo) }   .....{/if}{* test if values are even or odd *}{if $var is even}   ...{/if}{if $var is odd}   ...{/if}{if $var is not odd}   ...{/if}{* test if var is divisible by 4 *}{if $var is div by 4}   ...{/if}{*  test if var is even, grouped by two. i.e.,  0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, etc.*}{if $var is even by 2}   ...{/if}{* 0=even, 1=even, 2=even, 3=odd, 4=odd, 5=odd, etc. *}{if $var is even by 3}   ...{/if}

{foreach},{foreachelse}

{foreach}用于循环数组。 {foreach}的语法比{section}循环要更简单和清晰,并且可以使用非数字下标的数组。
{foreach $arrayvar as $itemvar}
{foreach $arrayvar as $keyvar=>$itemvar}
{foreach} 循环可以被嵌套使用.
array变量,一般是数组的值,决定了{foreach} 循环的次数。你也可以传递一个任意的整数来控制循环次数。
如果array数组变量中,没有值的情况下, {foreachelse}将执行。
{foreach}的属性: @index, @iteration, @first, @last, @show, @total.
{foreach}的语法命令: {break}, {continue}.
代替指定key变量,你可以通过 {$item@key}来使用循环的当前key。(见下面的例子).

使用key变量的例子

<?php$people = array('fname' => 'John', 'lname' => 'Doe', 'email' => 'j.doe@example.com');$smarty->assign('myPeople', $people);?>
模板将以键值对的方式输出$myArray

<ul>{foreach $myPeople as $value}   <li>{$value@key}: {$value}</li>{/foreach}</ul>
输出:

<ul>    <li>fname: John</li>    <li>lname: Doe</li>    <li>email: j.doe@example.com</li></ul>


2.5 成员方法

addConfigDir() — 增加一个配置文件目录addPluginsDir() — 增加一个插件目录addTemplateDir() — 增加一个模板文件目录append() — 把值追加到数组。appendByRef() — 引用追加assign() — 赋值assignByRef() — 引用赋值clearAllAssign() — 清除全部赋值clearAllCache() — 清除全部缓存clearAssign() — 清除赋值clearCache() — 清除缓存clearCompiledTemplate() — 清除模板编译文件clearConfig() — 清除配置compileAllConfig() — 编译全部配置文件compileAllTemplates() — 编译全部模板configLoad() — 载入预配置的变量createData() — 创建数据对象createTemplate() — 创建模板对象disableSecurity() — 关闭安全检查display() — 显示enableSecurity() — 开启安全检查fetch() — 取得输出内容getCacheDir() — 取得缓存目录getCompileDir() — 取得编译目录getConfigDir() — 取得配置文件目录getConfigVars() — 取得预配置变量getPluginsDir() — 取得插件目录getRegisteredObject() — 获取已注册对象getTags() — 取得模板标签getTemplateDir() — 取得模板目录getTemplateVars() — 取得变量值isCached() — 检查模板是否已经缓存loadFilter() — 载入过滤插件Smarty::muteExpectedErrors() — 忽略脚本警告信息registerCacheResource() — 注册缓存资源registerClass() — 注册类registerDefaultPluginHandler() — 注册默认插件处理器registerFilter() — 注册过滤器registerPlugin() — 注册插件registerObject() — 注册对象registerResource() — 注册资源setCacheDir() — 设置缓存目录setCompileDir() — 设置编译目录setConfigDir() — 设置配置目录setPluginsDir() — 设置插件目录setTemplateDir() — 设置模板目录templateExists() — 检查模板是否存在unregisterCacheResource() — 注销缓存资源unregisterFilter() — 注销过滤器unregisterPlugin — 注销插件unregisterObject() — 注销对象unregisterResource() — 注销资源testInstall() — 测试Smarty安装


参考文档:

http://www.smarty.net/docs/zh_CN/

0 0
原创粉丝点击